Zurück zur Gesamtübersicht "Physik mit Direct3D"
In unserem Projekt sind jetzt insgesamt vier Headerdateien nötig.
Folglich solltest Du folgende vier Include-Befehle bereits vorfinden:
Zusätzlich zu den bisher vorhandenen globalen Variablen Form1 und lpControl3D benötigen wir auch noch eine globale Variable für unsere 3D-Szene. Ergänze darum eine entsprechende Deklaration:
Um die 3D-Szene in regelmäßigen Zeitabständen am Bildschirm zu zeichnen, verwenden wir in unserem Projekt einen Timer. Füge deshalb Deinem Projekt einen Timer namens Timer1 hinzu.
Der Timer soll zum Programmbeginn deaktiviert sein und z.B. alle 25 ms aufgerufen werden. Setze die Eigenschaften von Timer1 entsprechend (siehe rechts).
Zu Beginn unseres Programms sollen insgesamt drei Dinge geschehen:
Das Direct3D-Einstellungsfenster soll erscheinen.
Das Control3D-Objekt zur Steuerung von Direct3D wird erstellt.
Das MyScene3D-Objekt mit unserer 3D-Szene wird ins Leben gerufen.
Der Timer Timer1 für das regelmäßige Zeichnen der 3D-Szene wird aktiviert.
Die Programmierung der Ereignisbehandlungsmethode FormCreate kann zum Beispiel so aussehen:
void __fastcall TForm1::FormCreate(TObject *Sender) { Direct3DParameters p; FormDirect3DSetup = new TFormDirect3DSetup(this); p = FormDirect3DSetup->execute(); delete FormDirect3DSetup; lpControl3D = new Control3D(p, Form1); lpMyScene3D = new MyScene3D(lpControl3D); Timer1->Enabled = true; //Timer1 sorgt für regelmäßiges Zeichnen der Szene }
Zum Schluss des Programms muss...
...der Timer Timer1 abgeschaltet werden.
...das anfangs erzeugte Control3D-Objekt und das MyScene3D-Objekt wieder zerstört werden.
Zu diesem Zweck könnte die Ereignisbehandlungsmethode FormDestroy in etwa wie folgt ausprogrammiert werden:
void __fastcall TForm1::FormDestroy(TObject *Sender) { Timer1->Enabled = false; if(lpMyScene3D) { delete lpMyScene3D; } if(lpControl3D) { delete lpControl3D; } }
Mit Hilfe des Timers Timer1 erreichen wir, dass...
...alle 3D-Objekte der 3D-Szene um einen Schritt bewegt werden (move).
...die gesamte 3D-Szene samt aller 3D-Objekte gezeichnet wird (render).
Und das geht ganz einfach so:
void __fastcall TForm1::Timer1Timer(TObject *Sender) { lpMyScene3D->move(); lpMyScene3D->render(); }
Starte nun das Projekt. Falls kein Fehler mehr auftaucht, müsste eine fliegende Billardkugel zu sehen sein, die sich unter dem Einfluss der Erdanziehung auf einer parabelartige Kurve bewegt... Gratulation!
Für alle Fälle kannst Du aber die kompletten C++Builder-Projekt-, Unit- und Headerdateien zu diesem ersten 3D-Projekt hier herunterladen: info_ProjectHomepage1.zip
Nachdem wir diese Etappe erreicht haben, solltest Du einfach mal versuchen, 3D-Szenen mit mehreren Objekten zu erzeugen, die sich gleichzeitig durchs Bild bewegen.
(Auf diese Weise ist übrigens im Laufe des Wahlkurses ein richtiges Pool-Billard entstanden!)
Gutes Gelingen!
[Dieser Kurs wird fortgesetzt - Stand: 9. August 2005]
Zurück zur Gesamtübersicht "Physik mit Direct3D"