-
[Three.JS] Transform (Scale, Position, Rotate) 과 Quarternion, lookat카테고리 없음 2023. 12. 27. 10:58728x90반응형//Scalemesh.scale.x =2mesh.scale.y=0.5mesh.scale.z=0.5
오브젝트의 크기를 조절하는것 scale
이렇게하거나
mesh.scale.set(2,0.5,0.5)이렇게 한번에 set으로 한줄로 설정해도됨
x는 좌우로움직이고 y는 위아래로 z는 앞뒤로움직임.
뭔가 ㅇㄹㄷㅅ 때 움직이는 그 좌표값이네..?
블렌더는 z가 위아래, y가 앞뒤인것이 다르다
하지만 이것은 직접 설정해서 바꿀수있다고함 뭐야 더어렵자나요.. 그냥 외울래요..
mesh.position.x=0.7mesh.position.y=-0.6mesh.position.z=1포지션역시 이렇게하거나
mesh.position.set(0.7, -0.6, 1)이렇게 둘다가능한~~
로테이션은
PI를 응용할수있다
파이 = 3.141592... 이런수
PI값이 180도? 반 회전이라고 보면됨
반의 반 회전 (4분의1) 하고싶다면 pi/2
한바퀴 완전히 돌리고싶다 -? PI*2
//Rotationmesh.rotation.x =Math.PI*0.25mesh.rotation.y = Math.PI*0.250.25는 4분의 1임 그러니 PI의 4분의1-> 반의 반 회전임 (90도)
결과는
여기서 문제는 이 로테이션의 축이 계속 오브젝트의 방향에 따라 변화한다는것
마치 블렌더의 object transform 과 같은 그런것일까
x로테이션을 해버리면
이후 y로테이션이 변한 로테이션값에 영향을 받아 같이 변한다고함
그렇다면어떻게해야 예상한 값이나올까?
로테이션순서를 신경써서 바꿔줘야한다고함
여기서부터 뭔가 알듯말듯 잘모르겠지만 fps게임을 생각해보자
y를 먼저 바꿔서 머리가 좌우로 돌아가는걸 세팅하고
x를 세팅해서 위아래로 고개가 돌아가는걸 세팅
이것을 어떻게하냐면 Reorder 를 사용해야함
//Rotationmesh.rotation.reorder('YXZ')mesh.rotation.x = Math.PI*0.25mesh.rotation.y = Math.PI*0.25reorder가 적용된모습
아무튼 이렇게 리오더ㅗ를한다고해도
넘헷갈림
그래서 사용하는것이 Quaternion임
Euler(xyz방식)이 이해하긴쉽지만 three.js상에서는 이렇게 헷갈릴일이 많음
그래서 quaternion을 씀! 쿼테이션은 결과값을 예측하기가 어렵지만 문제가 적다는 장점이있음
쿼테이션과 로테이션은 서로 상호작용을해서
쿼테이션값이 바뀌면 로테이션값도 그에 맞춰 변함 로테이션값이 변하면 쿼테이션값도 변함
그러니 쿼테이션의 방식을 완벽히 이해를 할 필요는없다고함?
lookat
카메라가 오브젝트의 센터를 바라보게 할수 있는 명령어
로테이션을 힘들게 계산하고 고민할필요없이 걍 카메라가 오브젝트를 딱 보게 하는것임
* Camera*/const camera = new THREE.PerspectiveCamera(75, sizes.width / sizes.height)camera.position.z=3scene.add(camera)camera.lookAt(mesh.position)기존에 만들어져있던 카메라 (z방향 으로 3 만큼 떨어져있던) 에다가
camera.lookat() 명령어를 추가함
괄호안에 mesh.position은 저 빨간 길쭉 네모의 위치를 말한것임
앞으로 매우 유용하게 쓰일것이라고함
728x90