Ich hab eine file mit mehreren position einer Camera abgespeicher
x,y,z = Koordinanten
rx,ry =Blick links-recht und oben unten diese lade ich dann in eine arry und nun muss ich ja berechnen wie die bewegung am besten verlaufen soll
Kennt jemand ne Lösung oder ein gutes Tutorial. Meine Cam soll über ein Landscape sanf und locker rum fliegen.Wie in Demos, wie man sie von Nehe kennt.
Registriert: Sa Okt 26, 2002 17:14 Beiträge: 188 Wohnort: Hannover/Lüneburg
Hallo!
Also eine Möglichkeit wären Bezier-Kurven, zu denen es hier auch ein gutes Tutorial gibt, oder aber, was wohl deinen Bedürfnissen noch mehr entsprechen könnte: Spline-Funktionen. Das hatten welche bei mir im Mathe-LK als Facharbeitsthema (wenn da auch 2dimensional), aber umgesetzt habe ich das noch nicht. Wollte ich demnächst mal machen, und auch gucken, ob und wie gut das überhaupt für 3d geht.
_________________ Thunderman
Bei schwierigen Problemen entscheiden wir uns einfach für die richtige Lösung. Klar?
Das ist jetzt wirklich etwas kompliziert, das in wenigen Worten zu erklären (und das Evaluator-Tutorial hier wird dir für dieses Problem auch nicht viel weiter helfen - da wird nur gezeigt, wie man OpenGL Evaluatoren zeichnet).
Du brauchst zwei Sachen: - eine Routine, die als Eingabe deine Punkte als Kontrollpunkte einer glatten Kurve nimmt, da gibts übrigens auch wieder viele Möglichkeiten - die Einfachste ist, die Kurve durch Kreissegmente durch die Punkte darzustellen, wobei die Tangente der Segmente an den Kontrollpunkten gleichgerichtet sein sollte. Weil das aber nicht so toll aussieht - ist zwar glatt, aber irgendwie viel zu bauchig, verwendet OpenGL z.B. Bernstein-Polynome für die Kurvendarstellung, die viel schöner sind.
Hier findest du einen Artikel darüber, mit dem ich, zusammen mit den Informationen im Red-Book, einen 2D-Evaluator-Algorithmus umgesetzt habe: <a href='http://www.uni-paderborn.de/fachbereich/AG/agdomik/computergrafik/cg_skript/html/node78.htm' target='_blank'>http://www.uni-paderborn.de/fachbereich/AG...html/node78.htm</a>
Wenn du jetzt glaubst, dass es nicht mehr schlimmer kommen kann - dann hast du dich getäuscht. Denn jetzt kannst du zwar jede beliebige Position auf der Kurve berechnen, hast aber keine Ahnung, wie die Kamera denn nun ausgerichtet sein soll. Hier müsstest du nun die erste Ableitung deines errechneten Polynoms nehmen - und die Tangente wäre dann die zu jedem Punkt gehörende Blickrichtung. Der Einfachheit halber, nimmst du aber einfach einen Punkt der etwas "vor" deiner aktuellen Position liegt - und am Differenzvektor richtest du dann die Kamera aus.
Das ist jetzt wirklich etwas kompliziert, das in wenigen Worten zu erklären (und das Evaluator-Tutorial hier wird dir für dieses Problem auch nicht viel weiter helfen - da wird nur gezeigt, wie man OpenGL Evaluatoren zeichnet).
Unsinn... Die OpenGl Evaluators werden nur am Ende beschrieben, wie man Patches selber berechnet wird lang und breit erklärt, alle nötigen Formeln liegen auch bei...
Unsinn... Die OpenGl Evaluators werden nur am Ende beschrieben, wie man Patches selber berechnet wird lang und breit erklärt, alle nötigen Formeln liegen auch bei...
Es wird aber nur beschrieben wie es mit 4 Punkten geht... alles was darüber hinaus geht nicht (Ok, afaik geht mit EvaluatorKurven sowieso nich mehr als 4 Punkte.. da bräuchte man wohl dann Splines )
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Nenene...ihr übertreibt mal wieder alle maßlos
Ich glaube für den Anfang reicht es bereits, wenn er zwischen den Kamerapositionen und Blickrichtungen einfach linear interpoliert und dabei die Rendergeschwindigkeit berücksichtigt (Time-Based-Movement).
Denn wenn die Kamera sich nur auf einer Geraden zwischen zwei Punkten bewegt und während dieser Bewegung ihren Blickwinkel um x-Grad verändert (die Anzahl der Achsen spielt ja dabei keine Rolle), reicht es doch wenn er die Kamera zeitbasierend pro Frame um x/y/z-Einheiten auf den neuen Punkt zu bewegt.
Ich habs zwar selbst noch nicht probiert, allerdings müsste es doch ganz einfach gehen.Wenn die Kamera z.B. bei 0/0/0 startet und sich auf einer Geraden nach 50/100/50 hin bewegen soll, sollte die Sache mit der zeitabhängigen Bewegung einwandfrei (und bei entsprechender Framerate auch flüssig) ablaufen.Einfach nen Referenzwert für die Kamerabewegung bzw -rotation per Frame festlegen (z.B. bei einer Bewegung von 100 Einheiten auf der X-Achse von Punkt1 zu Punkt2, würde sich die Kamera bei 100fps 0.1 Einheiten pro Frame auf dieser Achse bewegen) und dann den aktuellen Bewegungsfaktor anhand der zum Rendern benötigten Zeit berechnen. so dass sich die Kamera auch gleichmäßig (und damit flüssig) bewegt.
Schau dir dazu mal mein zweites Bombermantutorial an, denn dort schneide ich das Thema Time-Based-Movement kurz an.Dies dann von der Spielerbewegung auf die Kamerabewegung zu übertragen sollte eigentlich kein Problem darstellen.
Registriert: Sa Okt 26, 2002 17:14 Beiträge: 188 Wohnort: Hannover/Lüneburg
Zitat:
Es wird aber nur beschrieben wie es mit 4 Punkten geht... alles was darüber hinaus geht nicht
Ich meine da steht die Formel für Bezierkurven beliebigen Gerades. Jedenfalls hab ich nur die Formeln aus dem Tut verwendet, aber ich habe glaube ich auch noch keine Kurven mit mehr als 4 Punkten erstellt. Aber ich meine es müsste problemlos gehen.
_________________ Thunderman
Bei schwierigen Problemen entscheiden wir uns einfach für die richtige Lösung. Klar?
Registriert: Sa Okt 26, 2002 17:14 Beiträge: 188 Wohnort: Hannover/Lüneburg
Steht definitiv im Tut:
Zitat:
Es gibt eine einfache Formel für die Basis Funktionen von Bezier Kurven für einen beliebigen Grad. n ist der Grad, i beziffert die Basis Funktion und reicht damit von 0 bis n:
Musst halt nur dann in Code umsetzen die Formel, was aber überhaupt keine Probleme bereiten dürfte. Und wenn ich mich recht entsinne hast doch gerade du damals mit DelphiC oder so darüber unterhalten hier im Forum...
_________________ Thunderman
Bei schwierigen Problemen entscheiden wir uns einfach für die richtige Lösung. Klar?
mhh.... also für mich isses im moment noch nen Problem *g* (Hab das tutorial eben nochmal gelesen) Also nich das in Code umzusetzen oder so, sondern überhaupt..
1) Ich habe z.B. 10 Punkte.. wo geb ich bei der Formel da die 10 Punkte an? :unsure: 2) Ich errechne mit dieser formel doch ein B.. oder??? Aber ein B is ein B, und kein X, Y, Z... *g*
*guckt hilfesuchend*
und die sache mit glMap hat bei mir immer nur mit max. 4 Punkten funktioniert...
Registriert: Sa Okt 26, 2002 17:14 Beiträge: 188 Wohnort: Hannover/Lüneburg
B ist ja auch nicht ein Punkt sondern der Faktor für deine Kontrollpunkte, um den entgültigen Punkt zum Moment t auszurechen. Das ganze hat dir DelphiC damals hier erklärt: <a href='http://www.phobeus.de/hosting/dgl/forum/index.php?act=ST&f=3&t=594' target='_blank'>http://www.phobeus.de/hosting/dgl/forum/in...ct=ST&f=3&t=594</a> glMap() ist ja auch was anderes als ne reine Bezierkurve. Für die Kamerafaahrt brauchst du sowas wie glMap() ja auch nicht. Die Bezierkurve ansich geht aber für beliebig viele Punkte.
_________________ Thunderman
Bei schwierigen Problemen entscheiden wir uns einfach für die richtige Lösung. Klar?
Unsinn... Die OpenGl Evaluators werden nur am Ende beschrieben, wie man Patches selber berechnet wird lang und breit erklärt, alle nötigen Formeln liegen auch bei...
Stimmt, die Formeln wären dagewesen - ich muss zu meiner Schande gestehen, dass ich das Tutorial nur vor einigen Monaten mal überflogen habe, und mir nur noch der OpenGL Code in Erinnerung geblieben ist (irgendwie kommt mir vor, dass in sämtlichen Erklärungen zu NURBs, die ich bis jetzt gelesen habe, das selbe Demopatch verwendet wurde ). Allerdings nimmt es einem auch das Tutorial nicht ab, die Bernsteinpolynome in Code umzusetzen (was ja weiter nicht tragisch ist, die Info wäre ja da).
Wenn ich mir die Beiträge hier so ansehe, wäre auch eine Erläuterung, wie man mehrere Bezierkurven (oder Patches) niedrigen Grades zusammenhängt, sodass sie eine kontinuierlich gekrümmte Kurve / Hügellandschaft ergeben nicht ganz umsonst. Es ist nämlich KEINE gute Idee eine komplexe Kurve aus einem Polynom hohen Grades zu berechnen - erstens steigt der Rechenaufwand exponentiell an (siehe Formel), die Kurve wird chaotisch (schlecht vorhersagbar, wie sich die Kontrollpunkte tatsächlich auswirken) - und wenn man sie dann darstellen will, unterstützt OpenGL (aus eben diesen Gründen) nur eine sehr begrenzte Anzahl von Kontrollpunkten
Ich erklär mal kurz, wie es geht - evtl. kann man es noch ins Tutorial einfügen: Ich nehme als Beispiel einen Polynom 2. Grades, entspricht also der Darstellung eines Liniensegmentes als Kurve mit drei Kontrollpunkten. Ziel ist, mehrere solcher Segmente zu einer zusammenhängenden Kurve zusammenzukleben.
Lösung: Nehmen wir an, die Kontrollpunkte sind folgendermaßen angeordnet, da die Segmente zusammenhängen sollen, brauche ich nur fünf Punkte, da sich die beiden Segmente C teilen A B C D E
Nun haben wir zwei über Kontrollpunkte definierte Segmente (A B C) und (C D E), wobei nur die Kontrollpunkte A C E tatsächlich auf der Kurve liegen, B D werden nur angenähert, über sie wird die Krümmung der Kurve definiert. Um nun dafür zu sorgen, dass die Kurve in C keinen Knick bekommt, muss dafür gesorgt werden, dass beide Segmente in C die selbe Tangente haben - dies geschieht einfach, indem dafür gesorgt wird, dass C auf der durch B und D definierten Gerade liegt.
Dieses Beispiel lässt sich nun auf beliebig viele Kontrollpunkte erweitern, frei wählbar sind dann aber nur die Hälfte, da die andere Hälfte automatisch berechnet werden muss, um eine zusammenhängende Kurve zu erhalten. Probierts einfach mal aus.
OK ich bedanke mich für die vielen Antworten aber so richtig geholfen hat mir auch nix. ich hab die Cam zwar hinbekkomen aber läuft diese nur linear und dies siehtabsolout nicht toll aus.
Wie ich es mit den Bezier Curves hinkriege hab ich keine Ahnung da alles zu durcheinander war(die Beiträge in dieses Topic)
Hat keiner einen Beispiel Code den er mir schickjen kann. Alle Sourcxes bitte an Eshat@gmx.net
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.