Я создал сетку куба, используя 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
после перемещения матрицы?