Как обновить положение объекта на сцене после перемещения матрицы в вершинном шейдере? - PullRequest
0 голосов
/ 06 июля 2019

Я создал сетку куба, используя THREE.BoxBufferGeometry, и использовал преобразование матрицы для реализации поворота и масштабирования сетки в вершинном шейдере.Все эти матрицы используются в качестве равномерных переменных.После того как я сделал смещение в сетке, сетка успешно реализовала смещение в сцене, но затем я использовала mesh.position, чтобы получить положение сетки в javascript и обнаружила, что его значение не изменилось. mesh.position необновлён.

            material = new THREE.ShaderMaterial( {
                vertexShader: document.getElementById( 'volumeVertex' ).textContent,
                fragmentShader: document.getElementById( 'volumeFragment' ).textContent,
                side: THREE.DoubleSide,

                uniforms: {
                            rotateMatrix:{value:rotateMatrix.elements},
                            scaleMatrix:{value:scaleMatrix.elements},
                            translateMatrix:{value:translateMatrix.elements}
                           }
                });

            boxGeometry = new THREE.BoxBufferGeometry(2, 2, 2);
            boxGeometry.doubleSided = true;
            mesh = new THREE.Mesh( boxGeometry, material );
            scene.add( mesh );

код вершинного шейдера:

<script id="volumeVertex" type="x-shader/x-vertex">
        uniform mat4 rotateMatrix;
        uniform mat4 translateMatrix;
        uniform mat4 scaleMatrix;

        void main()
        {
            vec4 newPos =  translateMatrix * rotateMatrix *scaleMatrix * vec4(position,1.0);
            gl_Position = projectionMatrix *  modelViewMatrix * newPos;

        }

Изменить положение сетки с помощью матрицы:

          var translateMatrix = new THREE.Matrix4();
          translateMatrix.makeTranslation(5,5,5);
          var preTransMatrix = new THREE.Matrix4();
          preTransMatrix.elements = mesh.material.uniforms.translateMatrix.value;
          translateMatrix.multiply(preTransMatrix);
          mesh.material.uniforms.translateMatrix.value = translateMatrix.elements;

Сетка может перемещаться в (5,5,5), но когда я console.log(mesh.position.x,mesh.position.y,mesh.position.z), результатом является начальная позиция (0,0,0). Как обновить mesh.postion после перемещения матрицы?

...