|
最近尝试使用bullet的角色控制器来控制fbx人物模型在场景中漫游
主要是为了它的物理效果,比如说跳起,自由降落
经过尝试,已经可以初步控制,使用了btPairCachingGhostObject 和 btKinematicCharacterController
但是在人物旋转后,和物理世界的shape的forward的方向不匹配,比如,按前进按键,人物却朝着左边走,
完全乱了套,
在不旋转的情况下,前后移动和上下跳跃没有问题。
下面是关于左右旋转shape的代码,以及将ghostobject的世界坐标赋给fbx的matrix的代码:
左右旋转shape:
- if (btnLEFT) //A
- {
- float yaw = -0.01f;
- btMatrix3x3 orn = _m_ghostObject->getWorldTransform().getBasis();
- orn *= btMatrix3x3(btQuaternion(btVector3(0,1,0),yaw));
- _m_ghostObject->getWorldTransform().setBasis(orn);
- return true;
- }
- if (btnRIGHT)//D
- {
- float yaw = 0.01f;
- btMatrix3x3 orn = _m_ghostObject->getWorldTransform().getBasis();
- orn *= btMatrix3x3(btQuaternion(btVector3(0,1,0),yaw));
- _m_ghostObject->getWorldTransform().setBasis(orn);
- return true;
- }
复制代码 赋世界坐标:
- _m_trans = _m_ghostObject->getWorldTransform();
- std::cout<<_m_trans.getOrigin().getX()<<" "<<_m_trans.getOrigin().getY()<<" "<<_m_trans.getOrigin().getZ()<<endl;
- std::cout<<_m_trans.getRotation().getX()<<" "<<_m_trans.getRotation().getY()<<" "<<_m_trans.getRotation().getZ()<<" "<<_m_trans.getRotation().getW()<<endl;
- _m_character->setWalkDirection(walkDirection*walkSpeed);
- trans->setMatrix(man_scale*osg::Matrix::rotate(_m_trans.getRotation().getW(),_m_trans.getRotation().getX(),_m_trans.getRotation().getY(),_m_trans.getRotation().getZ())*osg::Matrix::translate(_m_trans.getOrigin().getX(),_m_trans.getOrigin().getY(),_m_trans.getOrigin().getZ()));
复制代码 是不是赋予矩阵变换的时候出了问题?
|
|