2017-03-03 5 views
-1

Also versuche ich eine Textur in OpenGl anzuzeigen, die an die Maus gesendet wird, aber ich kann es nicht so ausführen, wie ich es möchte. Zuerst habe ich versucht, die Textur über 2 Dreiecke anzuzeigen, die ein Quad bilden. Wie folgt aus:Texturen werden mit OpenGL nicht richtig dargestellt

Matrix4 modelViewMatrix = 
      Matrix4.CreateScale((float)Width/Txture.Width, (float)Height/Txture.Height, 1f) * 
      Matrix4.CreateRotationZ(Convert.ToSingle(LookingDir/(180/Math.PI))) * 
      Matrix4.CreateTranslation((float)X_PixPos, (float)Y_PixPos, 0f); 
     GL.MatrixMode(MatrixMode.Modelview); 
     GL.LoadMatrix(ref modelViewMatrix); 


     GL.BindTexture(TextureTarget.Texture2D, Txture.ID); 
     GL.Begin(PrimitiveType.Triangles); 
     GL.Color4(1f, 1f, 1f, 1f); 
     GL.TexCoord2(0, 0); GL.Vertex2(0, 0); 
     GL.TexCoord2(1, 1); GL.Vertex2(Txture.Width, Txture.Height); 
     GL.TexCoord2(0, 1); GL.Vertex2(0, Txture.Height); 

     GL.TexCoord2(0, 0); GL.Vertex2(0, 0); 
     GL.TexCoord2(1, 0); GL.Vertex2(Txture.Width, 0); 
     GL.TexCoord2(1, 1); GL.Vertex2(Txture.Width, Txture.Height); 
     GL.End(); 

Aber da es dreht sich um den Ursprung (0,0) Punkt, der nicht in der Mitte ist es nicht wie beabsichtigt funktioniert. Danach habe ich versucht, den Ursprung in dem Zentrum des Quad wie folgt zu setzen:

 GL.BindTexture(TextureTarget.Texture2D, Txture.ID); 
     GL.Begin(PrimitiveType.Triangles); 
     GL.Color4(1f, 1f, 1f, 1f); 
     GL.TexCoord2(-1f, 1f); GL.Vertex2(-Txture.Width/2.0f, Txture.Height/2.0f); 
     GL.TexCoord2(1f, 1f); GL.Vertex2(Txture.Width/2.0f, Txture.Height/2.0f); 
     GL.TexCoord2(1f, -1f); GL.Vertex2(Txture.Width/2.0f, -Txture.Height/2.0f); 

     GL.TexCoord2(-1f, 1f); GL.Vertex2(-Txture.Width/2.0f, Txture.Height/2.0f); 
     GL.TexCoord2(1f, -1f); GL.Vertex2(Txture.Width/2.0f, -Txture.Height/2.0f); 
     GL.TexCoord2(-1f, -1f); GL.Vertex2(-Txture.Width/2.0f, -Txture.Height/2.0f); 
     GL.End(); 

Da der Code für die Matrix gleich bleibt ich es auf dieser Code-Schnipsel weggelassen. Dies funktioniert fast wie beabsichtigt. Der Ursprung ist in der Mitte und die Textur rotiert um ihn herum, aber anstatt mir die Textur zu zeigen, wird sie 4 mal angezeigt. Schwer zu erklären, also habe ich ein Bild: Texture beeing displayed 4 times instead of once

Also habe ich versucht, es mit einem Quad zu zeichnen, kam aber zu dem gleichen Ergebnis. Die akward Sache ist, dass der erste Versuch korrekt mit und ohne die ModelViewMatrix angezeigt wird. Aber wenn ich den zweiten Code oder das Quad ohne die ModelViewMatrix ausführen, wird es richtig angezeigt. Seit ich mit OpenGl angefangen habe, kann ich meinen Fehler nicht wirklich finden.

Wenn jemand wissen will, was ich zu bauen versuche:

Ich versuche, ein Topdown Spiel zu bauen, aber ich möchte nicht alle diese Phantasie Motoren verwenden, wo man einfach per Drag & Drop alle togther stopfen und bekommen etwas aus. Ich wollte meine eine Engine schreiben, also bin ich auf opentk für Grafiken gestoßen. Aber ich dachte nicht, dass das Rendern einer Textur, die sich in die Position der Maus dreht, so schwer wäre.

Antwort

0

Texturkoordinaten (TexCoord2) sind mehr oder weniger unabhängig von der tatsächlichen geometrischen Position. Sie reichen von [0,0] (oben links) bis [1,1] (unten rechts). Sie sehen 4 Texturen, weil Sie OpenGL sagen, dass es die Textur von -1 auf 1 auf dem Quad abbilden soll. Wenn der Wrap-Modus auf Wiederholung eingestellt ist, bedeutet -1 zu 1 genau zwei Texturen nebeneinander auf jeder Achse.

Wenn Sie nur eine Textur haben, verwenden Sie dann Textur von 0 bis 1 Koordinaten:

GL.TexCoord2(0, 1); GL.Vertex2(-Txture.Width/2.0f, Txture.Height/2.0f); 
GL.TexCoord2(1, 1); GL.Vertex2(Txture.Width/2.0f, Txture.Height/2.0f); 
GL.TexCoord2(1, 0); GL.Vertex2(Txture.Width/2.0f, -Txture.Height/2.0f); 

GL.TexCoord2(0, 1); GL.Vertex2(-Txture.Width/2.0f, Txture.Height/2.0f); 
GL.TexCoord2(1, 0); GL.Vertex2(Txture.Width/2.0f, -Txture.Height/2.0f); 
GL.TexCoord2(0, 0); GL.Vertex2(-Txture.Width/2.0f, -Txture.Height/2.0f); 
+0

für Ihre Hilfe Vielen Dank. Und es zeigte mir direkt mein nächstes Problem. Es scheint, als ob die Rotation von der Position des Objekts beeinflusst wird und wenn ich mich bewege, bleibt das Objekt auf der Maus stehen, aber irgendwann dreht es sich zu sehr und hört nicht auf sich zu drehen. – ZulluF

Verwandte Themen