我在 WebGL 中创建了一个立方体。我心里有一个动画,但正在努力将其组合在一起。
完整代码大约有 150 lns 代码,所以这里是一个工作示例: Working Plunkr Code
这是我想要实现的动画的视频线框: https://youtu.be/sZeBm8EM3mw
1 - 动画将 anchor 设置在立方体的左下角。
2 - 动画从 anchor 缩放立方体。
3 - 动画将立方体从 anchor 旋转到大约一半的比例。
着色器: (顶点)
attribute vec4 coords;
attribute float pointSize;
uniform mat4 transformMatrix;
attribute vec4 colors;
varying vec4 varyingColors;
uniform mat4 perspectiveMatrix;
void main(void) {
gl_Position = perspectiveMatrix * transformMatrix * coords;
gl_PointSize = pointSize;
varyingColors = colors;
}
(片段)
precision mediump float;
uniform vec4 color;
varying vec4 varyingColors;
void main(void) {
gl_FragColor = varyingColors;
}
我正在使用gl-matrix做wall矩阵变换
转换将进入绘制 fn 并使用 gl-matrix mat4。
function draw() {
var transformMatrix = gl.getUniformLocation(shaderProgram, "transformMatrix");
gl.uniformMatrix4fv(transformMatrix, false, matrix);
// mat4.rotateY(matrix, matrix, 0.01); // This is example of rotations
gl.clear(gl.COLOR_BUFFER_BIT);
gl.drawElements(gl.TRIANGLES, indexCount, gl.UNSIGNED_BYTE, 0);
requestAnimationFrame(draw);
}
最佳答案
您必须在转换中添加所谓的“枢轴”。通常且简单的变换定义如下:
transform = scale * rotate * translate;
地点:
scale = | rotate = | translate =
Sx 0 0 0 | Xx Xy Xz 0 | 1 0 0 0
0 Sy 0 0 | Yx Yy Yz 0 | 0 1 0 0
0 0 Sz 0 | Zx Zy Zz 0 | 0 0 1 0
0 0 0 1 | 0 0 0 1 | Tx Ty Tz 1
要围绕枢轴点( anchor )执行旋转/缩放,您必须添加一个描述枢轴位置(相对于对象中心)的枢轴矩阵:
pivot =
1 0 0 0
0 1 0 0
0 0 1 0
Px Py Pz 1
你的转换公式如下:
transform = inverse(pivot) * scale * rotate * pivot * translate;
问题是,虽然缩放 * 旋转 * 平移
很容易优化(简化以避免真正的矩阵乘法),但使用枢轴则优化变得更加棘手。
注意:您还可以从 this documentation 获得灵感,这是 Maya API 变换类文档,它提供了一个“过度杀伤”的变换公式。我过去用它来理解转换是如何工作的。
关于javascript - 如何对比例进行关键帧动画并从 webGL 立方体的 anchor 旋转?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46682127/