/*! * \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); }
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; }