2012-04-27 5 views
1

저는 Ogre3D 및 Bullet 물리를 사용하여 구현중인 게임에서 문자 방향 지정과 관련된 문제로 고통 받고 있습니다.Bullet 및 Ogre3D를 사용한 부드러운 회전

내가 가지고있는 것 : 캐릭터가 현재 방향과 함께 움직이는 방향 벡터.

필요한 것 : 캐릭터의 방향을 움직이는 방향으로 설정합니다.

나는 종류의 내가 원하는 것을 수행하는 코드의 조각을 '몸'나는 동양에 노력하고있어 강체이다

btTransform src = body->getCenterOfMassTransform(); 
btVector3 up = BtOgre::Convert::toBullet(Ogre::Vector3::UNIT_X); 
btVector3 normDirection = mDirection.normalized(); 
btScalar angle = acos(up.dot(normDirection)); 
btVector3 axis = up.cross(normDirection); 
src.setRotation(btQuaternion(axis, angle)); 
body->setCenterOfMassTransform(src); 

.

니펫하지만 몇 가지 문제 가지고 방향을 변경할 때

1)는 "지터"경향 그것을 신속하게 배향 그 자체를 보정하기 전에 하나의 방법, 또는 그래서 초 후 반대 대향 즉 에 있어야합니다.

2) 대부분의 시간은 코드 내가 assert(d != btScalar(0.0));

누군가가 도와 드릴까요
에 총알의 btQuaternion에서 어설 션 오류가 실행될 때?

감사합니다.

+0

두 벡터에서 btQuaternion을 구성 할 수 있다고 생각합니다. 처음부터 두 번째로 회전하는 쿼터니언을 제공합니다. 캐릭터의 기본 방향과 원하는 방향을 사용할 경우 필요한 쿼터니언을 얻어야합니다. 지터는 아마도 쿼터니온이 고유하지 않은 회전 (180 ° 대 0 °)이 있기 때문에 발생합니다. – LiMuBei

답변

2

나는 위에서 언급 한 180 대 0 회전과 같이 테두리 상자에 약간의 불일치가 발생할 수 있으므로 'acos'와 같은 함수를 사용하면 안된다고 생각합니다. 또한 이러한 데이터에 대해 높은 수치 오류를 얻을 수 있습니다.

둘째로, 일반적으로 물리 엔진에서 명시적인 위치 및 회전을 설정하지 말고 원하는대로 힘과 토크를 적용하여 몸을 움직 이도록해야합니다. 현재의 접근 방식은 완벽하게 작동하지만 다른 객체를 추가하고 캐릭터가 같은 공간을 차지하도록 강요하면 시뮬레이션이 폭발합니다. 그리고이 단계에서는 그것을 고치는 것이 매우 어렵습니다. 그래서 시작부터 바로하는 것이 좋습니다. :)

올바른 힘/토크를 찾는 것이 까다로울 수 있지만 시뮬레이션을 일관되게 유지하는 가장 좋은 방법입니다.