保持 vertexShader 的运动,尽管它的网格旋转
Keep movement of vertexShader despite of its mesh rotation
我只是沿着 y 轴移动立方体的顶点。
它工作正常,但是当我开始旋转我的立方体时,运动停留在全局 y 轴上。有谁知道如何防止这种行为?意思是让我的顶点的旋转和移动分开?
https://codepen.io/michaelgrc/pen/JjrMVPm?editors=0010
void main()
{
vec4 modelPosition = modelMatrix * vec4(position, 1.0);
float deplacement = sin(uTime) * 2.;
modelPosition.y += deplacement;
vec4 viewPosition = viewMatrix * modelPosition;
vec4 projectedPosition = projectionMatrix * viewPosition;
gl_Position = projectedPosition;
}
矩阵运算不是Commutative。你实际做的是在应用 modelMatrix
:
之后翻译模型
v' = translate * modelMatrix * v;
但是您必须先应用翻译:
v' = modelMatrix * translate * v;
例如:
void main()
{
mat4 translate = mat4(1.0);
translate[3].y = sin(uTime) * 2.0;
vec4 modelPosition = modelMatrix * translate * vec4(position, 1.0);
gl_Position = projectionMatrix * viewMatrix * modelPosition;
}
请注意,使用 Group 也可以实现同样的效果。必须将旋转应用到 Group 并将平移应用到 Group 中的 Mesh。
group = new THREE.Group();
group.add(mesh);
mesh.position.y = offset;
group.rotation.x = angle_x;
group.rotation.y = angle_y;
我只是沿着 y 轴移动立方体的顶点。
它工作正常,但是当我开始旋转我的立方体时,运动停留在全局 y 轴上。有谁知道如何防止这种行为?意思是让我的顶点的旋转和移动分开?
https://codepen.io/michaelgrc/pen/JjrMVPm?editors=0010
void main()
{
vec4 modelPosition = modelMatrix * vec4(position, 1.0);
float deplacement = sin(uTime) * 2.;
modelPosition.y += deplacement;
vec4 viewPosition = viewMatrix * modelPosition;
vec4 projectedPosition = projectionMatrix * viewPosition;
gl_Position = projectedPosition;
}
矩阵运算不是Commutative。你实际做的是在应用 modelMatrix
:
v' = translate * modelMatrix * v;
但是您必须先应用翻译:
v' = modelMatrix * translate * v;
例如:
void main()
{
mat4 translate = mat4(1.0);
translate[3].y = sin(uTime) * 2.0;
vec4 modelPosition = modelMatrix * translate * vec4(position, 1.0);
gl_Position = projectionMatrix * viewMatrix * modelPosition;
}
请注意,使用 Group 也可以实现同样的效果。必须将旋转应用到 Group 并将平移应用到 Group 中的 Mesh。
group = new THREE.Group();
group.add(mesh);
mesh.position.y = offset;
group.rotation.x = angle_x;
group.rotation.y = angle_y;