|
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.
|