2012-09-27 8 views
7

To jest dla mojego pierwszego przedmiotu graficznego na uni, a niektóre jego części nie działają dla mnie. Mogę sprawić, że stawy prawidłowo rysują, ale próbuję napisać funkcję, która umieszcza "kości" pomiędzy stawami. W tym momencie kości są po prostu sześcianami, które są przekształcane na prostokątne pryzmaty, w późniejszym czasie spróbuję wprowadzić odpowiednie modele z blendera lub czegoś takiego.Stwórz pełny szkielet 3D z Kinect SDK

Moje kłopoty są z obrotami. Po około 5 godzinach mój partner i ja mamy to działa, ale jak tylko ruszasz ramionami lub nogami, kostki się wypaczają i wyglądają dziwnie. Każda pomoc będzie doceniona. Poniżej znajduje się funkcja, która próbuje narysować kości.

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

Cześć Vince, czy ty kiedykolwiek to robiłeś? Byłby zainteresowany zrozumieniem, jak wyświetlałeś model w 3D. –

Odpowiedz

3

Dla orientacji kości, sprawdź:

skeleton.BoneOrientations[joint.JointType] 

to daje klasę BoneOrientation

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

Stamtąd można mieć rotację albo jako Kwaterniony/Matrix, albo w przestrzeń światowa, lub w przestrzeni kości nadrzędnej (dla skórowania)

również użyć:

new Quaternion(0) 

Jest to wektor 0, nie jest poprawnym quaternion do obrotu, zastosowanie:

Quaternion.Identity; 

który będzie (0,0,0,1)

1

Mimo, że zostało to zadane przed chwilą, to, co jest warte, myślę, że jest również błąd podczas obliczania kąta. Masz:

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

myślę, że trzeba:

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

Here jest ładny mały przykład z matematyki. Można również zrobić im wektor jednostkowy, więc mają długość jednego i nie męczyć się z podziałem:

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

Sprawdź stronę MSDN aby uzyskać więcej informacji.

Powiązane problemy