Hi,

I'm writing a simple program which uses Kinect to move a puppet made
with OpenSG.
>From Kinect's API I get a Matrix for each Joint which looks like this:

 0.999527    0.0301296   0.00610329
 -0.0286029 0.984236   -0.174532
 -0.0112657 0.174275     0.984633

The determinat of the matrix is 1, the length of each column vector is also 1.
The dot products of the column vectors are close to 0 (around 1 * 10 ^-5).
So I figured it's a rotation matrix.

I found a way to apply this to a Component Transform, and it works,
but I'm not sure it's the best way to do it.

This is the code:

//turn Kinect Matrix into OpenSG Matrix
osg::Matrix makeOsgMatrix(float* kinectMatrix){
   osg::Matrix matrix = osg::Matrix(kinectMatrix[0], kinectMatrix[1],
kinectMatrix[2], 0.0f,
                                    kinectMatrix[3], kinectMatrix[4],
kinectMatrix[5], 0.0f,
                                    kinectMatrix[6], kinectMatrix[7],
kinectMatrix[8], 0.0f,
                                    0.0f,            0.0f,
0.0f,            1.0f);

   return matrix;
}

//rotMat is the Kinect Matrix
void Puppet::setRightUpperArmRot(osg::Matrix rotMat){

   Vec3f from, to;

   //the arm is supposed to be initially horizontal, but i can only
make vertical cones, so I rotate it first.
   from = Vec3f(0.0, -1.0, 0.0);
   to  = Vec3f(1.0, 0.0, 0.0);
   Quaternion quatA(from, to);

   //turn the kinect  matrix into a quaternion and multiply with
initial quaternion
   Quaternion quatB(rotMat);
   quatA.multLeft(quatB);

   //apply final quaternion to ComponentTransform
   beginEditCP(rightUpperArmTransCore);
      rightUpperArmTransCore->setRotation( quatA );
   endEditCP(rightUpperArmTransCore);
}

Is there a faster way to do this? Or do I have to turn the kinect
matrix into a quaternion before applying it to the ComponentTransform?
I have to do it for all the joints 30 times a second, so I want it to be fast.

I would appreciate any comments on this question!

Daniel.

------------------------------------------------------------------------------
Learn how Oracle Real Application Clusters (RAC) One Node allows customers
to consolidate database storage, standardize their database environment, and, 
should the need arise, upgrade to a full multi-node Oracle RAC database 
without downtime or disruption
http://p.sf.net/sfu/oracle-sfdevnl
_______________________________________________
Opensg-users mailing list
Opensg-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensg-users

Reply via email to