00001
00002 #include "tools++.h"
00003 #include "NiJointsTool.h"
00004
00005
00006 using namespace jbxl;
00007 using namespace jbxwl;
00008
00009
00011
00012
00013
00014
00015
00016 int NI_SDK_PELVIS = NI_PELVIS;
00017 int NI_SDK_TORSO = NI_TORSO;
00018 int NI_SDK_NECK = NI_NECK;
00019 int NI_SDK_HEAD = NI_HEAD;
00020
00021 int NI_SDK_L_EYE = NI_L_EYE;
00022 int NI_SDK_R_EYE = NI_R_EYE;
00023 int NI_SDK_L_BUST = NI_L_BUST;
00024 int NI_SDK_R_BUST = NI_R_BUST;
00025
00026 int NI_SDK_L_SHLDR = NI_L_SHLDR;
00027 int NI_SDK_L_ELBOW = NI_L_ELBOW;
00028 int NI_SDK_L_WRIST = NI_L_WRIST;
00029 int NI_SDK_L_HAND = NI_L_HAND;
00030 int NI_SDK_L_FNGRTIP = NI_L_FNGRTIP;
00031
00032 int NI_SDK_R_SHLDR = NI_R_SHLDR;
00033 int NI_SDK_R_ELBOW = NI_R_ELBOW;
00034 int NI_SDK_R_WRIST = NI_R_WRIST;
00035 int NI_SDK_R_HAND = NI_R_HAND;
00036 int NI_SDK_R_FNGRTIP = NI_R_FNGRTIP;
00037
00038 int NI_SDK_L_HIP = NI_L_HIP;
00039 int NI_SDK_L_KNEE = NI_L_KNEE;
00040 int NI_SDK_L_ANKLE = NI_L_ANKLE;
00041 int NI_SDK_L_FOOT = NI_L_FOOT;
00042
00043 int NI_SDK_R_HIP = NI_R_HIP;
00044 int NI_SDK_R_KNEE = NI_R_KNEE;
00045 int NI_SDK_R_ANKLE = NI_R_ANKLE;
00046 int NI_SDK_R_FOOT = NI_R_FOOT;
00047
00048 int NI_SDK_L_FINGER = NI_L_FINGER;
00049 int NI_SDK_R_FINGER = NI_R_FINGER;
00050 int NI_SDK_FACE = NI_FACE;
00051 int NI_SDK_AVATAR = NI_AVATAR;
00052
00053
00054
00055
00057
00058
00059
00060
00061 RBound<double> RBound_NI_TORSO;
00062 RBound<double> RBound_NI_CHEST;
00063 RBound<double> RBound_NI_NECK;
00064 RBound<double> RBound_NI_HEAD;
00065
00066 RBound<double> RBound_NI_L_COLLAR;
00067 RBound<double> RBound_NI_R_COLLAR;
00068 RBound<double> RBound_NI_L_SHLDR;
00069 RBound<double> RBound_NI_R_SHLDR;
00070 RBound<double> RBound_NI_L_ELBOW;
00071 RBound<double> RBound_NI_R_ELBOW;
00072 RBound<double> RBound_NI_L_WRIST;
00073 RBound<double> RBound_NI_R_WRIST;
00074 RBound<double> RBound_NI_L_HAND;
00075 RBound<double> RBound_NI_R_HAND;
00076
00077 RBound<double> RBound_NI_L_HIP;
00078 RBound<double> RBound_NI_R_HIP;
00079 RBound<double> RBound_NI_L_KNEE;
00080 RBound<double> RBound_NI_R_KNEE;
00081 RBound<double> RBound_NI_L_ANKLE;
00082 RBound<double> RBound_NI_R_ANKLE;
00083 RBound<double> RBound_NI_L_FOOT;
00084 RBound<double> RBound_NI_R_FOOT;
00085
00086
00087
00088
00090
00091
00092 static std::string _NiJointName[] =
00093 {
00094
00095 "PELVIS", "WAIST", "TORSO", "CHEST", "NECK", "HEAD", "SKULL",
00096
00097 "L_EYE", "R_EYE", "L_BUST", "R_BUST",
00098
00099 "L_COLLAR", "L_SHLDR", "L_ELBOW", "L_WRIST", "L_HAND", "L_FNGRTIP",
00100
00101 "R_COLLAR", "R_SHLDR", "R_ELBOW", "R_WRIST", "R_HAND", "R_FNGRTIP",
00102
00103 "L_HIP", "L_KNEE", "L_ANKLE", "L_FOOT", "L_TOE",
00104
00105 "R_HIP", "R_KNEE", "R_ANKLE", "R_FOOT", "R_TOE",
00106
00107 "L_FINGER", "R_FINGER", "FACE", "AVATAR"
00108 };
00109
00110
00111
00112
00114
00115
00116
00117 std::string jbxwl::NiJointName(int n)
00118 {
00119 std::string str = "";
00120
00121 if (n>=0 && n<NI_TOTAL_JOINT_NUM) {
00122 str = _NiJointName[n];
00123 }
00124
00125 return str;
00126 }
00127
00128
00129
00130 int jbxwl::NiJointNum(char* name)
00131 {
00132 for (int i=0; i<NI_TOTAL_JOINT_NUM; i++) {
00133 if (!strcmp(name, _NiJointName[i].c_str())) return i;
00134 }
00135 return -1;
00136 }
00137
00138
00139
00140
00142
00143
00144
00145 static int _OpenNI2JointNameNum[] =
00146 {
00147 0, 5, 4, 2, 1,
00148 17, 18, 19, 20, 21, 22,
00149 11, 12, 13, 14, 15, 16,
00150 28, 29, 30, 31,
00151 23, 24, 25, 26
00152 };
00153
00154
00155 static int _OpenNI22JointNameNum[] =
00156 {
00157 0, 5, 4,
00158 18, 12, 19, 13, 21, 15,
00159 2,
00160 28, 23, 29, 24, 31, 26
00161 };
00162
00163
00164 static int _Kinect2JointNameNum[] =
00165 {
00166 0, 2, 4, 5,
00167 12, 13, 14, 15,
00168 18, 19, 20, 21,
00169 23, 24, 25, 26,
00170 28, 29, 30, 31
00171 };
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188 std::string jbxwl::NiSDK2JointName(int j, NiSDK_Lib lib)
00189 {
00190 std::string str = "";
00191
00192 if (lib==NiSDK_OpenNI2) {
00193 int n = _OpenNI22JointNameNum[j];
00194 if (n>=0) str = _NiJointName[n];
00195 }
00196 else if (lib==NiSDK_OpenNI) {
00197 int n = _OpenNI2JointNameNum[j];
00198 if (n>=0) str = _NiJointName[n];
00199 }
00200 else if (lib==NiSDK_Kinect) {
00201 int n = _Kinect2JointNameNum[j];
00202 if (n>=0) str = _NiJointName[n];
00203 }
00204 else if (lib==NiSDK_None) {
00205
00206 str = _NiJointName[j];
00207 }
00208
00209 return str;
00210 }
00211
00212
00213
00214
00216
00217
00218
00219 static int _OpenNIMirrorJointNum[] =
00220 {
00221 0, 1, 2, 3, 4,
00222 11, 12, 13, 14, 15, 16,
00223 5, 6, 7, 8, 9, 10,
00224 21, 22, 23, 24,
00225 17, 18, 19, 20
00226 };
00227
00228
00229 static int _OpenNI2MirrorJointNum[] =
00230 {
00231 0, 1, 2,
00232 4, 3, 6, 5, 8, 7,
00233 9,
00234 11, 10, 13, 12, 15, 14
00235 };
00236
00237
00238 static int _KinectMirrorJointNum[] =
00239 {
00240 0, 1, 2, 3,
00241 8, 9, 10, 11,
00242 4, 5, 6, 7,
00243 16, 17, 18, 19,
00244 12, 13, 14, 15
00245 };
00246
00247
00248 static int _NiMirrorJointNum[] =
00249 {
00250 0, 1, 2, 3, 4, 5, 6,
00251 8, 7, 10, 9,
00252 17, 18, 19, 20, 21, 22,
00253 11, 12, 13, 14, 15, 16,
00254 28, 29, 30, 31, 32,
00255 23, 24, 25, 26, 27,
00256 34, 33, 35, 36
00257 };
00258
00259
00260
00261 int jbxwl::NiSDKMirrorJointNum(int j, NiSDK_Lib lib)
00262 {
00263 int ret = -1;
00264 if (j<0) return ret;
00265
00266 if (lib==NiSDK_OpenNI2) {
00267 ret = _OpenNI2MirrorJointNum[j];
00268 }
00269 else if (lib==NiSDK_OpenNI) {
00270 ret = _OpenNIMirrorJointNum[j];
00271 }
00272 else if (lib==NiSDK_Kinect) {
00273 ret = _KinectMirrorJointNum[j];
00274 }
00275 else if (lib==NiSDK_None) {
00276 ret = _NiMirrorJointNum[j];
00277 }
00278
00279 return ret;
00280 }
00281
00282
00283
00284
00286
00287
00288
00289
00290 static int _Ni2OpenNIPosJointNum[] =
00291 {
00292 0, -1, 3, -1, 2, 1, -1,
00293 -1, -1, -1, -1,
00294 -1, 12, 13, 15, -1, -1,
00295 -1, 6, 7, 9, -1, -1,
00296 21, 22, 24, -1, -1,
00297 17, 18, 20, -1, -1,
00298 -1, -1, -1, -1
00299 };
00300
00301
00302 static int _Ni2OpenNI2PosJointNum[] =
00303 {
00304 0, -1, 9, -1, 2, 1, -1,
00305 -1, -1, -1, -1,
00306 -1, 4, 6, 8, -1, -1,
00307 -1, 3, 5, 7, -1, -1,
00308 11, 13, 15, -1, -1,
00309 10, 12, 14, -1, -1,
00310 -1, -1, -1, -1
00311 };
00312
00313
00314 static int _Ni2KinectPosJointNum[] =
00315 {
00316 0, -1, 1, -1, 2, 3, -1,
00317 -1, -1, -1, -1,
00318 -1, 4, 5, 6, 7, -1,
00319 -1, 8, 9, 10, 11, -1,
00320 12, 13, 14, 15, -1,
00321 16, 17, 18, 19, -1,
00322 -1, -1, -1, -1
00323 };
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342 int jbxwl::Ni2SDKPosJointNum(int j, NiSDK_Lib lib)
00343 {
00344 int ret = -1;
00345
00346 if (lib==NiSDK_OpenNI2) {
00347 ret = _Ni2OpenNI2PosJointNum[j];
00348 }
00349 else if (lib==NiSDK_OpenNI) {
00350 ret = _Ni2OpenNIPosJointNum[j];
00351 }
00352 else if (lib==NiSDK_Kinect) {
00353 ret = _Ni2KinectPosJointNum[j];
00354 }
00355 else if (lib==NiSDK_None) {
00356
00357 ret = j;
00358 }
00359
00360 return ret;
00361 }
00362
00363
00364
00365
00367
00368
00369 static int _Ni2OpenNIRotJointNum[] =
00370 {
00371
00372 0, -1, 3, -1, 2, -1, -1,
00373 -1, -1, -1, -1,
00374 -1, 12, 13, -1, -1, -1,
00375 -1, 6, 7, -1, -1, -1,
00376 21, 22, -1, -1, -1,
00377 17, 18, -1, -1, -1,
00378 -1, -1, -1, -1
00379 };
00380
00381
00382 static int _Ni2OpenNI2RotJointNum[] =
00383 {
00384 0, -1, 9, -1, 2, -1, -1,
00385 -1, -1, -1, -1,
00386 -1, 4, 6, -1, -1, -1,
00387 -1, 3, 5, -1, -1, -1,
00388 11, 13, -1, -1, -1,
00389 10, 12, -1, -1, -1,
00390 -1, -1, -1, -1
00391 };
00392
00393
00394 static int _Ni2KinectRotJointNum[] =
00395 {
00396 0, -1, 1, -1, 2, 3, -1,
00397 -1, -1, -1, -1,
00398 -1, 4, 5, 6, -1, -1,
00399 -1, 8, 9, 10, -1, -1,
00400 12, 13, 14, -1, -1,
00401 16, 17, 18, -1, -1,
00402 -1, -1, -1, -1
00403 };
00404
00405
00406 static int _Ni2RotJointNum[] =
00407 {
00408 0, 1, 2, 3, 4, 5, -1,
00409 7, 8, 9, 10,
00410 11, 12, 13, 14, 15, -1,
00411 17, 18, 19, 20, 21, -1,
00412 23, 24, 25, 26, -1,
00413 28, 29, 30, 31, -1,
00414 33, 34, 35, 36
00415 };
00416
00417
00418
00419 int jbxwl::Ni2SDKRotJointNum(int j, NiSDK_Lib lib)
00420 {
00421 int ret = -1;
00422
00423 if (lib==NiSDK_OpenNI2) {
00424 ret = _Ni2OpenNI2RotJointNum[j];
00425 }
00426 else if (lib==NiSDK_OpenNI) {
00427 ret = _Ni2OpenNIRotJointNum[j];
00428 }
00429 else if (lib==NiSDK_Kinect) {
00430 ret = _Ni2KinectRotJointNum[j];
00431 }
00432 else if (lib==NiSDK_None) {
00433 ret = _Ni2RotJointNum[j];
00434 }
00435
00436 return ret;
00437 }
00438
00439
00440
00441
00443
00444
00445
00446
00447
00448
00449
00450
00451
00452
00453
00454
00455
00456
00457
00458
00459 int jbxwl::JointName2NiSDK(char* jname, NiSDK_Lib lib)
00460 {
00461 int ret = -1;
00462
00463 int j;
00464 for (j=0; j<NI_TOTAL_JOINT_NUM; j++) {
00465 if (!strcasecmp(jname, (char*)_NiJointName[j].c_str())) break;
00466 }
00467
00468 if (j<NI_TOTAL_JOINT_NUM) {
00469 ret = Ni2SDKJointNum(j, lib);
00470 }
00471 else if (j==NI_TOTAL_JOINT_NUM) {
00472
00473 }
00474
00475 return ret;
00476 }
00477
00478
00479
00480
00482
00483
00484
00485 void jbxwl::NiSetOpenNIJointNums(void)
00486 {
00487 NI_SDK_PELVIS = 0;
00488 NI_SDK_TORSO = 3;
00489 NI_SDK_NECK = 2;
00490 NI_SDK_HEAD = 1;
00491
00492 NI_SDK_L_EYE = -1;
00493 NI_SDK_R_EYE = -1;
00494 NI_SDK_L_BUST = -1;
00495 NI_SDK_R_BUST = -1;
00496
00497 NI_SDK_L_SHLDR = 12;
00498 NI_SDK_L_ELBOW = 13;
00499 NI_SDK_L_WRIST = 15;
00500 NI_SDK_L_HAND = -1;
00501 NI_SDK_L_FNGRTIP = -1;
00502
00503 NI_SDK_R_SHLDR = 6;
00504 NI_SDK_R_ELBOW = 7;
00505 NI_SDK_R_WRIST = 9;
00506 NI_SDK_R_HAND = -1;
00507 NI_SDK_R_FNGRTIP = -1;
00508
00509 NI_SDK_L_HIP = 21;
00510 NI_SDK_L_KNEE = 22;
00511 NI_SDK_L_ANKLE = 24;
00512 NI_SDK_L_FOOT = -1;
00513
00514 NI_SDK_R_HIP = 17;
00515 NI_SDK_R_KNEE = 18;
00516 NI_SDK_R_ANKLE = 20;
00517 NI_SDK_R_FOOT = -1;
00518
00519 NI_SDK_L_FINGER = -1;
00520 NI_SDK_R_FINGER = -1;
00521 NI_SDK_FACE = -1;
00522 NI_SDK_AVATAR = -1;
00523
00524 return;
00525 }
00526
00527
00528
00529
00530 void jbxwl::NiSetOpenNI2JointNums(void)
00531 {
00532 NI_SDK_PELVIS = 0;
00533 NI_SDK_TORSO = 9;
00534 NI_SDK_NECK = 2;
00535 NI_SDK_HEAD = 1;
00536
00537 NI_SDK_L_EYE = -1;
00538 NI_SDK_R_EYE = -1;
00539 NI_SDK_L_BUST = -1;
00540 NI_SDK_R_BUST = -1;
00541
00542 NI_SDK_L_SHLDR = 4;
00543 NI_SDK_L_ELBOW = 6;
00544 NI_SDK_L_WRIST = 8;
00545 NI_SDK_L_HAND = -1;
00546 NI_SDK_L_FNGRTIP = -1;
00547
00548 NI_SDK_R_SHLDR = 3;
00549 NI_SDK_R_ELBOW = 5;
00550 NI_SDK_R_WRIST = 7;
00551 NI_SDK_R_HAND = -1;
00552 NI_SDK_R_FNGRTIP = -1;
00553
00554 NI_SDK_L_HIP = 11;
00555 NI_SDK_L_KNEE = 13;
00556 NI_SDK_L_ANKLE = 15;
00557 NI_SDK_L_FOOT = -1;
00558
00559 NI_SDK_R_HIP = 10;
00560 NI_SDK_R_KNEE = 12;
00561 NI_SDK_R_ANKLE = 14;
00562 NI_SDK_R_FOOT = -1;
00563
00564 NI_SDK_L_FINGER = -1;
00565 NI_SDK_R_FINGER = -1;
00566 NI_SDK_FACE = -1;
00567 NI_SDK_AVATAR = -1;
00568
00569 return;
00570 }
00571
00572
00573
00574
00575 void jbxwl::NiSetKinectJointNums(void)
00576 {
00577 NI_SDK_PELVIS = 0;
00578 NI_SDK_TORSO = 1;
00579 NI_SDK_NECK = 2;
00580 NI_SDK_HEAD = 3;
00581
00582 NI_SDK_L_EYE = -1;
00583 NI_SDK_R_EYE = -1;
00584 NI_SDK_L_BUST = -1;
00585 NI_SDK_R_BUST = -1;
00586
00587 NI_SDK_L_SHLDR = 4;
00588 NI_SDK_L_ELBOW = 5;
00589 NI_SDK_L_WRIST = 6;
00590 NI_SDK_L_HAND = 7;
00591 NI_SDK_L_FNGRTIP = -1;
00592
00593 NI_SDK_R_SHLDR = 8;
00594 NI_SDK_R_ELBOW = 9;
00595 NI_SDK_R_WRIST = 10;
00596 NI_SDK_R_HAND = 11;
00597 NI_SDK_R_FNGRTIP = -1;
00598
00599 NI_SDK_L_HIP = 12;
00600 NI_SDK_L_KNEE = 13;
00601 NI_SDK_L_ANKLE = 14;
00602 NI_SDK_L_FOOT = 15;
00603
00604 NI_SDK_R_HIP = 16;
00605 NI_SDK_R_KNEE = 17;
00606 NI_SDK_R_ANKLE = 18;
00607 NI_SDK_R_FOOT = 19;
00608
00609 NI_SDK_L_FINGER = -1;
00610 NI_SDK_R_FINGER = -1;
00611 NI_SDK_FACE = -1;
00612 NI_SDK_AVATAR = -1;
00613
00614 return;
00615 }
00616
00617
00618
00619
00621
00622
00623
00624 void CNiJoints::init(void)
00625 {
00626 sdk_lib = NiSDK_None;
00627
00628 posVect = NULL;
00629 rotQuat = NULL;
00630 jntAngl = NULL;
00631
00632 posRing = NULL;
00633 rotRing = NULL;
00634
00635 clearNiJointsData();
00636 }
00637
00638
00639
00640 void CNiJoints::clearNiJointsData(void)
00641 {
00642
00643 for (int j=0; j<NI_TOTAL_JOINT_NUM; j++) {
00644
00645 niPosVect[j].init(-1.0);
00646 niRotQuat[j].init(-1.0);
00647 niJntAngl[j] = 0.0;
00648 }
00649
00650 return;
00651 }
00652
00653
00654
00655 void CNiJoints::connectJointsData(Vector<double>* vct, Quaternion<double>* qut,
00656 Vector<int>* crd, double* agl, CRingBuffer* vrg, CRingBuffer* qrg)
00657 {
00658 posVect = vct;
00659 rotQuat = qut;
00660 jntAngl = agl;
00661 crdVect = crd;
00662 posRing = vrg;
00663 rotRing = qrg;
00664 }
00665
00666
00667
00668 void CNiJoints::copyJoints2NiJoints(BOOL mirror)
00669 {
00670 if (posVect!=NULL) {
00671 for (int j=0; j<NI_TOTAL_JOINT_NUM; j++) {
00672 int n = Ni2SDKPosJointNum(j, sdk_lib);
00673 if (n>=0) {
00674 niPosVect[j] = posVect[n];
00675 }
00676 }
00677 }
00678
00679 if (rotQuat!=NULL) {
00680 for (int j=0; j<NI_TOTAL_JOINT_NUM; j++) {
00681 int n = Ni2SDKRotJointNum(j, sdk_lib);
00682 if (n>=0) {
00683 niRotQuat[j] = rotQuat[n];
00684 }
00685 }
00686 }
00687
00688 if (jntAngl!=NULL) {
00689 for (int j=0; j<NI_TOTAL_JOINT_NUM; j++) {
00690 int n = Ni2SDKRotJointNum(j, sdk_lib);
00691 if (n>=0) {
00692
00693 niJntAngl[j] = jntAngl[n];
00694 }
00695 }
00696 }
00697
00698 return;
00699 }
00700
00701
00702
00703
00705
00706
00718 NiFrameData* jbxwl::makeFramesData(int frame, int jnum, int* frame_num)
00719 {
00720 if (jnum<0) return NULL;
00721
00722 NiFrameData* frmdata = (NiFrameData*)malloc(frame*sizeof(NiFrameData));
00723 if (frmdata==NULL) return NULL;
00724 memset(frmdata, 0, frame*sizeof(NiFrameData));
00725
00726 for (int i=0; i<frame; i++) {
00727 if (frame_num!=NULL) {
00728 frmdata[i].frmn = frame_num[i];
00729 frmdata[i].msec = frame_num[i];
00730 }
00731 else {
00732 frmdata[i].frmn = i;
00733 frmdata[i].msec = i;
00734 }
00735 frmdata[i].jnum = jnum;
00736
00737 if (frmdata[i].jnum>0) {
00738 frmdata[i].jdat = (NiJointData*)malloc(frmdata[i].jnum*sizeof(NiJointData));
00739 if (frmdata[i].jdat==NULL) {
00740 freeFramesData(frmdata, frame);
00741 return NULL;
00742 }
00743
00744 for (int j=0; j<frmdata[i].jnum; j++) {
00745 frmdata[i].jdat[j].joint = -1;
00746 frmdata[i].jdat[j].index = -1;
00747 frmdata[i].jdat[j].vect.init(-1.0);
00748 frmdata[i].jdat[j].quat.init(-1.0);
00749 }
00750 }
00751 else {
00752 frmdata[i].jdat = NULL;
00753 }
00754 }
00755
00756 return frmdata;
00757 }
00758
00759
00760
00771
00772
00773
00774
00775
00776
00777
00778
00779
00780
00781
00782
00783
00784
00785
00786
00787
00788 void jbxwl::freeFramesData(NiFrameData* frmdata, int frm_num)
00789 {
00790 if (frmdata==NULL || frm_num<=0) return;
00791
00792 for (int i=0; i<frm_num; i++) {
00793 if (frmdata[i].jdat!=NULL) {
00794 ::free(frmdata[i].jdat);
00795 frmdata[i].jdat = NULL;
00796 }
00797 }
00798
00799 ::free(frmdata);
00800 return;
00801 }
00802
00803
00804
00805
00807
00808
00809
00810
00811
00812 void jbxwl::NiInitRBoundJointsRotation()
00813 {
00814
00815 RBound_NI_TORSO.init();
00816 RBound_NI_CHEST.init();
00817 RBound_NI_NECK.init();
00818 RBound_NI_HEAD.init();
00819
00820 RBound_NI_L_COLLAR.init();
00821 RBound_NI_R_COLLAR.init();
00822 RBound_NI_L_SHLDR.init();
00823 RBound_NI_R_SHLDR.init();
00824 RBound_NI_L_ELBOW.init();
00825 RBound_NI_R_ELBOW.init();
00826 RBound_NI_L_WRIST.init();
00827 RBound_NI_R_WRIST.init();
00828 RBound_NI_L_HAND.init();
00829 RBound_NI_R_HAND.init();
00830
00831 RBound_NI_L_HIP.init();
00832 RBound_NI_R_HIP.init();
00833 RBound_NI_L_KNEE.init();
00834 RBound_NI_R_KNEE.init();
00835 RBound_NI_L_ANKLE.init();
00836 RBound_NI_R_ANKLE.init();
00837 RBound_NI_L_FOOT.init();
00838 RBound_NI_R_FOOT.init();
00839
00840 return;
00841 }
00842
00843
00844
00845 void jbxwl::NiCorrectJointsRotation(Quaternion<double>* quat, NiSDK_Lib lib)
00846 {
00847 int joint;
00848
00849
00850 joint = Ni2SDKRotJointNum(NI_TORSO, lib);
00851 if (joint>0) NiCorrectJointEuler(NI_TORSO, quat+joint, RBound_NI_TORSO);
00852
00853 joint = Ni2SDKRotJointNum(NI_CHEST, lib);
00854 if (joint>0) NiCorrectJointEuler(NI_CHEST, quat+joint, RBound_NI_CHEST);
00855
00856 joint = Ni2SDKRotJointNum(NI_NECK, lib);
00857 if (joint>0) NiCorrectJointEuler(NI_NECK, quat+joint, RBound_NI_NECK);
00858
00859 joint = Ni2SDKRotJointNum(NI_HEAD, lib);
00860 if (joint>0) NiCorrectJointEuler(NI_HEAD, quat+joint, RBound_NI_HEAD);
00861
00862
00863 joint = Ni2SDKRotJointNum(NI_L_COLLAR, lib);
00864 if (joint>0) NiCorrectJointEuler(NI_L_COLLAR, quat+joint, RBound_NI_L_COLLAR);
00865
00866 joint = Ni2SDKRotJointNum(NI_R_COLLAR, lib);
00867 if (joint>0) NiCorrectJointEuler(NI_R_COLLAR, quat+joint, RBound_NI_R_COLLAR);
00868
00869 joint = Ni2SDKRotJointNum(NI_L_SHLDR, lib);
00870 if (joint>0) NiCorrectJointEuler(NI_L_SHLDR, quat+joint, RBound_NI_L_SHLDR);
00871
00872 joint = Ni2SDKRotJointNum(NI_R_SHLDR, lib);
00873 if (joint>0) NiCorrectJointEuler(NI_R_SHLDR, quat+joint, RBound_NI_R_SHLDR);
00874
00875 joint = Ni2SDKRotJointNum(NI_L_ELBOW, lib);
00876 if (joint>0) NiCorrectJointEuler(NI_L_ELBOW, quat+joint, RBound_NI_L_ELBOW);
00877
00878 joint = Ni2SDKRotJointNum(NI_R_ELBOW, lib);
00879 if (joint>0) NiCorrectJointEuler(NI_R_ELBOW, quat+joint, RBound_NI_R_ELBOW);
00880
00881 joint = Ni2SDKRotJointNum(NI_L_WRIST, lib);
00882 if (joint>0) NiCorrectJointEuler(NI_L_WRIST, quat+joint, RBound_NI_L_WRIST);
00883
00884 joint = Ni2SDKRotJointNum(NI_R_WRIST, lib);
00885 if (joint>0) NiCorrectJointEuler(NI_R_WRIST, quat+joint, RBound_NI_R_WRIST);
00886
00887 joint = Ni2SDKRotJointNum(NI_L_HAND, lib);
00888 if (joint>0) NiCorrectJointEuler(NI_L_HAND, quat+joint, RBound_NI_L_HAND);
00889
00890 joint = Ni2SDKRotJointNum(NI_R_HAND, lib);
00891 if (joint>0) NiCorrectJointEuler(NI_R_HAND, quat+joint, RBound_NI_R_HAND);
00892
00893
00894 joint = Ni2SDKRotJointNum(NI_L_HIP, lib);
00895 if (joint>0) NiCorrectJointEuler(NI_L_HIP, quat+joint, RBound_NI_L_HIP);
00896
00897 joint = Ni2SDKRotJointNum(NI_R_HIP, lib);
00898 if (joint>0) NiCorrectJointEuler(NI_R_HIP, quat+joint, RBound_NI_R_HIP);
00899
00900 joint = Ni2SDKRotJointNum(NI_L_KNEE, lib);
00901 if (joint>0) NiCorrectJointEuler(NI_L_KNEE, quat+joint, RBound_NI_L_KNEE);
00902
00903 joint = Ni2SDKRotJointNum(NI_R_KNEE, lib);
00904 if (joint>0) NiCorrectJointEuler(NI_R_KNEE, quat+joint, RBound_NI_R_KNEE);
00905
00906 joint = Ni2SDKRotJointNum(NI_L_ANKLE, lib);
00907 if (joint>0) NiCorrectJointEuler(NI_L_ANKLE, quat+joint, RBound_NI_L_ANKLE);
00908
00909 joint = Ni2SDKRotJointNum(NI_R_ANKLE, lib);
00910 if (joint>0) NiCorrectJointEuler(NI_R_ANKLE, quat+joint, RBound_NI_R_ANKLE);
00911
00912 joint = Ni2SDKRotJointNum(NI_L_FOOT, lib);
00913 if (joint>0) NiCorrectJointEuler(NI_L_FOOT, quat+joint, RBound_NI_L_FOOT);
00914
00915 joint = Ni2SDKRotJointNum(NI_R_FOOT, lib);
00916 if (joint>0) NiCorrectJointEuler(NI_R_FOOT, quat+joint, RBound_NI_R_FOOT);
00917
00918 return;
00919 }
00920
00921
00922
00923 void jbxwl::NiCorrectJointEuler(int joint, Quaternion<double>* quat, RBound<double> rb)
00924 {
00925 if (rb.tmin==0.0) return;
00926
00927 Vector<double> eul[2];
00928
00929 eul[0].set(0.0, 0.0, 0.0, 0.0, -1.0);
00930 NiGetJointEuler(joint, quat, eul);
00931 if (eul[0].c==-1.0) return;
00932
00933
00934 BOOL chgf = FALSE;
00935 if (eul[0].x<rb.xmin) { eul[0].x = rb.xmin; chgf = TRUE;}
00936 else if (eul[0].x>rb.xmax) { eul[0].x = rb.xmax; chgf = TRUE;}
00937 if (eul[0].y<rb.ymin) { eul[0].y = rb.ymin; chgf = TRUE;}
00938 else if (eul[0].y>rb.ymax) { eul[0].y = rb.ymax; chgf = TRUE;}
00939 if (eul[0].z<rb.zmin) { eul[0].z = rb.zmin; chgf = TRUE;}
00940 else if (eul[0].z>rb.zmax) { eul[0].z = rb.zmax; chgf = TRUE;}
00941 if (!chgf) return;
00942
00943
00944 chgf = FALSE;
00945 if (eul[1].x<rb.xmin) { eul[1].x = rb.xmin; chgf = TRUE;}
00946 else if (eul[1].x>rb.xmax) { eul[1].x = rb.xmax; chgf = TRUE;}
00947 if (eul[1].y<rb.ymin) { eul[1].y = rb.ymin; chgf = TRUE;}
00948 else if (eul[1].y>rb.ymax) { eul[1].y = rb.ymax; chgf = TRUE;}
00949 if (eul[1].z<rb.zmin) { eul[1].z = rb.zmin; chgf = TRUE;}
00950 else if (eul[1].z>rb.zmax) { eul[1].z = rb.zmax; chgf = TRUE;}
00951 if (!chgf) return;
00952
00953
00954 NiSetJointEuler(joint, eul, quat);
00955
00956 return;
00957 }
00958
00959
00960
00961 void jbxwl::NiGetJointEuler(int joint, Quaternion<double>* quat, Vector<double>* vect)
00962 {
00963 if (vect==NULL) return;
00964
00965 Vector<double> vt[2];
00966 vt[0].set(0.0, 0.0, 0.0, 0.0, -1.0);
00967
00968 if (joint==NI_L_ANKLE || joint==NI_R_ANKLE) {
00969 Quaternion2ExtEulerXZY(*quat, vt);
00970 if (vt[0].c!=-1.0) {
00971 vect[0].set(vt[0].element1(), vt[0].element3(), vt[0].element2());
00972 vect[1].set(vt[1].element1(), vt[1].element3(), vt[1].element2());
00973 }
00974 }
00975 else if (joint==NI_L_COLLAR || joint==NI_R_COLLAR) {
00976 Quaternion2ExtEulerYXZ(*quat, vt);
00977 if (vt[0].c!=-1.0) {
00978 vect[0].set(vt[0].element2(), vt[0].element1(), vt[0].element3());
00979 vect[1].set(vt[1].element2(), vt[1].element1(), vt[1].element3());
00980 }
00981 }
00982 else if (joint==NI_L_SHLDR || joint==NI_R_SHLDR) {
00983 Quaternion2ExtEulerYZX(*quat, vt);
00984 if (vt[0].c!=-1.0) {
00985 vect[0].set(vt[0].element3(), vt[0].element1(), vt[0].element2());
00986 vect[1].set(vt[1].element3(), vt[1].element1(), vt[1].element2());
00987 }
00988 }
00989 else if (joint==NI_L_ELBOW || joint==NI_R_ELBOW) {
00990 Quaternion2ExtEulerYXZ(*quat, vt);
00991 if (vt[0].c!=-1.0) {
00992 vect[0].set(vt[0].element2(), vt[0].element1(), vt[0].element3());
00993 vect[1].set(vt[1].element2(), vt[1].element1(), vt[1].element3());
00994 }
00995 }
00996 else if (joint==NI_L_WRIST || joint==NI_R_WRIST) {
00997 Quaternion2ExtEulerYZX(*quat, vt);
00998 if (vt[0].c!=-1.0) {
00999 vect[0].set(vt[0].element3(), vt[0].element1(), vt[0].element2());
01000 vect[1].set(vt[1].element3(), vt[1].element1(), vt[1].element2());
01001 }
01002 }
01003 else {
01004 Quaternion2ExtEulerZXY(*quat, vt);
01005 if (vt[0].c!=-1.0) {
01006 vect[0].set(vt[0].element2(), vt[0].element3(), vt[0].element1());
01007 vect[1].set(vt[1].element2(), vt[1].element3(), vt[1].element1());
01008 }
01009 }
01010
01011 return;
01012 }
01013
01014
01015
01016 void jbxwl::NiSetJointEuler(int joint, Vector<double>* vect, Quaternion<double>* quat)
01017 {
01018 Quaternion<double> qut[2], rot[2];
01019 Vector<double> eul[2];
01020
01021 if (joint==NI_L_ANKLE || joint==NI_R_ANKLE) {
01022 eul[0].set(vect[0].x, vect[0].z, vect[0].y);
01023 eul[1].set(vect[1].x, vect[1].z, vect[1].y);
01024 qut[0].setExtEulerXZY(eul[0]);
01025 qut[1].setExtEulerXZY(eul[1]);
01026 }
01027 else if (joint==NI_L_COLLAR || joint==NI_R_COLLAR) {
01028 eul[0].set(vect[0].y, vect[0].x, vect[0].z);
01029 eul[1].set(vect[1].y, vect[1].x, vect[1].z);
01030 qut[0].setExtEulerYXZ(eul[0]);
01031 qut[1].setExtEulerYXZ(eul[1]);
01032 }
01033 else if (joint==NI_L_SHLDR || joint==NI_R_SHLDR) {
01034 eul[0].set(vect[0].y, vect[0].z, vect[0].x);
01035 eul[1].set(vect[1].y, vect[1].z, vect[1].x);
01036 qut[0].setExtEulerYZX(eul[0]);
01037 qut[1].setExtEulerYZX(eul[1]);
01038 }
01039 else if (joint==NI_L_ELBOW || joint==NI_R_ELBOW) {
01040 eul[0].set(vect[0].y, vect[0].x, vect[0].z);
01041 eul[1].set(vect[1].y, vect[1].x, vect[1].z);
01042 qut[0].setExtEulerYXZ(eul[0]);
01043 qut[1].setExtEulerYXZ(eul[1]);
01044 }
01045 else if (joint==NI_L_WRIST || joint==NI_R_WRIST) {
01046 eul[0].set(vect[0].y, vect[0].z, vect[0].x);
01047 eul[1].set(vect[1].y, vect[1].z, vect[1].x);
01048 qut[0].setExtEulerYZX(eul[0]);
01049 qut[1].setExtEulerYZX(eul[1]);
01050 }
01051 else {
01052 eul[0].set(vect[0].z, vect[0].x, vect[0].y);
01053 eul[1].set(vect[1].z, vect[1].x, vect[1].y);
01054 qut[0].setExtEulerZXY(eul[0]);
01055 qut[1].setExtEulerZXY(eul[1]);
01056 }
01057
01058
01059 rot[0] = qut[0]*~(*quat);
01060 rot[1] = qut[1]*~(*quat);
01061
01062 if (rot[0].getAngle()<=rot[1].getAngle()) {
01063 *quat = qut[0];
01064 }
01065 else {
01066 *quat = qut[1];
01067 }
01068
01069 return;
01070 }
01071
01072
01073
01074
01076
01077
01078 CBaseFrameTool::CBaseFrameTool(void)
01079 {
01080 init_data();
01081 }
01082
01083
01084
01085 CBaseFrameTool::~CBaseFrameTool(void)
01086 {
01087 DEBUG_INFO("DESTRUCTOR: CBaseFrameTool\n");
01088
01089 free_data();
01090 }
01091
01092
01093
01094 void CBaseFrameTool::free_data(void)
01095 {
01096 if (framesData!=NULL) freeFramesData(framesData, frames_num);
01097 if (jointsData!=NULL) ::free(jointsData);
01098
01099 if (posVect!=NULL) ::free(posVect);
01100 if (rotQuat!=NULL) ::free(rotQuat);
01101
01102 framesData = NULL;
01103 jointsData = NULL;
01104
01105 posVect = NULL;
01106 rotQuat = NULL;
01107
01108 clear_data();
01109 }
01110
01111
01112
01113 void CBaseFrameTool::clear_data(void)
01114 {
01115 frames_num = 0;
01116 joints_num = 0;
01117
01118 start_time = 0;
01119 stop_time = 0;
01120 exec_time = 0;
01121 }
01122
01123
01124
01125 void CBaseFrameTool::init_data(void)
01126 {
01127 framesData = NULL;
01128 jointsData = NULL;
01129
01130 posVect = NULL;
01131 rotQuat = NULL;
01132
01133 clear_data();
01134 }
01135
01136
01137
01139
01140 void CBaseFrameTool::clearJointsData(int jnum)
01141 {
01142 if (jointsData!=NULL) {
01143 for (int j=0; j<jnum; j++) {
01144 jointsData[j].index = -1;
01145 jointsData[j].joint = -1;
01146 jointsData[j].vect.init(-1.0);
01147 jointsData[j].quat.init(-1.0);
01148 }
01149 }
01150 }
01151
01152
01153
01154 void CBaseFrameTool::clearVectorData(int jnum)
01155 {
01156 if (posVect!=NULL && rotQuat!=NULL) {
01157 for (int j=0; j<jnum; j++) {
01158 posVect[j].init(-1.0);
01159 rotQuat[j].init(-1.0);
01160 }
01161 }
01162 }