[vtkusers] vtkAssembly : restore postion and rotation stored in quaterion ?

Ashika Umanga Umagiliya aumanga at biggjapan.com
Thu Jan 12 21:45:39 EST 2012


Greetings all,

In my application ,I want to store status of my actor (vtkAssembly
consisting several vtkActors).
I need to store the rotation as a quaternion.

Here is the code snippet how I store the status :

void captureAssemblyStatus()
{

  CaptureInfo capinfo;  //struct to keep the status
  double m[3][3];
  double quat[4];
  double pos[3];

 //get the rotation matrix in a 3x3 matrix
 vtkMatrix4x4 *mat=assembly->GetMatrix(); //assembly is a vtkAssembly
  for (int i=0; i<=2; i++)
   for (int j=0; j<=2; j++)
     m[j][i] = mat->GetElement(j,i);

  //store the rotation in a quaterion
  vtkMath::Matrix3x3ToQuaternion(m, quat);
   assembly->GetPosition(pos);

   capinfo.qw=quat[0]; //quaternion w
   capinfo.qx=quat[1];; //quaternion x
   capinfo.qy=quat[2];; //quaternion y
   capinfo.qz=quat[3];; //quaternion z
   capinfo.x=pos[0]; //postion x
   capinfo.y=pos[1]; //postion y
   capinfo.z=pos[2]; //postion z

}


And here's how  I am trying to restore the status :

void restoreStatus(CaptureInfo &cap)
{
  double qw=cap.qw;
  double qx=cap.qx;
  double qy=cap.qy;
  double qz=cap.qz;

  //Restore the postion
  assembly->SetPosition(cap.x,cap.y,cap.z);

 //Restore the rotation
 double scale=sqrt(qx*qx + qy*qy + qz*qz);
 double angle=2*acos(qw);
 double ax=qx/scale;
 double ay=qy/scale;
 double az=qz/scale;

 assembly->RotateWXYZ(angle,ax,ay,az);

this->qtWidget->update();

}


But this does work correct.
Even when I commentout the rotation part,the position restore doesnt work well.

What am I doing wrong here ?

Thanks in advance



More information about the vtkusers mailing list