diff --git a/apps/openmw/mwmechanics/character.cpp b/apps/openmw/mwmechanics/character.cpp index 29ea723ed..8eb0caf58 100644 --- a/apps/openmw/mwmechanics/character.cpp +++ b/apps/openmw/mwmechanics/character.cpp @@ -183,7 +183,16 @@ Ogre::Vector3 CharacterController::update(float duration) if(duration > 0.0f) { - Ogre::Vector3 pos(mPtr.getRefData().getPosition().pos); + const ESM::Position &refpos = mPtr.getRefData().getPosition(); + + // Rotates first around z, then y, then x + movement = (Ogre::Quaternion(Ogre::Radian(-refpos.rot[0]), Ogre::Vector3::UNIT_X)* + Ogre::Quaternion(Ogre::Radian(-refpos.rot[1]), Ogre::Vector3::UNIT_Y)* + Ogre::Quaternion(Ogre::Radian(-refpos.rot[2]), Ogre::Vector3::UNIT_Z)) * + movement; + + Ogre::Vector3 pos(refpos.pos); + // FIXME: Get the actual radius for the object. Maybe this should go into mwworld to replace pmove? Ogre::Vector3 res = mMovementSolver->move(pos, movement, duration, Ogre::Vector3(15,15,30)); MWBase::Environment::get().getWorld()->moveObject(mPtr, res.x, res.y, res.z); diff --git a/apps/openmw/mwmechanics/movementsolver.cpp b/apps/openmw/mwmechanics/movementsolver.cpp index 219f077e4..a758c76f3 100644 --- a/apps/openmw/mwmechanics/movementsolver.cpp +++ b/apps/openmw/mwmechanics/movementsolver.cpp @@ -9,6 +9,7 @@ namespace MWMechanics MovementSolver::MovementSolver(const MWWorld::Ptr &ptr) : mPtr(ptr) , mEngine(MWBase::Environment::get().getWorld()->getPhysicEngine()) + , verticalVelocity(0.0f) { } @@ -71,11 +72,10 @@ float MovementSolver::getSlope(const Ogre::Vector3 &normal) Ogre::Vector3 MovementSolver::move(const Ogre::Vector3 &position, const Ogre::Vector3 &movement, float time, const Ogre::Vector3 &halfExtents) { - mPhysicActor = mEngine->getCharacter(mPtr.getRefData().getHandle()); - /* Anything to collide with? */ - if(1 || !mPhysicActor || !mPhysicActor->getCollisionMode()) - return position+movement; + mPhysicActor = mEngine->getCharacter(mPtr.getRefData().getHandle()); + if(!mPhysicActor || !mPhysicActor->getCollisionMode()) + return position + movement; traceResults trace; //no initialization needed int iterations=0, maxIterations=50; //arbitrary number. To prevent infinite loops. They shouldn't happen but it's good to be prepared.