2016-06-14 11 views
0

Ich denke, das erfordert ein paar Hintergrundinformationen: Ich habe Minecraft schon eine Weile modded, aber ich wollte immer mein eigenes Spiel machen, also habe ich angefangen, in die frisch veröffentlichte LWJGL3 zu graben, um wirklich Dinge zu erledigen. Ja, ich weiß, es ist ein bisschen wie ein Level und ich sollte eine Engine und so weiter verwenden ... In der Tat habe ich schon einige Engines ausprobiert und sie passen nie ganz zu dem was ich machen will. Also entschied ich, dass ich das Problem angehen will . Bis jetzt verstehe ich irgendwie, wie man Netze rendert, die "Kamera" verschiebt, usw. und ich bin bereit, die Lernkurve zu nehmen.Gibt es eine Möglichkeit, einfache Animationen im modernen OpenGL "on the fly" zu erstellen?

Aber die Sache ist, irgendwann beginnen alle Tutorials zu erklären, wie man Modelle lädt und Skelettanimationen und so weiter erstellt ... aber ich denke, dass ich nicht wirklich so gehen will. Viele Dinge in der Arbeit mit Minecraft-Code waren schrecklich, aber mir gefiel es, wie ich Modelle und Animationen aus Java-Code erstellen konnte. Sicher, es sah nicht super realistisch aus, aber da ich auch mit Blender nicht großartig bin, bezweifle ich, dass "klassische" Modelle und Animationen helfen würden. Wie auch immer, in diesem Code konnte ich eine Kiste drehen, damit eine Kreatur einen Spieler ansieht, ich könnte eine Sinusfunktion benutzen, um Beine und Arme (oder Flügel, in meinem Fall) zu bewegen, und das hat funktioniert, da Minecraft den Sofortmodus benutzt hat und Java könnte der Grafikkarte direkt mitteilen, wo jeder Eckpunkt gezeichnet werden soll.

Also, eigentliche Frage (n): Gibt es eine gute Möglichkeit, dynamische Animationen in modernen (3.3 +) OpenGL zu machen? Meine Modelle wären im Grunde eine Hierarchie von Formen (Boxen oder was auch immer) und ich möchte sie im laufenden Betrieb drehen können. Aber ich bin mir nicht sicher, wie ich das organisieren soll. Würde ich alle Translations-/Rotationsmatrizen für jede Unterform speichern? Würde das die Menge an Unterformen, die ein Modell haben könnte, stark einschränken? Hat jemand so etwas versucht?

Edit: Zur Klarstellung, was ich tat etwas so aussah:

ein Modell erstellen: https://github.com/TheOnlySilverClaw/Birdmod/blob/master/src/main/java/silverclaw/birds/client/model/ModelOstrich.java Das Modell als ein Haufen von Boxen im Konstruktor erstellt wird, die machen und setRotationAngles Methoden setzen Maßstab und Drehungen .

Antwort

1

Sie sollten einem OpenGL-Tutorial folgen, um die Grundlagen zu verstehen.

Lassen Sie mich vorschlagen "Learning Modern 3D Graphics Programming", und speziell this chapter, wo Sie einen Roboterarm mit mehreren Gelenken bewegen.

enter image description here

habe ich einen Port in Java jogl mit here, aber man kann es über lwjgl leicht Anschluss.

+0

Ich folge schon [diesem LWJGL3-Buch] (https://www.gitbook.com/book/lwjglgamedev/3d-game-development-with-lwjgl/ Details) und eine Reihe von OpenGL-Tutorials, aber das scheint zu enthalten, was ich suche, danke. – Silverclaw

0

Ja und nein.

Sie können Ihre Hierarchie von Formen haben und für jede eine relative Transformation speichern. Zum Beispiel würde der "Spieler" eine Übersetzung auf 100,100 haben, 10 (wo der Spieler ist), und dann hätte die "Kopf" -Unterkomponente eine zusätzliche Übersetzung von 0,0,5 (nur ein bisschen höher auf der Z-Achse) .

Sie können diese als Matrizen speichern (sie können Übersetzung, Rotation und Skalierung kodieren) und verwenden glPushMatrix und glPop Matrix, um eine Matrix zu einem Stapel hinzuzufügen und zu entfernen, der von openGL verwaltet wird.

Die draw() Funktion (oder was auch immer Sie es nennen) sollen wie etwas aussehen:

glPushMatrix(); 
glMultMatrix(my_transform); // You can also just have glTranslate, glRotate or anything else. 
// Draw my mesh 
for (child : children) { child.draw(); } 
glPopMatrix(); 

Dies Ihnen einen hierarchischen Aufbau gibt, so dass Objekte mit ihren Eltern zu bewegen. Alternativ können Sie einen Stapel im Hauptspeicher haben und die Multiplikationen selbst durchführen (benutzen Sie eine Bibliothek). Ich denke, dass der OpenGL-Stack ein Limit haben kann (abhängig von der Implementierung), aber wenn du selbst damit klarkommst, ist die einzige Grenze die Menge an Ram, die du verwenden kannst. Sobald alle Matrizen multipliziert sind, wird das Rendering in der gleichen Zeit durchgeführt, das heißt, es spielt für die Leistung keine Rolle, wie tief ein Mesh in der Hierarchie ist.

Für tatsächliche Animationen müssen Sie die Zwischentransformationen berechnen. Zum Beispiel für eine geduckte Animation möchten Sie wahrscheinlich ein paar Frames dazwischen haben, damit die Kamera nicht einfach in die tiefe Position springt.Sie können dies mit einer zeitbasierten linearen Interpolation zwischen den Start- und Endpositionen tun, aber dies deckt nur einfache Animationen ab und Sie müssen es immer noch selbst implementieren.

Alles andere komplizierter (d. H. Ändern Sie das Netz basierend auf den Knochen-Links), die Sie selbst implementieren müssten.

+0

Vielen Dank für die Mühe, aber ich denke, deine Antwort deckt die "alten" Push/PopMatrix-Operationen ab, die Minecraft/LWJGL2.x sowieso gemacht hat, die aber in shader-basiertem OpenGL nicht verfügbar sind? – Silverclaw

+0

Ja, diese Aufrufe sind veraltet, aber das Konzept dahinter bleibt – elect

1

Was Sie suchen, ist genau Skelettanimation, der einzige Unterschied ist die Tatsache, dass Sie keine Animationen für Ihre Knochen laden möchten, sondern Transformationen im laufenden Betrieb berechnen/generieren möchten.

Sie haben grundsätzlich eine Hierarchie von Knochen und Geometrie an sie angehängt. Es sieht so aus, als ob Sie diese Geometrie "starr" manipulieren möchten. Bevor Sie also Ihre Meshes/Transformationen auf die GPU (die klassische Methode) senden, müssen Sie die neuen Transformationen im Modell- oder Weltbereich berechnen und diese frisch berechneten Matrizen senden zeichne deine Geometrien auf der GPU auf die übliche Weise.

Wie Sorin sagte, müssen Sie, um jede Transformation zu berechnen, einfach über Ihre Hierarchie iterieren und Transformationen akkumulieren, vorausgesetzt, dass die Transformation des Elternknochens und Ihrer lokalen Transformation w.r.t die Eltern sind.