void TransformWriter::add_node_transform_ob(COLLADASW::Node& node, Object *ob) { float rot[3], loc[3], scale[3]; if (ob->parent) { float C[4][4], tmat[4][4], imat[4][4], mat[4][4]; // factor out scale from obmat copy_v3_v3(scale, ob->size); ob->size[0] = ob->size[1] = ob->size[2] = 1.0f; object_to_mat4(ob, C); copy_v3_v3(ob->size, scale); mul_serie_m4(tmat, ob->parent->obmat, ob->parentinv, C, NULL, NULL, NULL, NULL, NULL); // calculate local mat invert_m4_m4(imat, ob->parent->obmat); mul_m4_m4m4(mat, tmat, imat); // done mat4_to_eul(rot, mat); copy_v3_v3(loc, mat[3]); } else { copy_v3_v3(loc, ob->loc); copy_v3_v3(rot, ob->rot); copy_v3_v3(scale, ob->size); } add_transform(node, loc, rot, scale); }
void TransformWriter::add_node_transform_ob(COLLADASW::Node& node, Object *ob) { #if 0 float rot[3], loc[3], scale[3]; if (ob->parent) { float C[4][4], tmat[4][4], imat[4][4], mat[4][4]; // factor out scale from obmat copy_v3_v3(scale, ob->size); ob->size[0] = ob->size[1] = ob->size[2] = 1.0f; BKE_object_to_mat4(ob, C); copy_v3_v3(ob->size, scale); mul_serie_m4(tmat, ob->parent->obmat, ob->parentinv, C, NULL, NULL, NULL, NULL, NULL); // calculate local mat invert_m4_m4(imat, ob->parent->obmat); mult_m4_m4m4(mat, imat, tmat); // done mat4_to_eul(rot, mat); copy_v3_v3(loc, mat[3]); } else { copy_v3_v3(loc, ob->loc); copy_v3_v3(rot, ob->rot); copy_v3_v3(scale, ob->size); } add_transform(node, loc, rot, scale); #endif /* Using parentinv should allow use of existing curves */ if (ob->parent) { // If parentinv is identity don't add it. bool add_parinv = false; for (int i = 0; i < 16; ++i) { float f = (i % 4 == i / 4) ? 1.0f : 0.0f; add_parinv |= (ob->parentinv[i % 4][i / 4] != f); } if (add_parinv) { double dmat[4][4]; UnitConverter converter; converter.mat4_to_dae_double(dmat, ob->parentinv); node.addMatrix("parentinverse", dmat); } } add_transform(node, ob->loc, ob->rot, ob->size); }
void TransformBase::decompose(float mat[4][4], float *loc, float eul[3], float quat[4], float *size) { mat4_to_size(size, mat); if (eul) { mat4_to_eul(eul, mat); } if (quat) { mat4_to_quat(quat, mat); } copy_v3_v3(loc, mat[3]); }
void AnimationExporter::sample_animation(float *v, std::vector<float> &frames, int type, Bone *bone, Object *ob_arm, bPoseChannel *pchan) { bPoseChannel *parchan = NULL; bPose *pose = ob_arm->pose; pchan = BKE_pose_channel_find_name(pose, bone->name); if (!pchan) return; parchan = pchan->parent; enable_fcurves(ob_arm->adt->action, bone->name); std::vector<float>::iterator it; for (it = frames.begin(); it != frames.end(); it++) { float mat[4][4], ipar[4][4]; float ctime = BKE_scene_frame_get_from_ctime(scene, *it); BKE_animsys_evaluate_animdata(scene, &ob_arm->id, ob_arm->adt, ctime, ADT_RECALC_ANIM); BKE_pose_where_is_bone(scene, ob_arm, pchan, ctime, 1); // compute bone local mat if (bone->parent) { invert_m4_m4(ipar, parchan->pose_mat); mult_m4_m4m4(mat, ipar, pchan->pose_mat); } else copy_m4_m4(mat, pchan->pose_mat); switch (type) { case 0: mat4_to_eul(v, mat); break; case 1: mat4_to_size(v, mat); break; case 2: copy_v3_v3(v, mat[3]); break; } v += 3; } enable_fcurves(ob_arm->adt->action, NULL); }
void KX_BlenderSceneConverter::resetNoneDynamicObjectToIpo() { if (addInitFromFrame) { KX_SceneList* scenes = m_ketsjiEngine->CurrentScenes(); int numScenes = scenes->size(); if (numScenes>=0) { KX_Scene* scene = scenes->at(0); CListValue* parentList = scene->GetRootParentList(); for (int ix=0;ix<parentList->GetCount();ix++) { KX_GameObject* gameobj = (KX_GameObject*)parentList->GetValue(ix); if (!gameobj->IsDynamic()) { Object* blenderobject = gameobj->GetBlenderObject(); if (!blenderobject) continue; if (blenderobject->type==OB_ARMATURE) continue; float eu[3]; mat4_to_eul(eu,blenderobject->obmat); MT_Point3 pos = MT_Point3( blenderobject->obmat[3][0], blenderobject->obmat[3][1], blenderobject->obmat[3][2] ); MT_Vector3 eulxyz = MT_Vector3( eu[0], eu[1], eu[2] ); MT_Vector3 scale = MT_Vector3( blenderobject->size[0], blenderobject->size[1], blenderobject->size[2] ); gameobj->NodeSetLocalPosition(pos); gameobj->NodeSetLocalOrientation(MT_Matrix3x3(eulxyz)); gameobj->NodeSetLocalScale(scale); gameobj->NodeUpdateGS(0); } } } } }