我在WebGL中创建了一个多维数据集。我有一个动画,但我正在努力让它融合在一起。
完整的代码大约是150 lns的代码,所以这是一个工作示例: Working Plunkr Code
这是动画的视频线框,我正在努力实现: https://youtu.be/sZeBm8EM3mw
1 - 动画在立方体的左下角设置一个锚点。
2 - 动画从定位点缩放立方体。
3 - 动画将立方体从锚点大约旋转到刻度的一半。
着色器: (顶点)
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来完成矩阵转换
转换将进入绘制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);
}
答案 0 :(得分:3)
您必须在转换中添加所谓的“Pivot”。通常和简单的转换定义如下:
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
要围绕Pivot Point(锚点)执行旋转/缩放,您必须添加一个描述Pivot位置的Pivot矩阵(相对于对象中心):
pivot =
1 0 0 0
0 1 0 0
0 0 1 0
Px Py Pz 1
你的转型公式如下:
transform = inverse(pivot) * scale * rotate * pivot * translate;
问题是,虽然scale * rotate * translate
很容易优化(简化以避免实际的矩阵乘法),但使用数据透视时,优化会变得更加棘手。
注意:您还可以从this documentation启发,这是Maya API转换类文档,它提供了“过度杀伤”转换公式。我过去用它来理解转换是如何工作的。