$search
00001 00002 #include <blort/TomGine/tgPose.h> 00003 00004 #include <stdio.h> 00005 00006 #ifdef WIN32 00007 #include <GL/glew.h> 00008 #include <GL/gl.h> 00009 #include <GL/glu.h> 00010 #else 00011 #include <GL/gl.h> 00012 #include <GL/glu.h> 00013 #include <GL/glext.h> 00014 #endif 00015 00016 using namespace TomGine; 00017 00018 tgPose tgPose::operator*(const tgPose& p) const{ 00019 tgPose ret; 00020 mat3 R, pR, rR; 00021 vec3 t, pt, rt; 00022 00023 this->GetPose(R,t); 00024 p.GetPose(pR, pt); 00025 00026 rR = R * pR; 00027 rt = (R * pt) + t; 00028 00029 ret.SetPose(rR, rt); 00030 return ret; 00031 } 00032 00033 vec3 tgPose::operator*(const vec3& pt) const{ 00034 vec3 ret; 00035 mat3 R; 00036 vec3 t; 00037 00038 this->GetPose(R,t); 00039 00040 ret = (R * pt) + t; 00041 00042 return ret; 00043 } 00044 00045 tgPose tgPose::operator+(const tgPose &p) const{ 00046 tgPose res; 00047 res.t = t - p.t; 00048 res.q = q - p.q; 00049 return res; 00050 } 00051 00052 tgPose tgPose::operator-(const tgPose &p) const{ 00053 tgPose res; 00054 res.t = t - p.t; 00055 res.q = q - p.q; 00056 return res; 00057 } 00058 00059 tgPose tgPose::Transpose() const{ 00060 tgPose ret; 00061 mat3 R; 00062 vec3 t; 00063 GetPose(R,t); 00064 00065 R = R.transpose(); 00066 t = t; 00067 00068 ret.SetPose(R,t); 00069 return ret; 00070 } 00071 00072 void tgPose::Activate() const { 00073 glPushMatrix(); 00074 glTranslatef(t.x, t.y, t.z); 00075 glMultMatrixf(q.getMatrix4()); 00076 } 00077 00078 void tgPose::Deactivate() const { 00079 glPopMatrix(); 00080 } 00081 00082 void tgPose::PrintHeader() const{ 00083 printf("tx ty tz qx qy qz qw\n"); 00084 } 00085 00086 void tgPose::Print() const { 00087 printf("%f %f %f %f %f %f %f\n", t.x, t.y, t.z, q.x, q.y, q.z, q.w); 00088 } 00089 00090 void tgPose::SetPose(mat3 rot, vec3 pos){ 00091 q.fromMatrix(rot); 00092 q.normalise(); 00093 00094 t.x = pos.x; 00095 t.y = pos.y; 00096 t.z = pos.z; 00097 } 00098 00099 void tgPose::GetPose(mat3 &rot, vec3 &pos) const { 00100 00101 rot = q.getMatrix3(); 00102 00103 pos.x = t.x; 00104 pos.y = t.y; 00105 pos.z = t.z; 00106 } 00107 00108 void tgPose::Rotate(float x, float y, float z){ 00109 if(x==0.0 && y==0.0 && z ==0.0) 00110 return; 00111 00112 tgQuaternion q2; 00113 00114 q2.fromEuler(x,y,z); 00115 q = q2 * q; 00116 q.normalise(); 00117 } 00118 00119 void tgPose::RotateAxis(vec3 rot){ 00120 // tgQuaternion q2; 00121 // q2.fromEuler(rot.x,rot.y,rot.z); 00122 // q = q2 * q; 00123 // q.normalise(); 00124 tgQuaternion q2; 00125 float a = rot.length(); 00126 rot.normalize(); 00127 q2.fromAxis(rot,a); 00128 q = q2 * q; 00129 q.normalise(); 00130 } 00131 00132 void tgPose::RotateEuler(vec3 rot){ 00133 tgQuaternion q2; 00134 q2.fromEuler(rot.x,rot.y,rot.z); 00135 q = q2 * q; 00136 q.normalise(); 00137 } 00138 00139 void tgPose::Translate(float x, float y, float z){ 00140 t.x = t.x + x; 00141 t.y = t.y + y; 00142 t.z = t.z + z; 00143 } 00144 00145 void tgPose::Translate(vec3 trans){ 00146 t.x = t.x + trans.x; 00147 t.y = t.y + trans.y; 00148 t.z = t.z + trans.z; 00149 }