Seite 1 von 1
XNA - Rotieren um die eigene Achse
Verfasst: 24.06.2010, 21:14
von Gentlex
Hallo,
ich habe einen Source-Code mit dem ich ein Dreieck um sich selbst rotieren lassen will. Er rotiert aber um den gloabalen Mittelpunkt.
XNA-Code :
...
effect.Parameters["xViewProjection"].SetValue(viewMatrix * projectionMatrix * Matrix.CreateRotationX(angle));
...
HLSL-Effect-Code:
...
VertexToPixel SimplestVertexShader( float4 inPos : POSITION, float4 inColor : COLOR0)
{
VertexToPixel Output = (VertexToPixel)0;
Output.Position =mul(inPos, xWorldViewProjection);
Output.Color = inColor;
return Output;
}
...
Re: XNA - Rotieren um die eigene Achse
Verfasst: 24.06.2010, 22:05
von klickverbot
Du musst das Dreieck in den Ursprung verschieben, dann rotieren, und dann wieder zurück verschieben. Das kannst du erreichen, indem du vor und nach die Multiplikation mit der Rotationsmatrix die jeweilige Translationsmatrix einfügst.
Re: XNA - Rotieren um die eigene Achse
Verfasst: 25.06.2010, 20:50
von Gentlex
Das sind doch drei Vertices, woher soll ich wissen, wo der Urspung ist ?
Re: XNA - Rotieren um die eigene Achse
Verfasst: 25.06.2010, 21:12
von klickverbot
Nun, du willst dein Dreieck um die eigene Achse rotieren. Da stellt sich natürlich die Frage, was die eigene Achse nach deiner Auffassung überhaupt ist – nämlich…?
Mit Ursprung ist übrigens der Schnittpunkt der Koordinatenachsen, also der Punkt (0,0,0) gemeint.
Ach ja, kann es sein, dass du im geposteten Codeausschnitt die Multiplikationsreihenfolge vertauscht hast? Ich würde meinen, dass da Matrix.CreateRotationX(angle) * viewMatrix * projectionMatrix bzw. Matrix.CreateTranslation( -trianglePosition ) * Matrix.CreateRotationX(angle) * Matrix.CreateTranslation( trianglePosition ) * viewMatrix * projectionMatrix stehen sollte, aber ich bin mir nicht sicher, welcher Konvention XNA folgt.
Re: XNA - Rotieren um die eigene Achse
Verfasst: 26.06.2010, 19:41
von Gentlex
Aber was soll ich bei Matrix.CreateTranslation( trianglePosition ) angeben ? 0,0,0 ?
Re: XNA - Rotieren um die eigene Achse
Verfasst: 26.06.2010, 20:17
von klickverbot
Eben einen Punkt, durch den die Drehachse verlaufen soll. Ich weiß nach wie vor nicht, was für dich »um die eigene Achse drehen« genau heißt, aber du könntest einmal versuchen, einfach den Schwerpunkt des Dreiecks zu nehmen, in Pseudocode also var trianglePosition = ( vertex0 + vertex1 + vertex2 ) / 3.
Re: XNA - Rotieren um die eigene Achse
Verfasst: 27.06.2010, 18:59
von Gentlex
Um die eigene Achse drehen, damit meine ich um den Trianglemittelpunkt um x oder y . Wenn ich eine Translation mache, kann ich nur einen Vertex angeben, wie soll ich da die drei Vertices angeben ?
Re: XNA - Rotieren um die eigene Achse
Verfasst: 27.06.2010, 19:58
von Zudomon
Dein Trianglemittelpunkt ist doch genau ein Vertex und nicht drei. Allerdings ein virtueller.
Re: XNA - Rotieren um die eigene Achse
Verfasst: 27.06.2010, 20:12
von Gentlex
Ich habe folgende Vertices :
vertices[0] = new MyOwnVertexFormat(new Vector3(0,0 , 0), Color.Red);
vertices[1] = new MyOwnVertexFormat(new Vector3(1, 0, 0), Color.Green);
vertices[2] = new MyOwnVertexFormat(new Vector3(0, 1, 0), Color.Yellow);
und habe es wie klickverbot gemacht, aber er es funktioniert nicht
effect.Parameters["xWorldViewProjection"].SetValue(Matrix.CreateTranslation(new Vector3(-0.5f,-0.5f,0))*
view* projection * Matrix.CreateRotationX((float)Math.PI* move/180)*Matrix.CreateTranslation(new Vector3(0.5f,0.5f,0))
Re: XNA - Rotieren um die eigene Achse
Verfasst: 27.06.2010, 20:22
von Zudomon
Du musst die Reihenfolge beachten... Model * View * Projection
effect.Parameters["xWorldViewProjection"].SetValue(
Matrix.CreateTranslation(new Vector3(-0.5f,-0.5f,0)) *
Matrix.CreateRotationX((float)Math.PI* move/180) *
Matrix.CreateTranslation(new Vector3(0.5f,0.5f,0) *
view * projection)
Re: XNA - Rotieren um die eigene Achse
Verfasst: 27.06.2010, 21:13
von Gentlex
Danke das war die Lösung
Re: XNA - Rotieren um die eigene Achse
Verfasst: 27.06.2010, 21:30
von Gentlex
So, jetzt habe ich gleich das nächste Problem : Ich versuche nun nicht mehr ein Dreieck, sondern ein Grid zu rotieren, leider geht das schief.
Ich habe zunächst diesen Code :
effect.Parameters["xViewProjection"].SetValue(Matrix.CreateTranslation(-0.5f, -0.5f, 0) *
Matrix.CreateRotationX((float)Math.PI * move / 180) *
Matrix.CreateTranslation(0.5f, 0.5f, 0)
wenn ich das mache, rendert er mir wieder eine falsche Rotationsmatrix. Wenn ich view und projection dazumultipliziere, zeigt er mir gar nichts an.
view und projection sind aber gültig
Re: XNA - Rotieren um die eigene Achse
Verfasst: 27.06.2010, 23:33
von Zudomon
Verwendest du diesmal ein anderes Handle für den Effekt?
"xViewProjection" statt "xWorldViewProjection" ?
Re: XNA - Rotieren um die eigene Achse
Verfasst: 28.06.2010, 21:22
von Gentlex
Warum, was ist da der Unterschied ?