Hi, mein erster Versuch mit OpenGL ist ein mathematisches Pendel. Es soll die kinetische und potentielle Energie angezeigt werden.
Der "Faden" des Pendels bewegt sich schon mathematisch korrekt.
Mein erstes Problem ist, dass die Labels hinter der OpenGL Oberfläche verschwinden. Wie kann ich diese nach "vorne" bekommen?
Ich lasse die kinetische und potentielle Energie mit im Timer berechnen. Irgendwie springt der Manchmal auf unrealistische Werte ( während einer Schwingung). Habe ich nen Fehler bei der Formel gemacht, oder ist es unklug alles mit im Timer berechnen zu lassen?
l=Länge des Fadens m=Masse der Kugel alpha=Auslenkungswinkel alpham=maximaler Auslenkungswinkel
Code:
procedure TForm1.Render;// Ausgabe
begin
// Farb- und Tiefenpuffer leeren
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Durch einen interessanten Zufall sitze ich auch gerade an einer Pendelanwendung
Was mir bei dir auffällt ist, dass du GetTickCount zur Abfrage der verstrichenen Zeit verwendest... GetTickCount gibt dir die Millisekunden nach dem Windowsstart zurück, du solltest dir also eine Methode anschauen, mit der du die verstrichene Zeit zwischen dem aktuellen und dem vorherigen Timeraufruf bekommst.
Was deine Labels betrifft: Die werden auf den Hintergrund des Fensters gezeichnet, und zwar nicht unbedingt nach deinem Rendern. Du könntest das Repaint der Labels nach dem Swap-Buffer aufrufen. Aber ich denke es wäre besser, wenn du dir mal ein paar Codes anschaust, um die Texte direkt in OpenGL anzeigen zu lassen, das ist besser für die Performance.
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
GetTickCount hat den Vorteil, dass es harmonisch weiter läuft. Kannst du mir evtl. erklären, was eine andere Zeitzählung zum Vorteil hätte?
Bin noch ein ziemlicher Anfänger...
Wie kann ich das Repaint der Labels denn Aufrufen? refresh?
Mt der Schrift beschäftige ich mich im nächsten Projekt.
Würde jetzt gerne erst das Pendel fertig kriegen.
Dank dir.
So hast du in FCurrentTime die aktuelle Zeit in Sekunden seit Anwendungsstart.
Du solltest FCurrentTime natürlich beim Initialisieren mit 0.0 und FLastUpdate mit GetTickCount initialisieren.
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Das mit Repaint klappt schon mal. Macht aber nen häßlichen Effekt, da alle Labels von Zeit zu Zeit aufflackern. Kann ich die von Open GL verwendete Oberfläche verkleinern?
So das die Bedienelemente von Delphi gar nicht erst überschrieben werden?
Das mischen von GDI und OpenGL innerhalb eines "Fensters"(Alle von TWinControl abgeleiteten komponenten sind Fenster) ist nicht zu empfehlen(Insbesondere unter Vista). Ich würde für die OpenGL Darstellung ein TPanel plazieren, und Panel1.Handle(oder wie immer das genau heißt) und Panel1.Canvas.Hande beim initialisieren verwenden.
Außerdem bewegt sich ein Pendel nur für infinitesimale Auslenkungen so wie du es berechnest. Das siehst du auch daran, dass bei großen Auslenkungen für eine harmonische Schwingung EGes=EKin+EPot nicht mehr konstant ist (sobald die näherung von cos(x)=1-0.5x^2 nicht mehr gilt).
Die korrekte Bewegung lässt sich leider nicht analytisch integrieren.
EKin=0.5*l^2*(dAlpha/dt)^2
Außerdem bewegt sich ein Pendel nur für infinitesimale Auslenkungen so wie du es berechnest.
Das stimmt. Aber es sieht dennoch noch gut aus mit dieser Näherung :) Wenn man nicht sin(alpha) ~= alpha nähert, wird das schön hässlich. Dann hat man keine lineare DGL 2.ter Ordnung mehr und das ganze Konstrukt vom harmonischen Oszillator blättert dahin...
Was die Darstellung von Text angeht:
Wenn's mal eben schnell gehen soll, dann kannste ja einfach die Caption deiner Form nehmen (Form1.Caption z.B). Soll es schon irgendwie nach etwas aussehen, dann benutze vielleicht einfach die Textdarstellung, welche im Template der DGL implementiert ist!
Hi, sorry dass ich mich nicht schneller gemeldet habe...Bis 8 ° geht das schon einigermaßen auch wenn es dann leichte Abweichungen gibt. Wichtiger ist für mich, dass es vernünftigt schwingt und das tut es.
Werde mich in Zukunft mit OpenGL Text beschäftigen. Eine Idee wäre auch gewesen mehrere Formblätter zu nehmen und die dann nur temporär zu zeigen bzw. zu verstecken.
Hab eben erstmal nen Sonnenystem gemacht (Nur Sonne,Erde,Merkur,Mond). Da müssen jezt noch Texturen drauf Das werde ich wohl noch vorm Text mir anschauen.
Vielen Dank für die Tipps!
Mitglieder in diesem Forum: 0 Mitglieder und 6 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.