Wenn ich die Größe oder Position eines Objekts in WebGL ändern möchte, nehme ich die ursprünglichen Vertexdaten {x, y, z} dieses Objekts und übergebe es an den Vertex-Shader, wo es mit einer Matrix multipliziert wird. das enthält die Informationen über die Transformationen, was zu einer neuen Menge von Koordinaten führt, die nur meiner GPU bekannt ist, aber für mich unsichtbar ist.Wie transformieren Sie Vertices, ohne das Format zu ändern?
Das funktioniert gut, soweit das einzige, was zählt, ist das Bild auf dem Bildschirm, aber ich möchte in der Lage sein, die transformierten Ecken ohne zusätzliche Informationen über Matrix Multiplikationen zu speichern, einfach als x, y, z- Werte, genau wie die Originaldaten.
Die Idee war, den letzten Schritt der Multiplikation der Transformationsmatrix mit den ursprünglichen Vertexdaten durch meine eigene in JavaScript zu machen, aber ich bekomme es einfach nicht funktionieren!
Ich schrieb die folgende Funktion, um eine 4x4-Matrix mit einer Vielzahl von x, y, z-Werten zu multiplizieren, um einen vierten Wert Hinzufügen {1,0} die vec3-Daten in vec4-Daten zu ändern ...
function matrixVectorProduct (mat4, data) {
var result = new Array();
for (var i = 0; i < data.length/3; i++) {
var n = i * 3;
var vec4 = [data[n], data[n + 1], data[n + 2], 1.0];
var x = mat4[0] * vec4[0] + mat4[1] * vec4[1] +
mat4[2] * vec4[2] + mat4[3] * vec4[3];
var y = mat4[4] * vec4[0] + mat4[5] * vec4[1] +
mat4[6] * vec4[2] + mat4[7] * vec4[3];
var z = mat4[8] * vec4[0] + mat4[9] * vec4[1] +
mat4[10] * vec4[2] + mat4[11] * vec4[3];
var w = mat4[12] * vec4[0] + mat4[13] * vec4[1] +
mat4[14] * vec4[2] + mat4[15] * vec4[3];
result.push(x, y, z, w);
}
return result;
}
... aber neben der Tatsache, dass ich keine Ahnung, wie haben die vec4-Werte wieder auf vec3-Werte zu konvertieren, muss es etwas falsch mit dem Konzept als Ganzes:
die wir annehmen lassen haben die Ecken für ein einfaches Dreieck wie
var vertices = [0.0, 1.0, 0.0, -1.0, -1.0, 0.0, 1.0, -1.0, 0.0];
und wir eine 4x4-Matrix mit
function createMat4 () {
var mat4 = new Float32Array(16);
mat4[0] = 1; mat4[1] = 0; mat4[2] = 0; mat4[3] = 0;
mat4[4] = 0; mat4[5] = 1; mat4[6] = 0; mat4[7] = 0;
mat4[8] = 0; mat4[9] = 0; mat4[10] = 1; mat4[11] = 0;
mat4[12] = 0; mat4[13] = 0; mat4[14] = 0; mat4[15] = 1;
return mat4;
}
übersetzen sie durch erstellen - sagen wir mal [0, 0, -5] - Mit dieser Funktion
function translateMat4 (mat4, vec3) {
var x = vec3[0],
y = vec3[1],
z = vec3[2];
var a = mat4;
mat4[12] = a[0] * x + a[4] * y + a[8] * z + a[12];
mat4[13] = a[1] * x + a[5] * y + a[9] * z + a[13];
mat4[14] = a[2] * x + a[6] * y + a[10] * z + a[14];
mat4[15] = a[3] * x + a[7] * y + a[11] * z + a[15];
return mat4;
}
und schließlich die erstellt und übersetzt Matrix multiplizieren mit den in vertices
gespeicherten Vertex-Daten unter Verwendung der matrixVectorProduct
-function oben erwähnt, soll das Ergebnis
translatedVertices = [0.0, 1.0, -5.0, -1.0, -1.0, -5.0, 1.0, -1.0, -5.0];
sein, aber es ist nur [x, y, z, 1], weil -5 x 0.0 (z-Wert) gleich 0 ist, also kann es nicht so funktionieren.
Was mache ich falsch?
„* Ich habe keine Ahnung, wie die vec4-Werte zurück zu vec3 konvertieren *“ Sie benötigen eine Vektor zu teilen, indem er w, diese implizit in Shadern gemacht wird. –
@ LJ_1102 Moin und danke für die Info!Wie Entity Black sagte, muss ich jeweils separate Funktionen schreiben, um den Übersetzungs-/Dreh-/Skalenmatrix-Inhalt in Vertex-Daten umzuwandeln ... –
Nun, vielleicht verstehe ich nicht, worauf Sie abzielen, aber Sie Sicherlich müssen Sie Ihre Matrixtransformationen nicht zerlegen, um sie auf einen Stützpunkt anzuwenden. Vielleicht werfen Sie einen Blick auf die Implementierung von [vec3.transformMat4] (https://github.com/toji/gl-matrix/blob/master/src/gl-matrix/vec3.js#L496) (die Übersetzung wird in der Zeile angewendet) 498). Es gibt nichts "Magisch" innerhalb von Shadern außer dem [Perspektive teilen] (http://www.learnopengles.com/tag/perspective-divide/) für 'gl_Position'. –