1

私はまだopenFrameworksを学んでいる大学院生であり、私のc++は少し錆びているかもしれません....私はkinectpuppetのダイナミクスを学ぶための例としてsosolimited/kinectcharacterプロジェクトを見ていました-それは非常に理にかなっています。それを次のステップに進めて、相互作用メカニズムとして衝突検出を追加できるかどうかを確認したかったのです。そして、私は数週間これを理解しようとして髪を抜いてきました、そして私は経験豊富な人々からのインプットを望んでいます!

コンテキスト:各身体部分について、関節の位置は中点として計算され、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