fork download
  1.  
  2. JointHitDetector::JointHitDetector(XnSkeletonJoint joint, XnSkeletonJoint refJoint, string name, float requiredLength)
  3. : mPointHistorySize(5)
  4. , mRequiredLength(requiredLength)
  5. , mMessageWorldJointPos(0)
  6. , mMessageBodyJointPos(0)
  7. , mMessageScreenJointPos(0)
  8. , mJoint(joint)
  9. , mRefJoint(refJoint)
  10. , mName(name)
  11.  
  12. JointHitDetector::~JointHitDetector()
  13. {
  14. TheMessenger->RemoveListener(this);
  15. }
  16.  
  17. void JointHitDetector::Poll(float dt)
  18.  
  19. const ofxVec3f vUp(0,1,0);
  20. const ofxVec3f vDown(0,-1,0);
  21. const ofxVec3f vLeft(-1,0,0);
  22. const ofxVec3f vRight(1,0,0);
  23. const ofxVec3f vBack(0,0,1);
  24. const ofxVec3f vForward(0,0,-1);
  25. if (DetectHit(vDir) && (refDist > 300 || !NeedDistFromRef()) && confidence > .3f)
  26. {
  27. vDir.normalize();
  28. if (MatchesDir(vUp, vDir, vRefToJoint))
  29. {
  30. TheMessenger->SendStringMessage(mName, "up");
  31. mHitAreaDisplay[kHitUp] = _hitAreaDisplayTime;
  32. }
  33. else if (MatchesDir(vDown, vDir, vRefToJoint))
  34. {
  35. TheMessenger->SendStringMessage(mName, "down");
  36. mHitAreaDisplay[kHitDown] = _hitAreaDisplayTime;
  37. }
  38. else if (MatchesDir(vRight, vDir, vRefToJoint))
  39. {
  40. TheMessenger->SendStringMessage(mName, "right");
  41. mHitAreaDisplay[kHitRight] = _hitAreaDisplayTime;
  42. }
  43. else if (MatchesDir(vForward, vDir, vRefToJoint))
  44. {
  45. TheMessenger->SendStringMessage(mName, "forward");
  46. mHitAreaDisplay[kHitForward] = _hitAreaDisplayTime;
  47. }
  48. else if (MatchesDir(vLeft, vDir, vRefToJoint))
  49. {
  50. TheMessenger->SendStringMessage(mName, "left");
  51. mHitAreaDisplay[kHitLeft] = _hitAreaDisplayTime;
  52. }
  53. else if (MatchesDir(vBack, vDir, vRefToJoint))
  54. {
  55. TheMessenger->SendStringMessage(mName, "back");
  56. mHitAreaDisplay[kHitBack] = _hitAreaDisplayTime;
  57. }
  58. }
  59. }
  60. }
  61.  
  62. bool JointHitDetector::MatchesDir(const ofxVec3f& vMatchDir, const ofxVec3f& vCheckDir, const ofxVec3f& vRefDir) const
  63. {
  64. const float cos45 = 0.707106781f;
  65. return vMatchDir.dot(vCheckDir) > cos45 && (vMatchDir.dot(vRefDir) > .3f || !NeedDistFromRef());
  66. }
  67.  
  68. bool JointHitDetector::DetectHit(ofxVec3f& vDir)
  69. {
  70. int numTrackedPoints = mPoints.size();
  71. if (numTrackedPoints < 3)
  72. return false;
  73.  
  74. ofxVec3f A = mPoints[1] - mPoints[0];
  75. ofxVec3f B = mPoints[2] - mPoints[1];
  76.  
  77. for (int i=2; i<=numTrackedPoints; ++i)
  78. {
  79. //printf("*** i = %i\n", i);
  80. //printf("A = (%f,%f,%f) B = (%f,%f,%f)\n", A.x, A.y, A.z, B.x, B.y, B.z);
  81. ofxVec3f C = mPoints[numTrackedPoints > i ? i : i-1] - mPoints[i-1];
  82. ofxVec3f normA = A.getNormalized();
  83. ofxVec3f normB = B.getNormalized();
  84.  
  85. static float _shortEnough = 30.0f;
  86. if (LongEnough(A) && (normA.dot(normB) < .1f || B.length() < _shortEnough))
  87. {
  88. vDir = A;
  89. for (int j=0; j<i; ++j) //erase the A part, keep the B
  90. mPoints.erase(mPoints.begin());
  91. return true;
  92. }
  93. else if (normA.dot(normB) > .8f || (LongEnough(A) && normA.dot(normB) > .4f))
  94. {
  95. A = A+B; B = C;
  96. }
  97. else
  98. {
  99. A = B; B = C;
  100. }
  101. }
  102.  
  103. return false;
  104. }
  105.  
  106. bool JointHitDetector::LongEnough(const ofxVec3f& vec) const
  107. {
  108. return vec.lengthSquared() > mRequiredLength * mRequiredLength;
  109. }
  110.  
  111. void JointHitDetector::Draw() const
  112. {
  113. for (int i=1; i<mPoints.size(); ++i)
  114. {
  115. glPushMatrix();
  116. glLineWidth(3);
  117. glColor3f(0,0,1);
  118. glBegin(GL_LINES);
  119. glVertex2f(320 + mPoints[i-1].x * .5f, 240 - mPoints[i-1].y * .5f);
  120. glVertex2f(320 + mPoints[i].x * .5f, 240 - mPoints[i].y * .5f);
  121. glEnd();
  122. glPopMatrix();
  123. }
  124.  
  125. for (int i=0; i<kNumHitDirections; ++i)
  126. DrawHitDirection((HitDirection)i);
  127. }
  128.  
  129.  
  130.  
  131.  
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
prog.cpp:2: error: ‘JointHitDetector’ has not been declared
prog.cpp:2: error: expected constructor, destructor, or type conversion before ‘(’ token
prog.cpp:17: error: ‘JointHitDetector’ has not been declared
prog.cpp:19: error: expected initializer before ‘ofxVec3f’
prog.cpp:20: error: ‘ofxVec3f’ does not name a type
prog.cpp:21: error: ‘ofxVec3f’ does not name a type
prog.cpp:22: error: ‘ofxVec3f’ does not name a type
prog.cpp:23: error: ‘ofxVec3f’ does not name a type
prog.cpp:24: error: ‘ofxVec3f’ does not name a type
prog.cpp:25: error: expected unqualified-id before ‘if’
stdout
Standard output is empty