1

我是一名仍在学习 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();
4

0 回答 0