#include "xtools++.h" #include "NiJointsTool.h" using namespace jbxl; using namespace jbxwl; ////////////////////////////////////////////////////////////////////////// // // SDK(OpenNI, Kinect SDK)用 作業ジョイント番号. // 二つのSDKのジョイント名はこの名前に集約される. // // // Default or No SDK int NI_JNT_PELVIS = NI_PELVIS; int NI_JNT_TORSO = NI_TORSO; int NI_JNT_NECK = NI_NECK; int NI_JNT_HEAD = NI_HEAD; int NI_JNT_L_EYE = NI_L_EYE; int NI_JNT_R_EYE = NI_R_EYE; int NI_JNT_L_BUST = NI_L_BUST; int NI_JNT_R_BUST = NI_R_BUST; int NI_JNT_L_SHLDR = NI_L_SHLDR; int NI_JNT_L_ELBOW = NI_L_ELBOW; int NI_JNT_L_WRIST = NI_L_WRIST; int NI_JNT_L_HAND = NI_L_HAND; int NI_JNT_R_SHLDR = NI_R_SHLDR; int NI_JNT_R_ELBOW = NI_R_ELBOW; int NI_JNT_R_WRIST = NI_R_WRIST; int NI_JNT_R_HAND = NI_R_HAND; int NI_JNT_L_HIP = NI_L_HIP; int NI_JNT_L_KNEE = NI_L_KNEE; int NI_JNT_L_ANKLE = NI_L_ANKLE; int NI_JNT_L_FOOT = NI_L_FOOT; int NI_JNT_R_HIP = NI_R_HIP; int NI_JNT_R_KNEE = NI_R_KNEE; int NI_JNT_R_ANKLE = NI_R_ANKLE; int NI_JNT_R_FOOT = NI_R_FOOT; int NI_JNT_L_FINGER = NI_L_FINGER; // Parameter of Finger (Dummy Joint) int NI_JNT_R_FINGER = NI_R_FINGER; // Parameter of Finger (Dummy Joint) int NI_JNT_FACE = NI_FACE; // Parameter of Expression (Dummy Joint) ///////////////////////////////////////////////////////////////////////////// // // static std::string _NiJointName[] = // NI_JOINT_NAME_NUM { // 0 1 2 3 4 5 6 "PELVIS", "TORSO", "WAIST", "CHEST", "NECK", "HEAD", "SKULL", // 7 8 9 10 "L_EYE", "R_EYE", "L_BUST", "R_BUST", // 11 12 13 14 15 "L_COLLAR", "L_SHLDR", "L_ELBOW", "L_WRIST", "L_HAND", // 16 17 18 19 20 "R_COLLAR", "R_SHLDR", "R_ELBOW", "R_WRIST", "R_HAND", // 21 22 23 24 25 "L_HIP", "L_KNEE", "L_ANKLE", "L_FOOT", "L_TOE", // 26 27 28 29 30 "R_HIP", "R_KNEE", "R_ANKLE", "R_FOOT", "R_TOE", // 31 32 33 "L_FINGER", "R_FINGER", "FACE" }; //////////////////////////////////////////////////////////////////////////////////////////// // // 共通のジョイントの名前と番号 // std::string jbxwl::NiJointName(int n) { std::string str = ""; if (n>=0 && n=0) str = _NiJointName[n]; } else if (lib==NiSDK_Kinect) { int n = _Kinect2JointNameNum[j]; if (n>=0) str = _NiJointName[n]; } else if (lib==NiSDK_None) { //str = _NiJointName[_Ni2JointNameNum[j]]; str = _NiJointName[j]; } return str; } //////////////////////////////////////////////////////////////////////////////////////////// // // Library 固有のジョイント番号からミラージョイントの番号を得る // static int _OpenNIMirrorJointNum[] = // NI_OPENNI_JOINT_NUM (25) { 0, 1, 2, 3, 4, 11, 12, 13, 14, 15, 16, 5, 6, 7, 8, 9, 10, 21, 22, 23, 24, 17, 18, 19, 20 }; static int _KinectMirrorJointNum[] = // NI_KINECT_JOINT_NUM (20) { 0, 1, 2, 3, 8, 9, 10, 11, 4, 5, 6, 7, 16, 17, 18, 19, 12, 13, 14, 15 }; static int _NiMirrorJointNum[] = // NI_JOINT_NUM (34) { 0, 1, 2, 3, 4, 5, 6, 8, 7, 10, 9, 16, 17, 18, 19, 20, 11, 12, 13, 14, 15, 26, 27, 28, 29, 30, 21, 22, 23, 24, 25, 32, 31, 33 }; int jbxwl::NiSDKMirrorJointNum(int j, NiSDK_Lib lib) { int ret = -1; if (lib==NiSDK_OpenNI) { ret = _OpenNIMirrorJointNum[j]; } else if (lib==NiSDK_Kinect) { ret = _KinectMirrorJointNum[j]; } else if (lib==NiSDK_None) { ret = _NiMirrorJointNum[j]; } return ret; } //////////////////////////////////////////////////////////////////////////////////////////// // // 共通ジョイント番号から,Library固有の座標用ジョイント番号を得る // static int _Ni2OpenNIPosJointNum[] = // NI_JOINT_NUM (34) { 0, 3, -1, -1, 2, 1, -1, -1, -1, -1, -1, -1, 12, 13, -1, 15, -1, 6, 7, -1, 9, 21, 22, -1, 24, -1, 17, 18, -1, 20, -1, -1, -1, -1 }; static int _Ni2KinectPosJointNum[] = // NI_JOINT_NUM (34) { 0, 1, -1, -1, 2, 3, -1, -1, -1, -1, -1, -1, 4, 5, 6, 7, -1, 8, 9, 10, 11, 12, 13, 14, 15, -1, 16, 17, 18, 19, -1, -1, -1, -1 }; int jbxwl::Ni2SDKPosJointNum(int j, NiSDK_Lib lib) { int ret = -1; if (lib==NiSDK_Kinect) { ret = _Ni2KinectPosJointNum[j]; } else if (lib==NiSDK_OpenNI) { ret = _Ni2OpenNIPosJointNum[j]; } else if (lib==NiSDK_None) { ret = j; } return ret; } //////////////////////////////////////////////////////////////////////////////////////////// // // 共通ジョイント番号から,Library固有の回転用ジョイント番号を得る // static int _Ni2OpenNIRotJointNum[] = // NI_JOINT_NUM { 0, 3, -1, -1, 2, -1, -1, -1, -1, -1, -1, -1, 12, 13, -1, -1, -1, 6, 7, -1, -1, 21, 22, -1, -1, -1, 17, 18, -1, -1, -1, -1, -1, -1 }; static int _Ni2KinectRotJointNum[] = // NI_JOINT_NUM { 0, 1, -1, -1, 2, -1, -1, -1, -1, -1, -1, -1, 4, 5, 6, -1, -1, 8, 9, 10, -1, 12, 13, 14, -1, -1, 16, 17, 18, -1, -1, -1, -1, -1 }; static int _Ni2RotJointNum[] = // NI_JOINT_NUM { 0, 1, 2, 3, 4, 5, -1, 7, 8, 9, 10, 11, 12, 13, 14, -1, 16, 17, 18, 19, -1, 21, 22, 23, 24, -1, 26, 27, 38, 29, -1, 31, 32, 33 }; int jbxwl::Ni2SDKRotJointNum(int j, NiSDK_Lib lib) { int ret = -1; if (lib==NiSDK_Kinect) { ret = _Ni2KinectRotJointNum[j]; } else if (lib==NiSDK_OpenNI) { ret = _Ni2OpenNIRotJointNum[j]; } else if (lib==NiSDK_None) { ret = _Ni2RotJointNum[j]; } return ret; } //////////////////////////////////////////////////////////////////////////////////////////// // // 共通のジョイント名から Library 固有のジョイント番号を得る // /* static int _JointNameNum2Ni[] = // NI_JOINT_NAME_NUM (33) { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33 }; */ int jbxwl::JointName2NiSDK(char* jname, NiSDK_Lib lib) { int ret = -1; int j; for (j=0; j0) { frmdata[i].jdat = (NiJointData*)malloc(frmdata[i].jnum*sizeof(NiJointData)); if (frmdata[i].jdat==NULL) { freeFrameData(frmdata, frame); return NULL; } // for (int j=0; j='0' && buf.buf[0]<='9') frame++; // 行頭が数字の場合はフレーム時間 fgets_Buffer(&buf, fp); } if (frame==0) { free_Buffer(&buf); return FALSE; } // 各フレームのジョイントの数を調べる int* frame_num = (int*)malloc(frame*sizeof(int)); int* joint_num = (int*)malloc(frame*sizeof(int)); memset(frame_num, 0, frame*sizeof(int)); memset(joint_num, 0, frame*sizeof(int)); fseek(fp, 0, SEEK_SET); fgets_Buffer(&buf, fp); // 最初のフレーム時間行まで移動 while (buf.buf[0]<'0' || buf.buf[0]>'9') fgets_Buffer(&buf, fp); for (int i=0; i'9')) { if (buf.buf[0]==' ') joints++; fgets_Buffer(&buf, fp); } joint_num[i] = joints; } // Frame Data の格納先を作る jtxt_joints = makeVarFrameData(frame, joint_num, frame_num); ::free(frame_num); ::free(joint_num); if (jtxt_joints==NULL) { free_Buffer(&buf); return FALSE; } jtxt_frmnum = frame; // // データの読み込み // int prvms = 0; fseek(fp, 0, SEEK_SET); fgets_Buffer(&buf, fp); // 最初のフレーム時間行まで移動 while (buf.buf[0]<'0' || buf.buf[0]>'9') fgets_Buffer(&buf, fp); char jname[L_ID]; memset(jname, 0, L_ID); for (unsigned int i=0; i* pos, NiSDK_Lib lib, BOOL mirror) { for (int j=0; j=0) { posVect[j] = pos[n]; if (mirror) posVect[j].y = -posVect[j].y; } else { posVect[j].init(-1.0); } } return; } void CJTextTool::setRotQuat(Quaternion* rot, NiSDK_Lib lib, BOOL mirror) { for (int j=0; j=0) { rotQuat[j] = rot[n]; if (mirror) { rotQuat[j].x = -rotQuat[j].x; rotQuat[j].z = -rotQuat[j].z; } } else { rotQuat[j].init(-1.0); } } return; } NiJointData* CJTextTool::getFrameData(int frmnum) { for (int j=0; j