如何关键帧设置缩放比例并从webGL多维数据集的锚点旋转?

时间:2017-10-11 07:19:36

标签: javascript animation matrix webgl matrix-transform

我在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);
}

1 个答案:

答案 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转换类文档,它提供了“过度杀伤”转换公式。我过去用它来理解转换是如何工作的。