2012-09-27 32 views
7

Bu, ilk grafiklerim uni'de ve uygulamanın bazı bölümlerinde benim için çalışmıyor. Eklemlerin düzgün bir şekilde çizilmesini sağlayabilirim, ama eklemler arasında 'kemiklere' giren bir işlev yazmaya çalışıyorum. Bu noktada kemikler sadece dikdörtgen prizmalar olacak şekilde dönüştürülmüş küpler, daha sonraki bir noktada blenderdan veya uygun bir modelden doğru modelleri tanıtmaya çalışacağım.Kinect SDK ile tam 3d bir iskelet oluşturun SDK

Sorunum, döndürmelerle ilgilidir. Yaklaşık 5 saat sonra eşim ve ben bir çeşit çalışıyoruz, ama kollarınızı veya bacaklarınızı hareket ettirdiğiniz anda küpler çözgü ve garip görünüyor. Herhangi bir yardım takdir edilecektir. Aşağıda kemikleri çizmeye çalışan işlevdir.

kemik yönelimleri için
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

Merhaba Vince, bunu hiç yaptın mı? Modeli 3B'de nasıl görüntülediğinizi anlamak ilginizi çeker. –

cevap

1

:

new Quaternion(0) 

Bu 0 vektör, rotasyon için geçerli bir quaternion, kullanımıdır Her ne kadar bu bir süre önce sorulmuş olsa da, ne olduğu için, sizin açınızı hesaplarken de bir hata olduğunu düşünüyorum. Şu ana kadar:

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

Sana ihtiyacım var:

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

Here matematik güzel bir örnektir. Ayrıca onlara birim vektörleri yapabilir, bu yüzden birinin bir uzunluğa sahiptir ve bölünme ile rahatsız:

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

kontrol dışarı MSDN sayfa daha fazla bilgi için.