2012-09-27 16 views
7

Dies ist für meine erste Grafik Thema an der Uni, und einige Teile der Umsetzung funktionieren einfach nicht für mich. Ich kann die Gelenke dazu bringen, richtig zu zeichnen, aber ich versuche eine Funktion zu schreiben, die "Knochen" zwischen die Gelenke legt. An dieser Stelle sind die Knochen nur Würfel, die in rechteckige Prismen umgewandelt werden, zu einem späteren Zeitpunkt werde ich versuchen, richtige Modelle aus dem Mixer oder etwas einzuführen.Erstellen Sie ein komplettes 3D-Skelett mit Kinect SDK

Mein Problem ist mit den Rotationen. Nach ungefähr 5 Stunden oder so haben mein Partner und ich es irgendwie funktioniert, aber sobald Sie Ihre Arme oder Beine bewegen, verziehen sich die Würfel und sehen seltsam aus. Jede Hilfe wäre willkommen. Unten ist die Funktion, die versucht, die Knochen zu zeichnen.

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

Hallo Vince, hast du das jemals hinbekommen? Wäre daran interessiert zu verstehen, wie Sie das Modell in 3D angezeigt haben. –

Antwort

3

Für Knochen Orientierungen überprüfen:

skeleton.BoneOrientations[joint.JointType] 

es Ihnen eine BoneOrientation Klasse geben

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

Von dort aus können Sie Rotation entweder als Quaternion/Matrix, entweder in Weltraum oder im Knochenraum des Elternteils (zum Enthäuten)

Auch Sie verwenden:

new Quaternion(0) 

Dies ist ein 0-Vektor, keine gültige quaternion zur Rotation, zu verwenden:

Quaternion.Identity; 

die (0,0,0,1)

1

sein Obwohl dies schon vor einiger Zeit gefragt wurde, denke ich, dass es auch einen Fehler gibt, wenn Sie Ihren Winkel berechnen. Sie haben:

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

Ich glaube, Sie brauchen:

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

Here ein nettes kleines Beispiel für die Mathematik ist. Sie könnten auch sie Einheitsvektoren machen, so dass sie eine Länge von einem und nicht mit der Teilung stören:

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

Schauen Sie sich die MSDN Seite für weitere Informationen.