간단히 올려본 Ninja 캐릭터.
3DMAX와 동일한 카메라 컨트롤을 적용하였는데
이렇게 하려면 카메라 하나만가지고는 힘들고 노드를 두개 추가해야 한다.
먼제 중앙에 루트노드를 만들고,
자식으로 노드 하나를 더 만든다.
그리고 카메라는 자식노드에 붙인다.(attach)
이동시에는 자식노드를 전진,후진,좌,우로 이동 시켜주고,
회전시에는 루트노드를 x, y 축 기준으로 회전시켜준다.
이동및 회전하는 값은 이전 마우스 포지션과 현재 마우스 포지션의 차를 구해
사용하면 되는데 이 때 offset값을 곱해줘서 사용하면 움직임 범위를 쉽게 조절할 수 있다.
이동은 단순히 x,y,z축으로 좌표를 더해주기면 하면 되었는데
회전은 x축과 y축을 구분하여 작성해줘야 했다.
x축의 경우 쿼터니온을 하나 만들어서 루트노드의 현재 쿼터니온과 곱해준것을 사용하면 된다.
Ogre::Quaternion quatNode = m_pCameraRootNode->getOrientation();
Ogre::Quaternion quatRotate(Ogre::Radian(Ogre::Degree(-fRotationDelta)),Ogre::Vector3(1,0,0));
quatNode = quatNode * quatRotate;
m_pCameraRootNode->setOrientation(quatNode);
y축의 경우 쿼터니온을 사용하지 않고 노드의 rotate라는 함수를 사용하였다.
m_pCameraRootNode->rotate(Ogre::Vector3(0,1,0),
Ogre::Radian(Ogre::Degree(-fRotationDelta)),
Ogre::Node::TS_WORLD);
마지막 인자를 TS_WORLD로 줘야 3DMAX에서처럼 원하는 회전모양이 나온다.
알쏭달쏭... 알듯모를듯한 3D 프로그래밍.;;