2010-12-21 4 views
0

Ich versuche, ein im Uhrzeigersinn drehendes Dreieck zu machen, aber ich kann nicht. Ich habe eine Timer-Kontrolle gemacht, aber das Ergebnis ist dasselbe ohne den Timer. Der folgende Code zeigt daher kein sich drehendes Dreieck. Wie kann ich Dreieck mit CSGL drehen?Wie kann ich das Dreieck (im Uhrzeigersinn) mit CSGL drehen?

namespace WinDrawCoordinate 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private float a = 0.0f; 
     private void Form1_Load(object sender, EventArgs e) 
     { 

      timer1.Start(); 
     } 

     protected void Gosterim() 
     { 
      GL.glClear(GL.GL_COLOR_BUFFER_BIT); 
      GL.glLoadIdentity(); 
      Hesapla(); 
      Ucgen(); 

     } 
     protected void ayarlar() 
     { 
      GL.glClearColor(1, 1, 1, 1); 
      GL.glShadeModel(GL.GL_FLAT); 
     } 
     protected void Hesapla() 
     { 
      a += 0.5f; 
      this.Refresh(); 
     } 

     protected void Ucgen() 
     { 
      GL.glColor3f(0, 1, 1); 
      GL.glRotatef(a, 0, 0, -1); 
      GL.glBegin(GL.GL_TRIANGLES); 
      GL.glVertex2f(-0.2f, -0.2f); 
      GL.glVertex2f(0.2f, -0.2f); 
      GL.glVertex2f(0.0f, 0.2f); 
      GL.glEnd(); 
     } 

     private void timer1_Tick(object sender, EventArgs e) 
     { 
      ayarlar(); 

      Gosterim(); 
     } 
    }
+0

Gibt es einen besonderen Grund, warum Sie nicht mit WPF 3D gehen? –

+0

Was * macht * das Programm? Zeigt es überhaupt etwas oder nur ein stationäres Dreieck? Wo richten Sie Ihre Projektionsmatrix ein? – genpfault

+0

CSGL hat die Entwicklung im Jahr 2003 eingestellt. Ist es eine gute Idee, diese Bibliothek zu verwenden, wenn es zahlreiche andere * aktuelle * Grafikbibliotheken mit aktiven Communities/Support gibt? Nur ein Gedanke – curtisk

Antwort

1

Vom Code geschrieben ich sehe ein paar Dinge:

  1. Sie haben keine Matrix set-up. Während Sie die Standardmatrizen verwenden können, sollten Sie fast sicher Ihre eigenen angeben, um sicherzustellen, dass das Dreieck dort ist, wo Sie es erwarten. Die Standardmatrizen sollten für Sie arbeiten, da sie eine Identitätsmodellansicht und -projektion angeben.

  2. Sie haben keinen Aufruf zum Austauschen von Puffern. Sie benötigen einen Anruf, nachdem Sie mit dem Zeichnen fertig sind, um den vorderen und hinteren Puffer zu tauschen, so dass das Dreieck angezeigt wird. Für CsGL denke ich, dass es eine SwapBuffer() Methode gibt, die Sie verwenden können.

  3. Verwenden Sie keinen Timer, um das Neuzeichnen zu pumpen. Timer arbeiten unzuverlässig, da sie die Windows-Nachrichtenpumpe verwenden und es schwierig ist, gute Ergebnisse zu erzielen. Stattdessen sollten Sie eine Render-Schleife verwenden - eine Schleife, die während der gesamten Laufzeit Ihres Programms ausgeführt wird und nur den Bildschirm aktualisiert. Sie müssen sicherstellen, dass Sie dem Betriebssystem Zeit geben, Ihre Nachrichten zu verarbeiten. Eine sehr einfache Render-Schleife könnte sein:

    void RenderLoop() { 
        while (true) { 
        SetUpCamera(); 
        CreateGeometry(); 
        SwapBuffers(); 
        Application.DoEvents(); // this lets windows process messages 
        } 
    } 
    

    beachten Sie, dass es bessere Möglichkeiten, eine gute Nachricht Schleife in C# zu bekommen, aber das ist einfach einzurichten und Grund über.

0

Doppel diese Zeile überprüfen:

GL.glRotatef(a, 0, 0, -1); 

Sollte es nicht sein?

GL.glRotatef(a, 0, 0, 1); 

Sieht aus wie Ihr Zuwachs auf den Drehwinkel (a) in Ordnung sein sollte .... aber wie schnell wird der Timer „tickt“ und ayarlar und Gosterim abzufeuern?

Auch möchten Sie vielleicht einen Scheck in Bezug auf den Drehwinkel addieren, wenn es viel und geht über 359,5 Schleppen (Da Sie 0,5 hinzufügen, jedes Mal durch), dann sind Sie „Full Circle“ geht buchstäblich

Verwandte Themen