ofxbox2d映射的puppet(使用ofxopenni)和碰撞检测

时间:2012-12-10 19:25:47

标签: box2d openni openframeworks

我是一名毕业学生,仍在学习openFrameworks,我的c ++可能有点生疏....我正在研究sosolimited / kinectcharacter项目作为一个例子来学习kinect木偶动力学 - 这很有意义。我想把它带到下一步,看看我是否可以添加碰撞检测作为交互机制。而且我一直在把头发拉出来,想要把它拿出来好几个星期,我想要有经验的人的投入!

上下文: 对于每个身体部位,关节位置计算为中点,然后使用旋转函数旋转。这有利于在关节处旋转四肢。我在每个身体部位后面映射了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();

0 个答案:

没有答案