Avoid use of quaternions, simplify rescue animation. Heading is currently

unchanged, but it looks ok-ish.
This commit is contained in:
hiker 2014-07-23 08:02:13 +10:00
parent 20603a2084
commit 6c02849df3
2 changed files with 29 additions and 28 deletions

View File

@ -90,15 +90,23 @@ public:
m_transform.setOrigin(a); m_transform.setOrigin(a);
if(m_motion_state) if(m_motion_state)
m_motion_state->setWorldTransform(m_transform); m_motion_state->setWorldTransform(m_transform);
} } // setXYZ
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
/** Sets the rotation of this moveable. */ /** Sets the rotation of the physical body this moveable. */
void setRotation(const btQuaternion&a) void setRotation(const btMatrix3x3 &m)
{ {
m_transform.setRotation(a); m_transform.setBasis(m);
if(m_motion_state) if(m_motion_state)
m_motion_state->setWorldTransform(m_transform); m_motion_state->setWorldTransform(m_transform);
} } // setRotation(btMatrix3x3)
// ------------------------------------------------------------------------
/** Sets the rotation of the physical body this moveable. */
void setRotation(const btQuaternion &q)
{
m_transform.setRotation(q);
if(m_motion_state)
m_motion_state->setWorldTransform(m_transform);
} // setRotation(btQuaternion)
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
virtual void updateGraphics(float dt, const Vec3& off_xyz, virtual void updateGraphics(float dt, const Vec3& off_xyz,
const btQuaternion& off_rotation); const btQuaternion& off_rotation);

View File

@ -45,27 +45,20 @@ RescueAnimation::RescueAnimation(AbstractKart *kart, bool is_auto_rescue)
m_kart->getAttachment()->clear(); m_kart->getAttachment()->clear();
// We get the final transform of the kart so that it is rotated // Get the current rotation of the kart
// accordingly during the rescue animation m_curr_rotation = m_kart->getNode()->getRotation() * DEGREE_TO_RAD;
World * world = World::getWorld();
unsigned int index = world->getRescuePositionIndex(m_kart);
btTransform t = world->getRescueTransform(index);
Vec3 up = t.getBasis().getColumn(1);
float target_pitch = atan2(up.getZ(), fabsf(up.getY()));
float target_roll = atan2(up.getX(), up.getY());
// Determine the rotation that will rotate the kart from the current
// up direction to the right up direction it should have according to
// the normal at the kart's location
Vec3 up = m_kart->getTrans().getBasis().getColumn(1);
btQuaternion q = shortestArcQuat(up, m_kart->getNormal());
m_curr_rotation.setPitch(m_kart->getPitch()); // Store this rotation as 'delta HPR', which is added over time to the
m_curr_rotation.setRoll(m_kart->getRoll()); // current rotation to end up (after m_timer seconds) with the right up
m_curr_rotation.setHeading(0); // rotation
m_add_rotation.setHPR(q);
Vec3 required_rotation; m_add_rotation /= m_timer;
required_rotation.setPitch(target_pitch - m_kart->getPitch());
required_rotation.setRoll(target_roll - m_kart->getRoll());
required_rotation.setHeading(0);
m_add_rotation = -required_rotation/m_timer;
m_curr_rotation.setHeading(m_kart->getHeading());
// Add a hit unless it was auto-rescue // Add a hit unless it was auto-rescue
if(race_manager->getMinorMode()==RaceManager::MINOR_MODE_3_STRIKES && if(race_manager->getMinorMode()==RaceManager::MINOR_MODE_3_STRIKES &&
@ -112,13 +105,13 @@ RescueAnimation::~RescueAnimation()
*/ */
void RescueAnimation::update(float dt) void RescueAnimation::update(float dt)
{ {
btQuaternion q1 = m_kart->getTrans().getRotation();
m_xyz += dt*m_velocity * m_kart->getNormal(); m_xyz += dt*m_velocity * m_kart->getNormal();
m_kart->setXYZ(m_xyz); m_kart->setXYZ(m_xyz);
m_curr_rotation += dt*m_add_rotation; m_curr_rotation += dt*m_add_rotation;
btQuaternion q(m_curr_rotation.getHeading(), m_curr_rotation.getPitch(), btMatrix3x3 m;
m.setEulerZYX(m_curr_rotation.getPitch(), m_curr_rotation.getHeading(),
m_curr_rotation.getRoll()); m_curr_rotation.getRoll());
m_kart->setRotation(q); m_kart->setRotation(m);
AbstractKartAnimation::update(dt); AbstractKartAnimation::update(dt);