#include "VMDTool.h" using namespace jbxl; using namespace jbxwl; /* VMD_PARENT ( 0) => none VMD_CENTER ( 1) => NI_PELVIS ( 0) VMD_LOWER ( 2) => none VMD_UPPER ( 3) => NI_TORSO ( 1) VMD_UPPER2 ( 4) => NI_CHEST ( 3) VMD_NECK ( 5) => NI_NECK ( 4) VMD_HEAD ( 6) => NI_HEAD ( 5) VMD_SKULL ( 7) => NI_SKULL ( 6) VMD_EYES ( 8) => none VMD_L_EYE ( 9) => NI_L_EYE ( 7) VMD_R_EYE (10) => NI_R_EYE ( 8) VMD_L_BUST (11) => NI_L_BUST ( 9) VMD_R_BUST (12) => NI_R_BUST (10) VMD_L_SHLDR (13) => NI_L_COLLAR(11) VMD_L_ARM (14) => NI_L_SHLDR (12) VMD_L_ARM_TW (15) => none VMD_L_ELBOW (16) => NI_R_ELBOW (13) VMD_L_WRIST_TW (17) => none VMD_L_WRIST (18) => NI_L_WRIST (14) VMD_L_HAND (19) => NI_R_HAND (15) VMD_R_SHLDR (20) => NI_R_COLLAR(16) VMD_R_ARM (21) => NI_R_SHLDR (17) VMD_R_ARM_TW (22) => none VMD_R_ELBOW (23) => NI_R_ELBOW (18) VMD_R_WRIST_TW (24) => none VMD_R_WRIST (25) => NI_R_WRIST (19) VMD_R_HAND (26) => NI_R_HAND (20) VMD_L_HIP (27) => NI_L_HIP (21) VMD_L_KNEE (28) => NI_L_KNEE (22) VMD_L_ANKLE (29) => NI_L_ANKLE (23) VMD_L_TOE (30) => NI_L_FOOT (24) VMD_R_HIP (31) => NI_R_HIP (26) VMD_R_KNEE (32) => NI_R_KNEE (27) VMD_R_ANKLE (33) => NI_R_ANKLE (28) VMD_R_TOE (34) => NI_R_FOOT (29) */ static std::string _VMDJointName[] = // MMD_MAX_JOINT_NUM { // SJIS "全ての親", "センター", "下半身", "上半身", "上半身2", "首", "頭", "頭先", "両目", "左目", "右目", "左胸", "右胸", "左肩", "左腕", "左腕捩", "左ひじ", "左手捩", "左手首", "左手先", "右肩", "右腕", "右腕捩", "右ひじ", "右手捩", "右手首", "右手先", "左足", "左ひざ", "左足首", "左つま先", "右足", "右ひざ", "右足首", "右つま先" }; static std::string _VMDJointName_eng[] = // MMD_MAX_JOINT_NUM { "parent", "center", "lower body", "upper body", "upper body2", "neck", "head", "skull", "eyes", "eye_L", "eye_R", "bust_L", "bust_R", "shoulder_L", "arm_L", "arm twist_L", "elbow_L", "wrist twist_L", "wrist_L", "c wrist l", "shoulder_R", "arm_R", "arm twist_R", "elbow_R", "wrist twist_R", "wrist_R", "c wrist r", "leg_L", "knee_L", "ankle_L", "toe_L", "leg_R", "knee_R", "ankle_R", "toe_R" }; std::string jbxwl::VMDJointName(int n) { std::string str = ""; if (n>=0 && n=VMD_MAX_JOINT_NUM) return -1; return _VMD2NiJointNum[joint]; } ////////////////////////////////////////////////////////////////////////////////////////////////////// // // CVMDTool Class // void CVMDTool::init(void) { memset(&vmd_header, 0, sizeof(VMDFileHeader)); vmd_motion = NULL; vmd_datnum = 0; vmd_joints = NULL; vmd_frmnum = 0; dmy_joints = NULL; dmy_frmnum = 0; frameData = frame_data; rate_frame = VMD_FARME_RATE/30.; A2TPose.setRotation(37./180.*PI, 1.0, 0.0, 0.0, 1.0); clearJointsData(); } void CVMDTool::clearData(void) { if (vmd_motion!=NULL) ::free(vmd_motion); if (vmd_joints!=NULL) ::freeFrameData(vmd_joints, vmd_frmnum); if (dmy_joints!=NULL) ::freeFrameData(dmy_joints, dmy_frmnum); vmd_motion = NULL; vmd_datnum = 0; vmd_joints = NULL; vmd_frmnum = 0; dmy_joints = NULL; dmy_frmnum = 0; } void CVMDTool::clearJointsData(double val) { // clearStartPosition(); for (int i=0; i %d, %d, %s, %f, %f, %f, %f, %f, %f, %f\n", jdat[j].joint,jdat[j].index, VMDJointName(jdat[j].joint).c_str(), jdat[j].vect.x, jdat[j].vect.y, jdat[j].vect.z, jdat[j].quat.x, jdat[j].quat.y, jdat[j].quat.z, jdat[j].quat.s); } } fclose(fp); } /**/ calcJointRotation(); /** if (vmd_joints!=NULL) { FILE* fp = fopen("D:\\VMD_Joint2.txt", "w"); for (unsigned int i=0; i %d, %d, %s, %f, %f, %f, %f, %f, %f, %f\n", jdat[j].joint, jdat[j].index, VMDJointName(jdat[j].joint).c_str(), jdat[j].vect.x, jdat[j].vect.y, jdat[j].vect.z, jdat[j].quat.x, jdat[j].quat.y, jdat[j].quat.z, jdat[j].quat.s); } } fclose(fp); } /**/ // ジョイント番号の書き換え for (unsigned int i=0; i0) { unsigned int j = 0; for (unsigned int i=0; imotion_data[i+1].frm_num) { swap_motion = motion_data[i]; motion_data[i] = motion_data[i+1]; motion_data[i+1] = swap_motion; j = i; } } k = j; } // 一意的なフレーム数を数える unsigned int uniq_frame = 1; unsigned int frm_num = motion_data[0].frm_num; for (unsigned int i=1; i=0) { ni_joints[i].jdat[joint].joint = joint; ni_joints[i].jdat[joint].index = i; ni_joints[i].jdat[joint].vect.x = -motion_data[datacnt].posz*VMD_GRID_UNIT; ni_joints[i].jdat[joint].vect.y = motion_data[datacnt].posx*VMD_GRID_UNIT; ni_joints[i].jdat[joint].vect.z = motion_data[datacnt].posy*VMD_GRID_UNIT; ni_joints[i].jdat[joint].quat.x = motion_data[datacnt].qutz; ni_joints[i].jdat[joint].quat.y = -motion_data[datacnt].qutx; ni_joints[i].jdat[joint].quat.z = -motion_data[datacnt].quty; ni_joints[i].jdat[joint].quat.s = motion_data[datacnt].qutw; if (ni_joints[i].jdat[joint].quat.s<0.0) ni_joints[i].jdat[joint].quat = - ni_joints[i].jdat[joint].quat; ni_joints[i].jdat[joint].quat.normalize(); } datacnt++; if (datacnt==datanum) break; } } // datanum = uniq_frame; return ni_joints; } void CVMDTool::calcJointRotation(void) { if (vmd_joints==NULL || vmd_frmnum<=0) return; clearJointsData(); NiJointData prevJoint[VMD_MAX_JOINT_NUM]; for (int j=0; j=0) { posVect[j] = jdata[j].vect; rotQuat[j] = jdata[j].quat; prevJoint[j] = jdata[j]; } else { posVect[j] = prevJoint[j].vect; rotQuat[j] = prevJoint[j].quat; } } // rotQuat[VMD_R_WRIST] = rotQuat[VMD_R_WRIST]*rotQuat[VMD_R_WRIST_TW]; rotQuat[VMD_R_ELBOW] = rotQuat[VMD_R_ELBOW]*rotQuat[VMD_R_ARM_TW]; rotQuat[VMD_L_WRIST] = rotQuat[VMD_L_WRIST]*rotQuat[VMD_L_WRIST_TW]; rotQuat[VMD_L_ELBOW] = rotQuat[VMD_L_ELBOW]*rotQuat[VMD_L_ARM_TW]; rotQuat[VMD_R_EYE] = rotQuat[VMD_R_EYE]*rotQuat[VMD_EYES]; rotQuat[VMD_L_EYE] = rotQuat[VMD_L_EYE]*rotQuat[VMD_EYES]; /////// A -> T rotQuat[VMD_R_WRIST] = ~A2TPose*rotQuat[VMD_R_WRIST]*A2TPose; rotQuat[VMD_R_ELBOW] = ~A2TPose*rotQuat[VMD_R_ELBOW]*A2TPose; rotQuat[VMD_R_ARM] = rotQuat[VMD_R_ARM]*A2TPose; rotQuat[VMD_L_WRIST] = A2TPose*rotQuat[VMD_L_WRIST]*~A2TPose; rotQuat[VMD_L_ELBOW] = A2TPose*rotQuat[VMD_L_ELBOW]*~A2TPose; rotQuat[VMD_L_ARM] = rotQuat[VMD_L_ARM]*~A2TPose; // //rotQuat[VMD_CENTER] = rotQuat[VMD_CENTER]*~rotQuat[VMD_PARENT]; //posVect[VMD_CENTER] = posVect[VMD_CENTER] + posVect[VMD_PARENT]; // for (int j=0; j=0) { unsigned int st_index = 0; unsigned int en_index = 0; while (en_index514 && frmnum<545) { // Quaternion q = frameData[NI_PELVIS].quat; // DEBUG_ERR("%d (%f,%f,%f), %f", frmnum, q.x, q.y, q.z, q.s); //} return frameData; } /* Quaternion interQuatBezier(Quaternion a, Quaternion b, double t, unsigned char* param) { double t2 = t*t; double t3 = t2*t; double p0 = 1.0 - 3.0*t + 3.0*t2 - t3; double p1 = 3.0*t - 6.0*t2 + 3.0*t3; double p2 = 3.0*t2 - 3.0*t3; // double p3 = t3; Quaternion c = p0*a + p1* + p2* + t3*b; return c; } */