현재 C++ 및 Ogre3D을 사용하여 작성중인 3D 우주 게임에 대해 Bullet Physics Library을 평가 중입니다. 나는 Ogre3D와 Bullet을 btMotionState에서 파생시키고 내 SceneNode를 연결하여 훌륭하게 통합했지만 지금은 달성해야 할 btRigidBody :: applyCentralImpulse 및 btRigidBody :: applyTorqueImpulse 메서드에 전달해야하는 값을 계산하는 데 많은 어려움을 겪고 있습니다. 내가 찾고있는 결과들.Bullet Physics - 신체의 로컬 공간에 토크 임펄스 적용
키보드의 왼쪽 또는 오른쪽 키를 누르면 우주선이 로컬 Z 축을 굴러 가기를 원합니다. UP 또는 DOWN 키를 누르면 로컬 X 축에서 피치를 지정합니다. A 또는 Z를 누르면 로컬 Z 축의 방향으로 가속/감속합니다. 저는 Ogre에서 일부 쿼터니언 수학을 사용하고 SceneNode에서 직접 translate/rotate를 적용 할 수 있습니다.하지만 Force/Torque 메서드를 사용하여 Bullet 엔진에이 값을 적용하여 피치/롤 이동을 계속합니다. 사용자가 키를 누르지 않아도 오브젝트가 마찰을 일으켜 필요한만큼 속도를 늦 춥니 다.
임펄스가 세계의 축을 사용하는 대신 본체의 현재 방향을 기반으로 작동하도록하기 위해이 두 가지 임펄스 방법에 필요한 값을 계산하려면 어떻게해야합니까?
감사합니다, 마크
업데이트 :
나는 진퇴에 필요한 충동을 해결 할 수 있었다, 그러나 나는 여전히 요/피치/롤 값을 재교육하는 방법을 고민하고있다 토크 임펄스 방식과 함께 사용하십시오.
if (mKeyboard->isKeyDown(OIS::KC_A))
mBody->applyCentralImpulse(mBody->getWorldTransform().getBasis().getColumn(2) * 20 * time);
if (mKeyboard->isKeyDown(OIS::KC_Z))
mBody->applyCentralImpulse(mBody->getWorldTransform().getBasis().getColumn(2) * -20 * time);
임펄스 API에 쿼터니언을 전달하거나 쿼터니언을 전달할 수있는 것으로 변환 할 수 있습니까? – fbrereto
API에서 볼 수 있듯이 선형 임펄스 방법은 월드 좌표에서 방향의 x, y, z 벡터 만 받아 들일 수 있으며 각도 임펄스 방법은 yaw에 대해 y, p, r 벡터 만 허용하며, 피치 (pitch), 롤 (roll) 등이있다. 수학은 약간 머리가 맞을 수 있지만 (점과 십자가 같은 것을 시각화하는 데는 어려움이 있습니다), 실제 Bullet API 자체는 내 머리 위로 완전히 새로운 것입니다 ...이 둘의 결합으로 인해 지금 불가능한 삶. – Lusid