Ogre + Bullet rotation

Post Reply
konri100
Posts: 3
Joined: Sun Aug 25, 2013 10:44 pm

Ogre + Bullet rotation

Post by konri100 »

I'm trying to make a character controlller and i've got problem with rotation. If i do it this way:

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);
}
then it looks like rotation of the mesh is kinda inverted, i mean forward is forward, backward is backward, but left is right and right is left.

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)));
}
then it works, but i'm not sure if it's supposed to be like this

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]));
Post Reply