2010-12-02 5 views
4

Also ich arbeite an einem Spiel in Java 3D und ich implementiere Health Bars, die über Einheiten schweben.Zeichnen ungehindert Gesundheit Bars in einer Java-3D-Szene

Ich begann mit dem Zeichnen eines Quads an einem 3D-Punkt über dem Gerät und der Anwendung eines Billboard-Verhaltens, damit es immer zur Kamera zeigt.

Aber das Problem, mit dem ich festhalte, ist, dass die Gesundheitsbars manchmal durch andere Landschaft verdeckt werden. Ich betrachte die folgenden Optionen

So:

  1. die Z/Tiefe Pufferwert für die Gesundheitsbar Pixel Aufschalten den Renderer zu denken, sie sind näher an der Kamera als alles, was sie danach macht.

    Ich versuchte renderingAttributes.setDepthTestFunction(RenderingAttributes.ALWAYS). Während der Renderer den Statusbalken über alles zeichnen lässt, was er zuvor im selben Bereich gezeichnet hat, hilft er nicht, wenn die andere Szenerie später über den Statusbalken gezogen wird.

    Gibt es einen besseren Weg, dies in Java 3D zu tun?

  2. Projektion der 3D-Positionen der Health-Bars auf eine 2D-Ebene vor der Kamera. Klingt machbar, aber bevor ich damit beginne, die ganze Mathematik neu zu erfinden, kann vielleicht jemand auf eine bestehende Lösung hinweisen.

  3. Wechsel von Java 3D zu etwas wie LWJGL oder jMonkeyEngine (nicht nur für dieses Problem, sondern allgemeine Beschwerden über Java 3D tot, usw.). Obwohl ich nicht einmal sicher bin, ob sie für dieses spezielle Problem flexibler sind. Und nach dem, was ich gelesen habe, ist einer der schlimmsten Fehler im Spielentwickler, den Motor mitten in der Entwicklung zu wechseln.

Antwort

3

Verwenden Sie die painter's algorithm: zeichnen, um die Gesundheit Bars nach Sie den Rest der Szene gezeichnet haben (und mit Z-Tests ausgeschaltet, natürlich).

+0

Sieht so aus, als ob es eine Möglichkeit gibt, dies in Java 3D mit einer OrderedGroup zu tun. Dies würde jedoch ein Wartungsproblem einführen. Derzeit ist es am einfachsten, den Statusbalken oberhalb der Einheit zu positionieren, indem Sie ihn in die gleiche TransformGroup wie die Einheit einfügen. Aber wenn ich alle Gesundheitsbalken von allen anderen Szenerien trennen muss, muss ich sie auf einer höheren Ebene aufteilen und dann versuchen, die gleiche Reihe von Transformationen auf die Gesundheitsbalken anzuwenden, die auf die Einheiten angewendet werden. Es ist machbar, aber vielleicht gibt es eine elegantere Lösung. – mjomble