Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey Leute,
ich steh grad vor nem Problem, wo ich nich so recht weiter weiß. Und zwar hab ich ein Mesh, dessen Daten in einem VBO vorliegen. Das Mesh soll jetzt aber die Form ändern (so ähnlich wie bei nem Model) und ich weiß nicht recht wie ich das anstellen soll. Wie kann man die Daten im VBO am schnellsten ändern? Und wie kann ich die Ausgangsdaten wiederherstellen? Oder sollte ich auf mehrere VBOs umsteigen un die dann einfach mit einem glBegin-glEnd-Block verbinden? Wie funktiert das bei nem Modelloader? Wäre toll, wenn mir da jmd helfen könnte...
Möchtest du einfach nur den VBO-Inhalt aus einer Datei laden oder geht es dir darum ein Mesh zu animieren? Mit Animation ist hier z.B. "laufen, springen, schießen" gemeint.
Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,
das Laden ist kein Problem, ich will sowas wie ne Animation machen, allerdings wollte ich kein Modelloader benutzen, weil die Animation zufällig sein soll. Das ganze soll so eine Art LavaLampe werden und da hat man ja in der Lampe die Flüssigkeit, die die Form verändert. Die eigentliche Fragen sind jetzt: Wie änder ich die Daten im VBO? Und: Ist das effektiv, oder sollte man das anders lösen?
Sind Shader erlaubt? Der Vertexshader macht sowas gerne Z.B. könnte jeder Vertex eine Position und eine Richtung haben. Der Vertexshader verschiebt jede Position um Faktor * Richtung. Der Faktor kommt dann von einem Shader-Uniform. Natürlich kannst du genauso gut mehrere Positionen angeben und dazwischen interpolieren. => Du musst den VBO nicht ändern, nur den Uniform. Es wäre genauso möglich die Vertices mit einer ID zu markieren und dann mehrere Faktoren entsprechend der ID anzuwenden.
Ich bin mir aber nicht sicher ob sich ein gewöhnliches Mesh für deine Lavalampe eignet. Flüssigkeiten simuliert man normalerweise mittels Partikeln oder Volumentexturen. Ich denke für deinen Fall ist eine Volumentextur ideal. Eine Volumentextur ist einfach ein 3D-Array. Du sorgst einfach dafür das in jeder Zelle des Volumens ein paar Bedingungen erfüllt sind. Eine primitive Lösung könnte so aussehen: 1. Flusserhaltung: Alles was in eine Zelle hin einfließt muss auch wieder raus. 2. Temperatur: Unten erwärmen sich die Zellen und erzeugen dadurch einen leichten Fluss nach oben. Je wärmer desto stärker. 3. Zellen tauschen Wärme mit den Nachbarn. Das ganze gibt ein großes Gleichungssystem welches in jedem Iterationsschritt gelöst werden muss. Dafür gibt es fertige Solver, einfach mal suchen.
Du musst natürlich noch irgendwo dafür sorgen das Wärme wieder verloren geht, ansonsten würde das System immer heißer. Z.B. einfach nach jeder Iteration sämtliche Wärme-Werte aufsummieren und damit normalisieren. Die verschieden farbigen Wachse in der Lavalampe sind jetzt auch noch nicht berücksichtigt.
Registriert: Di Okt 03, 2006 14:07 Beiträge: 1277 Wohnort: Wien
Zitat:
Z.B. könnte jeder Vertex eine Position und eine Richtung haben. Der Vertexshader verschiebt jede Position um Faktor * Richtung. Der Faktor kommt dann von einem Shader-Uniform. Natürlich kannst du genauso gut mehrere Positionen angeben und dazwischen interpolieren. => Du musst den VBO nicht ändern, nur den Uniform.
Das ist eine gute Idee.
Zitat:
Es wäre genauso möglich die Vertices mit einer ID zu markieren und dann mehrere Faktoren entsprechend der ID anzuwenden.
Diese Möglichkeit hat man nicht, wenn gl_VertexID nicht zur Verfügung steht.
Zitat:
Das ganze gibt ein großes Gleichungssystem welches in jedem Iterationsschritt gelöst werden muss. Dafür gibt es fertige Solver, einfach mal suchen.
Das ist definitiv keine gute Idee. Riesig viel Aufwand, und soweit ich weiß, benutzt Bergmann Delphi. Für Pascal stehen solche fertigen Solver nicht zur Verfügung. Viele Grüße Traude
Diese Möglichkeit hat man nicht, wenn gl_VertexID nicht zur Verfügung steht.
Ich meinte z.B. die Vertex-Farbe als ID zu missbrauchen. Und dann im Sinne von: Alle Vertices mit ID =1 werden mit Faktor 1 transformiert, alle Vertices mit ID = 2....usw....
Zitat:
Das ist definitiv keine gute Idee. Riesig viel Aufwand, und soweit ich weiß, benutzt Bergmann Delphi. Für Pascal stehen solche fertigen Solver nicht zur Verfügung.
Einen bestehenden Solver nach Delphi zu übersetzen sollte weniger das Problem sein, zumal es auch mehr um den Algorithmus geht. Die meisten Solver dürften sowieso in CUDA implementiert sein, also das läuft auf der Grafikkarte. Da dürfte es recht egal sein ob nun Delphi, C++ oder sonst was. Ich habe allerdings jetzt nicht selbst danach gesucht....und habe auch mit CUDA bisher nix gemacht.
Mitglieder in diesem Forum: 0 Mitglieder und 4 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.