<aside>
</aside>
getWorldPositon()
: object의 월드 포지션 좌표를 받아와 ( )에 부여한다.
getWorldQuaternion()
: object의 월드 퀀터니언 좌표를 받아와 ( )에 부여한다.
setRotationFromQuaternion()
: 퀀터니언에 받아온 로테이션 좌표를 넣어준다.
geometry.computeBoundingBox()
: 바운딩박스를 만들고 접근하기 위해 사용한다? (도형에 네모 테두리를 넣는다.)
geometry.boundingBox.getCenter()
: 바운딩박스를 기준으로 정가운데 좌표를 가져온다.
Vector3.divideScalar() : 벡터3들의 좌표를
Quaterion.multiply()
Quaterion.premultiply()
useEffect(() => {
if (clickedChuckInfo.userData && selectRotateChuck) {
const centerCoordinate = new THREE.Vector3();
clickedChuckInfo.geometry.computeBoundingBox();
clickedChuckInfo.geometry.boundingBox.getCenter(centerCoordinate);
// 바운딩박스에서 정가운데 좌표를 받아온 후 그것을 월드 좌표로 바꿔준다.
clickedChuckInfo.localToWorld(centerCoordinate);
// add로 추가하여 백터값을 임의로 조절할 수 있다.
const adjustVector = new THREE.Vector3(0, 0, 0);
const centerAxis = new THREE.Vector3()
.copy(centerCoordinate)
.add(adjustVector);
setCustomAxis(centerAxis.normalize());
}
}, [clickedChuckInfo, selectRotateChuck]);
<aside>
</aside>
// 백터 값으로 충돌 범위를 감지함
const collisionCheck = (groupRefA, groupRefB, minDistance) => {
const collisionObjectA = groupRefA.current.children;
const collisionObjectB = groupRefB.current.children;
for (let i = 0; i < collisionObjectA.length; i++) {
for (let j = i + 1; j < collisionObjectB.length; j++) {
const objectA = new THREE.Vector3().setFromMatrixPosition(
collisionObjectA[i].matrixWorld
);
const objectB = new THREE.Vector3().setFromMatrixPosition(
collisionObjectB[j].matrixWorld
);
if (objectA.distanceTo(objectB) < minDistance) {
console.log("충돌 감지");
return true;
}
}
}
return false;
};
// useFrame에 들어가는 코드
else if (
!stopTriggerRef.current &&
rotationAngle !== 0 &&
customAxis &&
Math.abs(currentRotationAngleRef.current - rotationAngle) <= 0.01 &&
collisionCheck
) {
const minDistance = 0.5;
if (collisionCheck(rotateGroupRef, nonRotateGroupRef)) {
alert("충돌!!임풱");
setRotationAngle((prevAngle) => prevAngle - 90 * CONSTANTS.DEGREE);
}
<aside>
</aside>