XNA - Rotieren um die eigene Achse
XNA - Rotieren um die eigene Achse
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;
}
...
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;
}
...
-
- Establishment
- Beiträge: 191
- Registriert: 01.03.2009, 19:22
- Echter Name: David N.
Re: XNA - Rotieren um die eigene Achse
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
Das sind doch drei Vertices, woher soll ich wissen, wo der Urspung ist ?
-
- Establishment
- Beiträge: 191
- Registriert: 01.03.2009, 19:22
- Echter Name: David N.
Re: XNA - Rotieren um die eigene Achse
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.
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
Aber was soll ich bei Matrix.CreateTranslation( trianglePosition ) angeben ? 0,0,0 ?
-
- Establishment
- Beiträge: 191
- Registriert: 01.03.2009, 19:22
- Echter Name: David N.
Re: XNA - Rotieren um die eigene Achse
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
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
Dein Trianglemittelpunkt ist doch genau ein Vertex und nicht drei. Allerdings ein virtueller.
Re: XNA - Rotieren um die eigene Achse
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))
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
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)
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
Danke das war die Lösung
Re: XNA - Rotieren um die eigene Achse
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
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
Verwendest du diesmal ein anderes Handle für den Effekt?
"xViewProjection" statt "xWorldViewProjection" ?
"xViewProjection" statt "xWorldViewProjection" ?
Re: XNA - Rotieren um die eigene Achse
Warum, was ist da der Unterschied ?