XNA - Rotieren um die eigene Achse

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Gentlex
Beiträge: 10
Registriert: 24.06.2010, 21:10

XNA - Rotieren um die eigene Achse

Beitrag 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;
}
...
klickverbot
Establishment
Beiträge: 191
Registriert: 01.03.2009, 19:22
Echter Name: David N.

Re: XNA - Rotieren um die eigene Achse

Beitrag 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.
Gentlex
Beiträge: 10
Registriert: 24.06.2010, 21:10

Re: XNA - Rotieren um die eigene Achse

Beitrag von Gentlex »

Das sind doch drei Vertices, woher soll ich wissen, wo der Urspung ist ?
klickverbot
Establishment
Beiträge: 191
Registriert: 01.03.2009, 19:22
Echter Name: David N.

Re: XNA - Rotieren um die eigene Achse

Beitrag 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.
Gentlex
Beiträge: 10
Registriert: 24.06.2010, 21:10

Re: XNA - Rotieren um die eigene Achse

Beitrag von Gentlex »

Aber was soll ich bei Matrix.CreateTranslation( trianglePosition ) angeben ? 0,0,0 ?
klickverbot
Establishment
Beiträge: 191
Registriert: 01.03.2009, 19:22
Echter Name: David N.

Re: XNA - Rotieren um die eigene Achse

Beitrag 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.
Gentlex
Beiträge: 10
Registriert: 24.06.2010, 21:10

Re: XNA - Rotieren um die eigene Achse

Beitrag 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 ?
Benutzeravatar
Zudomon
Establishment
Beiträge: 2259
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: XNA - Rotieren um die eigene Achse

Beitrag von Zudomon »

Dein Trianglemittelpunkt ist doch genau ein Vertex und nicht drei. Allerdings ein virtueller.
Gentlex
Beiträge: 10
Registriert: 24.06.2010, 21:10

Re: XNA - Rotieren um die eigene Achse

Beitrag 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))
Benutzeravatar
Zudomon
Establishment
Beiträge: 2259
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: XNA - Rotieren um die eigene Achse

Beitrag 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)
Gentlex
Beiträge: 10
Registriert: 24.06.2010, 21:10

Re: XNA - Rotieren um die eigene Achse

Beitrag von Gentlex »

Danke das war die Lösung
Gentlex
Beiträge: 10
Registriert: 24.06.2010, 21:10

Re: XNA - Rotieren um die eigene Achse

Beitrag 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
Benutzeravatar
Zudomon
Establishment
Beiträge: 2259
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: XNA - Rotieren um die eigene Achse

Beitrag von Zudomon »

Verwendest du diesmal ein anderes Handle für den Effekt?

"xViewProjection" statt "xWorldViewProjection" ?
Gentlex
Beiträge: 10
Registriert: 24.06.2010, 21:10

Re: XNA - Rotieren um die eigene Achse

Beitrag von Gentlex »

Warum, was ist da der Unterschied ?
Antworten