OpenGL ES Android Matrixtransformationen

8

Ich habe einen Renderer, der die GLSurfaceView.Renderer-Schnittstelle implementiert; eine Unterklasse von GLSurfaceView und einige Klassen, die meine Objekte darstellen, die ich zeichnen möchte. Ich habe den Code von Ссылка Ich möchte das erweitern und einige Achsen hinzufügen, die es nicht schaffen. Das Objekt wird nur gedreht. und hier ist mein Code:

%Vor%

Meine Erwartungen sind, dass bei jedem Neuzeichnen das Objekt um mA gedreht und entlang der Y-Achse um 1 f verschoben wird. Ich kann aber nur rotieren sehen (ein bisschen projiziert). Ich habe tatsächlich ein paar Fragen dazu: Wie verwende ich meine Übersetzungsmatrix und Was ist die beste Vorgehensweise beim Teilen der OpenGL-Funktionalität? Sollte die ModelMatrix nicht im Renderer, sondern im Objekt selbst gespeichert werden? Sollen die Matrixoperationen in der Renderer-Klasse durchgeführt werden? Ich habe sie zusammen gruppiert, da ich denke, dass sie alle verwandt sind.

    
Michael T 20.11.2012, 18:49
quelle

3 Antworten

17

Ich habe mit dem Beispiel aus dem Android Training gearbeitet, der folgende Ansatz funktioniert schließlich für mich. (Basierend auf Android Training & gt; Anzeigen von Grafiken mit OpenGL ES & gt; Hinzufügen von Bewegung )

  1. Verwenden Sie den richtigen Vertex-Shader:

    %Vor%
  2. In der Renderer-Klasse:

    %Vor%
  3. Wenden Sie Transformationen in onDrawFrame an, beginnen Sie mit Übersetzung :

    %Vor%
  4. Dann Rotation :

    %Vor%
  5. Kombinieren Sie Rotation und Translation, Vermeiden Sie mModelMatrix

      

    "als die gleiche Matrix auf der rechten und linken Seite von multiplyMM" (siehe 2 )

    %Vor%
  6. Kombinieren Sie die Modellmatrix mit der Projektions- und Kameraansicht. Vermeiden Sie erneut mModelMatrix

      

    "als die gleiche Matrix auf der rechten und linken Seite von multiplyMM" (siehe 2 )

    %Vor%
  7. Zeichnen Sie die Form

    %Vor%

Vielen Dank für all die nützliche Eingabe, die ich aus diesem Thread ziehen konnte.

    
escalator 25.06.2013, 08:47
quelle
2

Wenn Sie eine Bewegung sehen möchten, sollten Sie mTriangle.mAngle jeden Frame aktualisieren (vorzugsweise als Funktion der Zeit, um Geschwindigkeitsunterschiede oder Verzögerungen, die durch andere Prozesse verursacht werden, zu bekämpfen ...).

Beachten Sie, dass Matrix.setIdentityM (mModelMatrix, 0); stellt alle akkumulierten Rotationen und Übersetzungen auf "Null" oder sogar auf Identity Matrix ... wieder her Dieselbe Konvention gilt für alle set Funktionen. Um alle Transformationen zu akkumulieren, muss man

  • setIdentity (Modell);
  • übersetzen (trans); // um den Ursprung der Rotation zu erhalten
  • rotiere (Rotmatrix); // um die Rotation zu akkumulieren
  • übersetzen (t2); // um wieder in eine bessere Position zu übersetzen ...

Man sollte auch die Werte des Objekttranslationsvektors [ox, oy, oz] zwischen jedem Aufruf behalten und sie an Matrix.translateM (mModelMatrix, ox, oy, oz, 0) füttern;

In der Regel verkettet man alle Matrizen "übersetzen, rotieren, skalieren" usw. so früh wie möglich und speichert sie pro Objekt oder hierarchisch pro komplexem Container mit mehreren Objekten und einer Begrenzungsbox, so dass mehrere Objekte ausgewählt werden können wenn sie sich hinter der Kamera (oder generell außerhalb des Sichtstumpfes) befindet.

Auch typischerweise hält man eine bewegliche Kamera in einer Matrix und pro Frame multipliziert sie mit der Projektionsmatrix.

Sie können mit etwas beginnen wie:

%Vor%

Wie Tim bemerkt hat, gibt es keine Projektionsmatrix, was bedeutet, dass sich alle Z-Werte in diesem Code genau verhalten, obwohl sich x & amp; y-Werte würden einen Unterschied machen.

Ich wäre versucht zu sagen, dass MVP-Matrix Multiplikation bedeuten würde in der Reihenfolge M * V * P = (M · V) · P = M · (V · P).

    
Aki Suihkonen 20.11.2012 18:59
quelle
0

Beachten Sie, dass Sie Ihre Projektionsmatrix nicht auf das gezeichnete Dreieck anwenden, was zu Problemen führen könnte.

Sollte wahrscheinlich sein:

%Vor%     
Tim 20.11.2012 19:10
quelle