Go to the documentation of this file.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
00121
00122
00123
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 }