WebGL高级变换之Matrix4怎么使用

其他教程   发布日期:2025年03月16日   浏览次数:231

本篇内容介绍了“WebGL高级变换之Matrix4怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

gl-matrix简介

gl-matrix是一个JavaScript库,用于处理线性代数中的向量和矩阵计算。它提供了许多常用的矩阵和向量计算函数,如矩阵相乘、矩阵求逆、矩阵转置、矩阵变换、向量点乘、向量叉乘、向量长度等等。

示例--旋转矩阵变换

步骤:创建变换矩阵,并将变换矩阵传给顶点着色器

WebGL按列矩阵

  1. const VSHADER_SOURCE = `
  2. attribute vec4 a_position;
  3. uniform mat4 u_xformMatrix;
  4. void main(void){
  5. gl_Position=u_xformMatrix * a_position;
  6. }
  7. `

顶点着色器中定义了一个

  1. mat4
类型的变量
  1. u_xformMatrix
,然后新的顶点坐标是矩阵和变换前坐标的乘积

  1. mat4
  1. vec4
类型的区别?
  • mat4是一个4x4的矩阵,用于进行3D变换的计算,例如旋转、缩放和平移.

  • vec4是一个4维向量,用于表示空间中的点或方向

  1. let angle = 60
  2. const radian = Math.PI * angle / 180
  3. const cosB = Math.cos(radian)
  4. const sinB = Math.sin(radian)
  5. const xformMatrix = new Float32Array([
  6. cosB, sinB, 0.0, 0.0,
  7. -sinB, cosB, 0.0, 0.0,
  8. 0.0, 0.0, 1.0, 0.0,
  9. 0.0, 0.0, 0.0, 1.0,
  10. ])
  11. const u_xformMatrix = webgl.getUniformLocation(webgl.program, 'u_xformMatrix')
  12. webgl.uniformMatrix4fv(u_xformMatrix, false, xformMatrix)

由于按列矩阵的特性,可以把

  1. xformMatrix
当作成4*4的矩阵,然后通过方法
  1. uniformMatrix4fv
进行数据的地址赋值即可变换。

gl-matrix 旋转矩阵

  1. const render = () => {
  2. const matrixUniformLocation = webgl.getUniformLocation(webgl.program, "matrix")
  3. // 计算旋转矩阵
  4. const angle = performance.now() / 2000 * Math.PI
  5. const rotationMatrix = mat3.fromRotation(mat3.create(), angle)
  6. // 将矩阵传递给着色器程序
  7. webgl.useProgram(webgl.program)
  8. webgl.uniformMatrix3fv(matrixUniformLocation, false, rotationMatrix)
  9. // 绘制三角形
  10. webgl.clear(webgl.COLOR_BUFFER_BIT)
  11. webgl.drawArrays(webgl.TRIANGLES, 0, 3)
  12. // 循环调用渲染函数以实现动态旋转
  13. requestAnimationFrame(render)
  14. }

  1. mat3.create()
创建了一个3*3的矩阵,
  1. mat3.fromRotation
方法来计算旋转矩阵。该方法接受一个3x3的矩阵作为第一个参数,以及一个角度作为第二个参数,返回一个旋转矩阵。

复合变换

这儿的复合变换直接上

  1. gl-matrix
库下处理矩阵的代码

效果

  1. const vertexShaderSource = `
  2. attribute vec3 aPosition;
  3. attribute vec3 aColor;
  4. varying vec3 vColor;
  5. uniform mat4 uModelMatrix;
  6. void main() {
  7. gl_Position = uModelMatrix * vec4(aPosition, 1.0);
  8. vColor = aColor;
  9. }
  10. `

顶点着色器中设置顶点

  1. gl_Position
,变换矩阵和原来顶点坐标的乘积
  1. const render = () => {
  2. webgl.clear(webgl.COLOR_BUFFER_BIT)
  3. const rotation = Date.now() * rotationSpeed / 10
  4. // 设置放缩变换矩阵
  5. let scaleMatrix = mat4.create()
  6. mat4.scale(scaleMatrix, scaleMatrix, [scale, scale, scale])
  7. // 设置旋转变换矩阵
  8. let rotationMatrix = mat4.create()
  9. mat4.rotateZ(rotationMatrix, rotationMatrix, rotation)
  10. // 将旋转和放缩变换矩阵相乘
  11. let transformMatrix = mat4.create()
  12. mat4.multiply(transformMatrix, rotationMatrix, scaleMatrix)
  13. // 将变换矩阵传递给uniform变量
  14. webgl.uniformMatrix4fv(matrixUniformLocation, false, transformMatrix)
  15. // 绘制正方形
  16. webgl.clearColor(0.0, 1.0, 1.0, 1.0)
  17. webgl.drawArrays(webgl.TRIANGLE_STRIP, 0, 4)
  18. // 更新放缩因子
  19. updateScale()
  20. // 循环调用渲染函数以实现动态旋转
  21. requestAnimationFrame(render)
  22. }
  • 先用

    1. mat4.create()
    创建矩阵,然后设置矩阵数据;
    1. scale
    设置缩放数据,
    1. rotateZ
    设置物体绕
    1. z
    轴旋转
    1. mat4.multiply()
    将旋转和放缩变换矩阵相乘
    1. uniformMatrix4fv
    将变换矩阵传递给uniform变量
  • 绘制图形

放缩因子

  1. const matrixUniformLocation = webgl.getUniformLocation(webgl.program, "uModelMatrix")
  2. const rotationSpeed = 0.005
  3. let scale = 1.0
  4. let delta = 0.005
  5. let direction = 1
  6. const updateScale = () => {
  7. scale += delta * direction;
  8. if (scale >= 1.2 || scale <= 0.5) {
  9. direction = -direction;
  10. }
  11. }

对于这些基础矩阵到复杂变换再到复合变换,那么我们可以熟悉的做到图形的变换了,并且用动画的方式展示出来,之后进入图形的表面了,就是颜色和纹理了

以上就是WebGL高级变换之Matrix4怎么使用的详细内容,更多关于WebGL高级变换之Matrix4怎么使用的资料请关注九品源码其它相关文章!