Direct3D - Objekt rotieren
-
Hi, ich code grade an einem kleinen Kartenspiel mit C# und DirectX9.
Am Anfang sollen meine Spielkarten mit dem Kartenrücken auf dem Tisch liegen.
Wenn der Spieler dann die Starttaste drückt, sollen sich die Karten um die eigene Achse drehen, bis sie offen auf dem Tisch liegen.
Es handelt sich dabei um texturierte 3D-Karten.
Genau in dieser Drehung liegt nun mein Problem, das ich nicht gebacken bekomme.
Die Karten drehen sich zwar, aber nicht um die eigene Achse.
Ich hoffe, dass mir jemand einen Ratschlag oder Denkanstoss geben kann, was ich falsch gemacht habe.
Die Antwort kann auch in C++-Code sein.
Danke für eure Hilfe !// hier iss irgendwo beginscene matRotationX=Matrix.RotationX(fAngle); device.SetTransform(Microsoft.DirectX.Direct3D.TransformType.World,matRotationX); device.Transform.View = Matrix.LookAtLH( new Vector3( 0.0f, 3.0f, 5.0f ), new Vector3( 0.0f, 0.0f, 0.0f ), new Vector3( 0.0f, 1.0f, 0.0f ) ); device.Transform.Projection = Matrix.PerspectiveFovLH( (float)Math.PI / 4, 1.0f, 1.0f, 100.0f ); device.SetTexture(0,texture); device.TextureState[0].ColorOperation = TextureOperation.Modulate; device.TextureState[0].ColorArgument1 = TextureArgument.TextureColor; device.TextureState[0].ColorArgument2 = TextureArgument.Diffuse; device.TextureState[0].AlphaOperation = TextureOperation.Disable; device.SetStreamSource( 0, vertexBuffer, 0); device.VertexFormat = CustomVertex.PositionNormalTextured.Format; device.Indices=indexBuffer; device.DrawIndexedPrimitives(Microsoft.DirectX.Direct3D.PrimitiveType.TriangleList,0,0,8,0,4); // hier iss irgendwo endscene
-
Ich vermute mal das deine Karten um den World 0,0,0 Vektor rotieren, du die Karten aber mit absoluten Koordinaten positionierst.
Dein Ziel (die Frehung um die eigene Achse) müsstes du erreichen, indem du noch ein TranslationMatrix für dne Kartenmittelpunkt erzeugst udn diese mit der RotationsMatrix multipliziert und dann SetTransform aufrufst.
Also z.B.:
(Ich weis jetzt nicht wie das in C# richtig aussieht, damit hab ich noch nie D3D gemacht)matRotationX = Matrix.RotationX(fAngle); matPosition = Matrix.Position(karte.x, karte.y, karte.z); //? matWorld = matRotation * matPosition; //? device.SetTransform(Microsoft.DirectX.Direct3D.TransformType.World,matWorld);
-
Dein Code macht genau das entgegengesetzte was in deinem Text beschrieben ist.
Satz: Matrixmultiplikationen ist im Allgemeinen _nicht_ kommutativ.
Bye, TGGC \-/
-
so, habs nun gebacken bekommen.
so ein blonder fehler
Thread kann geschlossen werden - Danke für eure hilfe !