javascript - 如何对比例进行关键帧动画并从 webGL 立方体的 anchor 旋转?

标签 javascript animation matrix webgl matrix-transform

我在 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/

相关文章:

javascript - 使用简单脚本进行 HTML 和 JavaScript (jQuery) 过滤

javascript - 在node.js中同步调用进程

ios - 动画完成后执行任务(在 iOS 中)

algorithm - 对于一个矩阵,存在多少个连续的子矩阵?

c - 将矩阵线传递给函数 C

javascript - 尽管网站上有非 SVG 元素,如何在 SVG 上的鼠标光标旁边显示工具提示?

javascript - 无法从 chrome.runtime.sendMessage 访问响应变量。 (关闭?)

animation - 减慢引导微调器

android - ImageView 在另一个 ImageView 之上

python - 从数组创建矩阵