2012-09-27 10 views
7

これは私の最初のグラフィックス対象のuniであり、実装のいくつかの部分だけが私のために働いていません。私は適切に描画する関節を得ることができますが、私は関節の間に '骨'を入れて関数を記述しようとしています。この時点では、骨は直方体に変形された立方体だけであり、後でミキサーなどから適切なモデルを導入しようとします。Kinect SDKを使用してフル3Dスケルトンを作成

私のトラブルは回転です。約5時間かかりましたが、私のパートナーと私はそれが働いていますが、腕や足を動かすと直ちに歪んで奇妙に見えます。どんな助けもありがとう。以下は、骨を描こうとする機能です。骨の向きについては

private void DrawBone(Skeleton skeleton, JointType jointType0, JointType jointType1) 
{ 
    Joint joint0 = skeleton.Joints[jointType0]; 
    Joint joint1 = skeleton.Joints[jointType1]; 

    // If we can't find either of these joints, exit 
    if (joint0.TrackingState == JointTrackingState.NotTracked || 
     joint1.TrackingState == JointTrackingState.NotTracked) 
    { 
     return; 
    } 

    // Don't draw if both points are inferred 
    if (joint0.TrackingState == JointTrackingState.Inferred && 
     joint1.TrackingState == JointTrackingState.Inferred) 
    { 
     return; 
    } 

    // We assume all drawn bones are inferred unless BOTH joints are tracked 
    if (joint0.TrackingState == JointTrackingState.Tracked && joint1.TrackingState == JointTrackingState.Tracked) 

     //jointvector(joint) takes a joint and returns a Vector2 with its position data, with the z invtred to work properly with directx11 
     Vector3 bonevector = Vector3.Subtract(jointVector(joint0), jointVector(joint1)); 
     //cubevector is supposed to describe the initial vector of a cube centred at (0,0,0) with a side length of 2. A fair amount of guesswork has gone into this bit. 
     Vector3 cubevector = new Vector3(0, 2, 0); 
     //midpoint of two joints 
     Vector3 transTest = Vector3.Divide(Vector3.Add(jointVector(joint0),jointVector(joint1)), 2); 
     //divide by two because our original cube has side length 2 
     float scaleFactor = Math.Abs(bonevector.Length()/cubevector.Length()); 

     //we haven't been taught quaternions in class or anything, but after a fair while searching for similar problems they seemed like the go-to option for rotations. 
     world = Matrix.Transformation(new Vector3(0, 0, 0), new Quaternion(0), new Vector3(0.05f, scaleFactor, 0.05f), new Vector3(0, 0, 0), new Quaternion(Vector3.Cross(cubevector, bonevector), (float)Math.Acos(Vector3.Dot(bonevector, cubevector))), transTest);  

     //view and proj are defined elsewhere and are working fine, it's just the world that is being lame   
     worldViewProj = world * view * proj; 
     worldViewProj.Transpose(); 
     sDXdata.context.UpdateSubresource(ref worldViewProj, sDXdata.constantBuffer); 
     //36 vertices of the cube (two triangles per face) defined elsewhere 
     sDXdata.context.Draw(36, 0); 
     return; 
+0

こんにちはヴィンス、これはこれまで行ったことがありますか?モデルを3Dでどのように表示したかを理解することに興味があります。 –

答えて

3

、チェック:

skeleton.BoneOrientations[joint.JointType] 

を、それはあなたがいずれかで、どちらかのクォータニオン/マトリックスとしての回転を持つことができ、そこからあなたの

http://msdn.microsoft.com/en-us/library/microsoft.kinect.boneorientation.aspx

をBoneOrientationクラスを提供しますワールドスペース、または親の骨空間(スキニング用)

また、あなたが使用します。

new Quaternion(0) 

これは0ベクトルではなく、回転のための有効な四元数、使用することである:

Quaternion.Identity; 

される(0,0,0,1)

1

これはしばらく前に尋ねられましたが、あなたがあなたの角度を計算するときには誤りがあると思います。あなたが持っている:

(float)Math.Acos(Vector3.Dot(bonevector, cubevector) 

私はあなたが必要だと思う:

(float)Math.Acos(Vector3.Dot(bonevector, cubevector)/(bonevector.Length() * 
cubevector.Length())) 

Hereは数学のちょっといい例です。あなたはまた、それらの単位ベクトル作ることができるので、彼らは分裂を気に1の長さを持っていない:

(float)Math.Acos(Vector3.Dot(bonevector.Normalize(), cubevector.Normalize())) 

詳細についてはMSDNページをご覧ください。

関連する問題