我是一名仍在学习 openFrameworks 的研究生,我的 c++ 可能有点生疏……我以 sosolimited / kinectcharacter 项目为例来学习 kinect puppet 动力学——这很有意义。我想把它带到下一步,看看我是否可以添加碰撞检测作为交互机制。我一直在努力解决这个问题,花了几个星期来解决这个问题,我希望有经验的人提供意见!
上下文:对于每个身体部位,关节位置计算为中点,然后使用 ofRotate 函数旋转。这对于在关节处旋转四肢是有意义的。我在每个身体部位(乌鸦后面的白色矩形)后面映射了 ofxbox2drect 对象。
问题当我在 testApp.cpp 中调用此函数时,ofxBox2drect 对象(下落的原木)不会与旋转的肢体交互。这是因为我的身体部位的 ofxbox2drect 对象是在它们自己的旋转平移上(由关节位置偏移 + 从位置 0,0 旋转)。落下的原木不是这些翻译的一部分,所以它总是丢失四肢。
帮助 您对更好的方法有什么建议吗?如果有关于如何使用 box2d 和基于 kinect 的木偶的最佳实践,我将不胜感激!
代码 - 人偶身体部位
for (int i=0; i<user_generatorMain.GetNumberOfUsers(); i++) {
int id = i+1;
// check user being tracked
if(!user_generatorMain.GetSkeletonCap().IsTracking(id)) {
//printf("Not tracking this user: %d\n", id);
return;
}
xn::SkeletonCapability pUserSkel = user_generatorMain.GetSkeletonCap();
// doing an average of joints 1 and 2 here for situations like torso where there is no midpoint joint
XnPoint3D position[3];
XnSkeletonJointPosition jointPos[3];
pUserSkel.GetSkeletonJointPosition(id, joints[0], jointPos[0]);
pUserSkel.GetSkeletonJointPosition(id, joints[1], jointPos[1]);
pUserSkel.GetSkeletonJointPosition(id, joints[2], jointPos[2]);
position[0] = jointPos[0].position;
position[1] = jointPos[1].position;
position[2] = jointPos[2].position;
// check accurate enough
if(jointPos[0].fConfidence < 0.3f || jointPos[1].fConfidence < 0.3f || jointPos[2].fConfidence < 0.3f) {
return;
}
depth_generatorMain.ConvertRealWorldToProjective(3, position, position);
position[0].X = position[0].X*ofGetWidth()/640.0f;
position[0].Y = position[0].Y*ofGetHeight()/480.0f;
position[1].X = (position[1].X+position[2].X)*ofGetWidth()/(2.0*640.0f);
position[1].Y = (position[1].Y+position[2].Y)*ofGetHeight()/(2.0*480.0f);
XnPoint3D midPosition;
midPosition.X = (position[0].X+position[1].X)/2;
midPosition.Y = (position[0].Y+position[1].Y)/2;
float angle = M_PI/2 + atan((position[1].Y-midPosition.Y)/(position[1].X-midPosition.X));
if (position[1].X > position[0].X) angle -= M_PI;
printf("%f %d %f %f %d %f %f\n", ofRadToDeg(angle), joints[0], position[0].X, position[0].Y, joints[1], position[1].X, position[1].Y);
ofPushMatrix();
float h = scale * abs(ofDist(position[0].X, position[0].Y, position[1].X, position[1].Y));
float w = h * (float)img.width / (float)img.height;
ofTranslate( midPosition.X, midPosition.Y );
ofRotate(ofRadToDeg(angle), 0, 0, 1);
b2dPart.setPhysics(0,0,0);
b2dPart.setup(world->getWorld(), 0,0, w*.60, h*.60);
b2dPart.draw(); // box2d rectangle object mapped to a body part
img.draw(0, 0, layer, w, h); //limb image png for a body part
ofPopMatrix();