示例#1
0
文件: tracks.c 项目: refnum/quesa
/*!
 * \ingroup tracks 
 */
Lib3dsBool
lib3ds_quat_track_read(Lib3dsQuatTrack *track, Lib3dsIo *io)
{
  int keys;
  int i,j;
  Lib3dsQuatKey *p,*k;

  track->flags=lib3ds_io_read_word(io);
  lib3ds_io_read_dword(io);
  lib3ds_io_read_dword(io);
  keys=lib3ds_io_read_intd(io);

  for (p=0,i=0; i<keys; p=k,++i) {
    k=lib3ds_quat_key_new();
    if (!lib3ds_tcb_read(&k->tcb, io)) {
      return(LIB3DS_FALSE);
    }
    k->angle=lib3ds_io_read_float(io);
    for (j=0; j<3; ++j) {
      k->axis[j]=lib3ds_io_read_float(io);
    }
    lib3ds_quat_track_insert(track, k);
  }
  lib3ds_quat_track_setup(track);
  return(LIB3DS_TRUE);
}
示例#2
0
void GLC_WorldTo3ds::setNodePosition(Lib3dsNode* pNode, const GLC_Matrix4x4& matrix)
{
	Lib3dsObjectData *pObjectData= &pNode->data.object;

	GLC_Matrix4x4 isoMatrix(matrix.isometricMatrix());
	// Translation
	Lib3dsLin3Key* pLin3Key= lib3ds_lin3_key_new();
	pLin3Key->value[0]= isoMatrix.getData()[12];
	pLin3Key->value[1]= isoMatrix.getData()[13];
	pLin3Key->value[2]= isoMatrix.getData()[14];

	pLin3Key->tcb.frame= 1;
	pObjectData->pos_track.keyL= pLin3Key;


	// Scaling
	Lib3dsLin3Key* pScale3Key= lib3ds_lin3_key_new();
	pScale3Key->value[0]= static_cast<float>(matrix.scalingX());
	pScale3Key->value[1]= static_cast<float>(matrix.scalingY());
	pScale3Key->value[2]= static_cast<float>(matrix.scalingZ());

	pScale3Key->tcb.frame= 1;
	pObjectData->scl_track.keyL= pScale3Key;

	// Rotation

	Lib3dsQuatKey* pQuatKey= lib3ds_quat_key_new();

	QQuaternion quaternion= matrix.quaternion();
	QPair<GLC_Vector3d, double> pair= matrix.rotationVectorAndAngle();

	pQuatKey->angle= static_cast<float>(pair.second);
	pQuatKey->axis[0]= static_cast<float>(pair.first.x());
	pQuatKey->axis[1]= static_cast<float>(pair.first.y());
	pQuatKey->axis[2]= static_cast<float>(pair.first.z());

	pQuatKey->tcb.frame= 1;

	pObjectData->rot_track.keyL= pQuatKey;

}