Ich habe ein Array mit einer 4x4-Transformationsmatrix, die Rotations- und Positionsdaten codiert (ich habe bereits bestätigt, dass diese Matrix eine gültige Transformation in Octave darstellt). Ich möchte die Eigenschaft matrixWorld eines three.js-Objekts (Object3D) mit dem Inhalt dieses Arrays festlegen, d. H. Die Position und Drehung des Objekts basierend auf der Transformationsmatrix festlegen.MatrixWorld-Eigenschaft eines three.js-Objekts setzen
Nach this page aus der three.js Dokumentation und verschiedenen hier gestellten Fragen (zum Beispiel this one und this one), so scheint es der Schlüssel nameOfObject.matrixAutoUpdate
auf false gesetzt ist. Mit dieser Berechnung habe ich verschiedene Ansätze versucht, nameOfObject.matrixWorld
zu setzen, und keiner von ihnen ändert den Ort, an dem das Objekt gerendert wird: Es bleibt im Ursprung ohne Drehung, wie es der Fall ist, wenn matrixWorld
die 4x4-Identität ist Matrix.
Hier ist, was ich versucht habe (dieser Code innerhalb einer Update-Methode vor render()
genannt wird):
// Setting up a three.js matrix
var tempMatrix = new THREE.Matrix4();
tempMatrix.fromArray(arrayContainingTransformationMatrix);
// Values are set as expected
console.log(tempMatrix.elements);
// Note that the approaches below were tried one at a time
// First approach (doesn't work)
nameOfObject.matrixAutoUpdate = false;
nameOfObject.matrixWorld.copy(tempMatrix);
// Second approach (also doesn't work)
// Based on the second SO question linked above
nameOfObject.matrixAutoUpdate = false;
nameOfObject.matrix.copy(tempMatrix);
nameOfObject.updateMatrixWorld(true);
// Third approach (this doesn't work either, unfortunately)
nameOfObject.matrixAutoUpdate = false;
nameOfObject.matrixWorld.fromArray(arrayContainingTransformationMatrix);
// Appears to be set correctly regardless of which approach is used
console.log(sphere1.matrixWorld.elements);
Ein paar Anmerkungen:
- Ich würde erwarten, dass es eigentlich nicht notwendig ist, innerhalb jeder Iteration
matrixAutoUpdate
auf false zu setzen, aber jetzt habe ich es getan, nur um auf Nummer sicher zu gehen. - Wenn
nameOfObject.position
basierend auf den Werten in der vierten Spalte der Transformationsmatrix geändert wird, anstattmatrixWorld
zu ändern, ändert sich die Position des Objekts wie erwartet, sodass dies kein Renderingproblem zu sein scheint. - Ich habe in mehreren Standorten gelesen, dass
updateMatrix()
nicht aufgerufen werden sollte, wenn Sie die Matrix manuell festlegen, wie es auf den Eigenschaftenposition
undrotation
überschreibt. Ich würde annehmen,updateMatrixWorld()
unterliegt ähnlichen Überlegungen, aber ich habe nicht so viel Diskussion darüber gefunden, was es tut.
Irgendwelche Vorschläge würden geschätzt! Im schlimmsten Fall schaue ich mir die Quelle an, aber three.js war bisher ziemlich einfach zu benutzen und ich vermute, dass ich einfach etwas vermisse.
Sie können nur die Matrix des Objekts festlegen. Sie können die Weltmatrix des Objekts nicht festlegen.Ist das deine Frage? "Wie kann ich' object.matrix' so einstellen, dass es zu einer bestimmten 'object.matrixWorld' führt - unter Berücksichtigung der Transformationen der Eltern des Objekts?" – WestLangley
Wenn die Welt-Matrix des Objekts schreibgeschützt ist, beantwortet das meine Frage. Ich nahm an, dass es gesetzt werden könnte, weil die Eigenschaft 'matrixWorld' in den [Object3D docs] (http://threejs.org/docs/index.html#Reference/Core/Object3D) nicht als" readonly "gekennzeichnet ist (die Beschreibungen für andere schreibgeschützte Eigenschaften, z. B. "id", beginnen mit "readonly". –
Es ist nicht schreibgeschützt. Der Renderer setzt es zurück. – WestLangley