Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Di Jul 15, 2025 16:34

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Welt als Baum darstellen?
BeitragVerfasst: Fr Jul 22, 2011 14:31 
Offline
DGL Member

Registriert: Sa Mär 14, 2009 17:48
Beiträge: 99
Programmiersprache: D, Java, C++
Hi,

ich würde meine Welt, in meinem Fall bloß eine GUI, jedoch mit perspektivischer Projektion, gerne in einer Baum-Struktur Speichern, dass bringt mir gerade für die GUI viele Vorteile, wenn ich einen Knoten rotiere, dann rotieren die Unter-Knoten natürlich mit, ich bin mir nur nicht ganz sicher wie ich das realisieren soll, bisher dachte ich einfach jeder Knoten bekommt eine Matrix welche die Position und Rotation des Knoten beinhaltet und dass wird halt zu den Kindern hin aufmultipliziert, mit anderen Worten: Position und Rotation sind relativ zueinander.

Ich krieg das allerdings einfach nicht sauber hin, bisher siehts es in Etwa so aus:

Code:
  1.  
  2. public class GLView {
  3.  
  4.   private Vector localX;
  5.   private Vector localY;
  6.   private Vector localZ;
  7.   private Vector position;
  8.  
  9.   ...
  10.   public void rotate(Matrix matrix) {
  11.  
  12.     localX = matrix.multiply(localX);
  13.     localY = matrix.multiply(localY);
  14.     localZ = matrix.multiply(localZ);
  15.   }
  16.  
  17.   public void move(Vector distance) {
  18.  
  19.     position.add(distance);
  20.   }
  21.  
  22.   public void render(GL10 gl, Matrix parentMatrix) {
  23.  
  24.     Matrix modelMatrix = Matrix.create(localX.getX(), localY.getX(), localZ.getX(), position.getX(),
  25.   localX.getY(), localY.getY(), localZ.getY(), position.getY(),
  26.   localX.getZ(), localY.getZ(), localZ.getZ(), position.getZ(),
  27.   0, 0, 0, 1);
  28.    
  29.     Matrix modelViewMatrix = parentMatrix.multiply(modelMatrix);
  30.     gl.glLoadMatrix(modelViewMatrix.toArray(), 0);
  31.     // ... Render ...
  32.   }
  33. }
  34.  
  35. public class GLViewGroup extends GLView {
  36.  
  37.   private List<GLView> childViewList;
  38.  
  39.   @Override
  40.   public void render(GL10 gl, Matrix parentMatrix) {
  41.  
  42.     for (GLView childView : childViewList) {
  43.       childView.render(gl, parentMatrix);
  44.     }
  45.   }
  46. }
  47.  

(Aus dem Gedächtnis aufgeschrieben, keine Gewähr auf evtl. Fehler)

So in etwa schaut mein Code aus.
Irgendwie bin ich unzufrieden damit, gerade weil ich es nur für eine GUI nutze. Es scheint mir doch sehr Performance lastig zu sein, in dein meisten Fällen bestehen die Knoten aus 4 Vertizes und 6 Indizes (Quads), dafür so ein Aufwand mit den Matrizen scheint mir überdimensioniert, gerade weil auch relativ tiefe Ebenen vorkommen (4 bis 6 sind keine Seltenheit), dann habe ich quasi für jedes Quad 4-6 Matrix Multiplikationen und überhaupt halte ich für jeden Knoten (wie gesagt meistens Quads) eine komplette Matrix, die benötigt ja mehr Speicher als das Quad selbst...

Gibt es da irgendwelche schöneren Lösungen? Habt ihr Ideen? Mir ist eben nur wichtig, dass sich bei der Rotation, bzw. Verschiebung eines Knoten die Unterknoten mit verschieben, es soll eine 3D GUI werden.

Viele Grüße & Danke im voraus ;-).


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Welt als Baum darstellen?
BeitragVerfasst: Fr Jul 22, 2011 16:00 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Ideen:
1. Speichere direkt die Matrix, nicht die einzelnen Vektoren. Aktuell musst du nämlich immer erst alle Werte kopieren bevor du auch nur irgendwas tun kannst.
2. Wenn du wirklich nur Rotation und Translation (Verschiebung) möchtest, kannst du auf Quaternions umsteigen. Diese sind eine alternative zu Matrizen, können aber nur Rotation. Translation kann man hinzunehmen indem man zusätzlich einen Vektor speichert. Skalierung oder Scherrungen wären nicht möglich. Vorteil ist, dass die sich zwei Quaternions leichter (weniger Operationen) miteinander multiplizieren lassen. Nachteil ist es gibt aber zusätzlichen Aufwand, für OpenGL musst du das Quaternion in eine Matrix umwandeln. Der Nutzen für deinen speziellen Fall ist fraglich, da du wahrscheinlich in den meisten Knoten etwas rendern wirst. Es würde sich möglicherweise lohnen, wenn du etwa nur in den Blattknoten umwandeln müsstest oder in jedem Schritt auch die inverse Matrix benötigst. Skalierung könnte bei einer GUI natürlich durchaus notwendig sein, dann würde es ganz ausscheiden.
3. Ich denke mal viele Elemente (insbesondere in den unteren Baumebenen) sind fest und ändern sich nicht. Wahrscheinlich transformierst/rotierst du nur ganze Fenster, nicht kleine Detail-Elemente. In diesem Fall könntest du die Vertices Vor-Transformieren und gemeinsam in einem VBO des Eltern-Knotens speichern. Auf diesen vor-transformierten VBO musst du nur noch die Matrix des Elternknotens anwenden, nicht die Kindermatrizen. Ggf. erlaubt dir dieser Ansatz sogar vieles in einem Rutsch zu rendern. (Der Overhead alleine durch den Draw-Call ist recht hoch, es macht kaum einen Unterschied ob du 1 oder 100 Dreiecke in einem Aufruf renderst....also wenn irgendwie möglich nicht alle Quads einzeln rendern...geht natürlich nicht immer in sinnvoller weise)

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Welt als Baum darstellen?
BeitragVerfasst: Mo Jul 25, 2011 12:54 
Offline
DGL Member

Registriert: Sa Mär 14, 2009 17:48
Beiträge: 99
Programmiersprache: D, Java, C++
Hi,

danke für deine Tipps, gerade der letzte Punkt klingt vernünftig, ich müsste mir nur überlegen wie ich das möglichst dynamisch erledige, ich hab mir überlegt jeder GLView auch einen Status zuzuweisen, STATIC oder DYNAMIC, wenn eine GLViewGroup jetzt einige STATIC GLViews beinhaltet, können diese statischen Views vortransformiert in der ViewGroup gespeichert werden (bzw. in einem VBO in der ViewGroup). Wenn diese Statischen Views nun doch transformiert werden sollen, passiert das einfach komplett auf der CPU in einem eigenen Thread und wird anschließend in das VBO geschrieben.
Bei den DYNAMIC Views bleibe ich einfach bei dem alten Renderpfad, wobei man mal testen müsste ob es nicht vielleicht grundsätzlich schneller wäre einfache Views (=wenig Vertizes) vorzutransformieren und am ende einfach nurnoch ein VBO zu rendern. Evtl. kann man auch die gesamte GUI auf der CPU Transformieren, aber ich denke das hängt rein davon ab, aus wievielen Views die GUI besteht.

Ich werd mich dann demnächst mal ans ausprobieren machen :-).


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 11 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.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.007s | 14 Queries | GZIP : On ]