From: <axl...@us...> - 2009-05-31 14:26:37
|
Revision: 293 http://hgengine.svn.sourceforge.net/hgengine/?rev=293&view=rev Author: axlecrusher Date: 2009-05-31 14:26:36 +0000 (Sun, 31 May 2009) Log Message: ----------- quaternion has to be rebuilt each time to prevent unintended roll Modified Paths: -------------- Mercury2/src/Camera.cpp Mercury2/src/Camera.h Modified: Mercury2/src/Camera.cpp =================================================================== --- Mercury2/src/Camera.cpp 2009-05-31 04:56:37 UTC (rev 292) +++ Mercury2/src/Camera.cpp 2009-05-31 14:26:36 UTC (rev 293) @@ -5,11 +5,9 @@ REGISTER_NODE_TYPE(CameraNode); CameraNode::CameraNode() - :TransformNode() + :TransformNode(), m_x(0), m_y(0) { REGISTER_FOR_MESSAGE( INPUTEVENT_MOUSE ); - - REGISTER_FOR_MESSAGE( INPUTEVENT_KEYBOARD ); } void CameraNode::ComputeMatrix() @@ -19,12 +17,11 @@ MercuryMatrix local; MQuaternion r( GetRotation().normalize() ); - - m_lookAt = MercuryVector(0,0,1); + + m_lookAt = MercuryVector(0,0,-1); //by default camera looks down world Z m_lookAt = m_lookAt.Rotate( r ); m_lookAt.NormalizeSelf(); -// m_lookAt.Print(); - + r[MQuaternion::W] *= -1; //reverse angle for camera r.toMatrix4( local ); @@ -39,12 +36,16 @@ { MouseInput* m = (MouseInput*)data; - MQuaternion qx = MQuaternion::CreateFromAxisAngle(MercuryVector(1,0,0), m->dy/1200.0f); - MQuaternion qy = MQuaternion::CreateFromAxisAngle(MercuryVector(0,1,0), m->dx/1200.0f); + m_y += m->dy/1200.0f; + m_x += m->dx/1200.0f; - MQuaternion rot = GetRotation(); - rot = rot * qx * qy; - SetRotation(rot); + MercuryVector Xaxis = m_lookAt.CrossProduct( MercuryVector(0,1,0) ); + Xaxis.NormalizeSelf(); + + MQuaternion qx = MQuaternion::CreateFromAxisAngle(Xaxis, m_y); + MQuaternion qy = MQuaternion::CreateFromAxisAngle(MercuryVector(0,1,0), m_x); + + SetRotation(qx * qy); } } @@ -53,10 +54,11 @@ MercuryVector p = GetPosition(); float a = 0; - if ( KeyboardInput::IsKeyDown(25) ) a -= dTime*2; - if ( KeyboardInput::IsKeyDown(39) ) a += dTime*2; + if ( KeyboardInput::IsKeyDown(25) ) a += dTime*2; + if ( KeyboardInput::IsKeyDown(39) ) a -= dTime*2; p += m_lookAt * a; +// p.SetY(0); //lock to ground SetPosition( p ); TransformNode::Update( dTime ); Modified: Mercury2/src/Camera.h =================================================================== --- Mercury2/src/Camera.h 2009-05-31 04:56:37 UTC (rev 292) +++ Mercury2/src/Camera.h 2009-05-31 14:26:36 UTC (rev 293) @@ -15,6 +15,7 @@ GENRTTI(CameraNode); private: MercuryVector m_lookAt; + float m_x, m_y; }; #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |