2

我在 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进行矩阵转换

转换将进入 draw 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);
}
4

1 回答 1

3

您必须在转换中添加所谓的“枢轴”。通常和简单的转换定义如下:

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 = 

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很容易优化(简化以避免实际矩阵乘法),但使用枢轴优化变得更加棘手。

注意:您也可以从这个文档中获得启发,这是 Maya API 变换类文档,它提供了一个“过度杀伤”的变换公式。我过去用它来理解转换是如何工作的。

于 2017-10-11T11:47:01.763 回答