Code: Select all
for(list<btRigidBody*>::iterator It = Objects.begin(); It != Objects.end(); ++It)
{
Ogre::SceneNode* node = static_cast<Ogre::SceneNode*>((*It)->getUserPointer());
btVector3 Point = (*It)->getCenterOfMassPosition();
node->setPosition(Ogre::Vector3((float)Point[0], (float)Point[1], (float)Point[2]));
btQuaternion btq = (*It)->getOrientation();
Ogre::Quaternion quart = Ogre::Quaternion(btq.w(),btq.x(),btq.y(),btq.z());
node->setOrientation(quart);
}
If i do it this way:
Code: Select all
if(left || right)
{
xform.setRotation(btQuaternion(btVector3(0.0, 1.0, 0.0), turnAngle));
Ogre::SceneNode* node = static_cast<Ogre::SceneNode*>(body->getUserPointer());
node->setOrientation(Ogre::Quaternion(-(Ogre::Radian)turnAngle, Ogre::Vector3(0.0, 1.0, 0.0)));
}
some more code if it is necessery:
Code: Select all
void KinematicCharacterControl::playerStep(btScalar delta, bool forward, bool backward, bool left, bool right, bool jump)
{
preStep();
btTransform xform;
xform = body->getWorldTransform();
body->activate(true);
/* Handle turning */
if(left)
{std::cout << "left" << std::endl;
turnAngle += delta * turnVelocity;
}
if(right)
{std::cout << "right" << std::endl;
turnAngle -= delta * turnVelocity;
}
if(left || right)
{
xform.setRotation(btQuaternion(btVector3(0.0, 1.0, 0.0), turnAngle));
Ogre::SceneNode* node = static_cast<Ogre::SceneNode*>(body->getUserPointer());
node->setOrientation(Ogre::Quaternion(-(Ogre::Radian)turnAngle, Ogre::Vector3(0.0, 1.0, 0.0)));
}
body->setWorldTransform(xform);
body->setCenterOfMassTransform(xform);
btVector3 linearVelocity = body->getLinearVelocity();
btScalar speed = body->getLinearVelocity().length();
btVector3 forwardDir = xform.getBasis()[2];
forwardDir.normalize();
btVector3 walkDirection = btVector3(0.0, 0.0, 0.0);
btScalar walkSpeed = walkVelocity * delta;
if(forward)
{
walkDirection += forwardDir;
}
if(backward)
{
walkDirection -= forwardDir;
}
if(jump)
{
this->jump();
}
if(!forward && !backward && onGround())
{
linearVelocity *= btScalar(0.2);
body->setLinearVelocity(linearVelocity);
}
else
{
if(speed < maxLinearVelocity)
{
btVector3 velocity = linearVelocity + walkDirection * walkSpeed;
body->applyCentralImpulse(velocity*10);
}
}
}
//update:
Character->playerStep(DeltaTime* 0.001, forward, backward, left, right, jump);
btTransform xform;
characterBody->getMotionState()->getWorldTransform(xform);
btVector3 pos = xform.getOrigin();
btQuaternion btq = xform.getRotation();
//first way
characterNode->setOrientation(btq.w(),btq.x(),btq.y(),btq.z());
characterNode->setPosition(Ogre::Vector3(pos[0], pos[1], pos[2]));