Три JS - преобразование applyMatrix4 не сохраняет направление собственного вектора - PullRequest
0 голосов
/ 25 февраля 2020

Я преобразовал вектор, который лежит на собственном пространстве матрицы преобразования, используя Object3D.applyMatrix4. Я ожидал, что он вообще не будет двигаться, потому что собственное значение равнялось 1 или, по крайней мере, оставалось на его промежутке, но оно переместилось в какое-то неожиданное место.

Я создал пример проекта: stackblitz

Но ниже, вероятно, весь код, который вам понадобится

let pointGeo = new THREE.Geometry()
pointGeo.vertices = [new THREE.Vector3(1,-1,1)]
let pmat = new THREE.PointsMaterial({color: 0x00f0f0, size: 0.3})
let pointObj = new THREE.Points(pointGeo, pmat)
let matrix = new THREE.Matrix4()
matrix.set( 1,  3,  3, 0,
           -3, -5, -3, 0,
            3,  3,  1, 0,
            0,  0,  0, 1)
pointObj.applyMatrix4(matrix)

enter image description here

Чтобы объяснить, я преобразовываю точку (1, -1, 1) (где фиолетовый) с матрицей. Умножение на матрицу не должно изменять значение. (проверено дважды ручным вычислением) Но оно перемещает его туда, где находится синий квадрат.

Есть ли другие стадии, где применяется какое-то другое преобразование? Что мне здесь не хватает?

Ответы [ 2 ]

1 голос
/ 25 февраля 2020

Я обнаружил, что Object3D.applyMatrix4 не подходит для явного определения локальной матрицы. Я попытался установить свойство Object3D.matrix напрямую, и это сработало. Я изменил код так:

o.matrix = mat
o.matrixAutoUpdate = false
o.updateMatrixWorld(true)
0 голосов
/ 25 февраля 2020

вот источник для applyMatrix4 ... вы вручную применяете свою матрицу точно так:


        applyMatrix4 ( m ) {

            var x = this.x, y = this.y, z = this.z;
            var e = m.elements;

            var w = 1 / ( e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] );

            this.x = ( e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] ) * w;
            this.y = ( e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] ) * w;
            this.z = ( e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] ) * w;

            return this;

        },
    ```

...