WebGL笔记:js中矩阵库的使用

本文介绍了如何在three.js中使用Matrix4对象进行3D图形的旋转,包括导入Matrix4、实例化并设置旋转值、以及在WebGL中应用矩阵变换的过程。

矩阵库

  • 手写矩阵,其实很麻烦,可以将其模块化
  • 市面上已经有许多开源的矩阵库
    • 比如《WebGL 编程指南》里的 cuon-matrix.js
    • three.js 的 Matrix3 和 Matrix4 对象

three.js的 Matrix4 对象的用法

1 )核心代码

  • 1.引入Matrix4对象

    import { Matrix4 } from 'https://unpkg.com/three/build/three.module.js';
    
  • 2.实例化矩阵对象,在其中写入旋转信息

    const matrix = new Matrix4()
    matrix.makeRotationZ(Math.PI/6)
    
  • 3.基于matrix 对象的elements 属性,修改uniform 变量

    const u_Matrix=gl.getUniformLocation(gl.program,'u_Matrix')
    gl.uniformMatrix4fv(u_Matrix,false,matrix.elements)
    

2 )完整代码

<canvas id="canvas"></canvas>
<script id="vertexShader" type="x-shader/x-vertex">
  attribute vec4 a_Position;
  // 列主序
  uniform mat4 u_Matrix;
  void main() {
    gl_Position = u_Matrix * a_Position;
  }
</script>
<script id="fragmentShader" type="x-shader/x-fragment">
  void main() {
    gl_FragColor = vec4(1.0, 1.0, 0.0, 1.0);
  }
</script>
<script type="module">
  import { initShaders } from './utils.js';
  import { Matrix4 } from 'https://unpkg.com/three/build/three.module.js';

  const canvas = document.getElementById('canvas');
  canvas.width = window.innerWidth;
  canvas.height = window.innerHeight;
  const gl = canvas.getContext('webgl');

  const vsSource = document.getElementById('vertexShader').innerText;
  const fsSource = document.getElementById('fragmentShader').innerText;
  initShaders(gl, vsSource, fsSource);

  const vertices = new Float32Array([
    0.0, 0.1,
    -0.1, -0.1,
    0.1, -0.1
  ]);

  const vertexBuffer = gl.createBuffer();
  gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
  gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);
  const a_Position = gl.getAttribLocation(gl.program, 'a_Position');
  gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, 0, 0);
  gl.enableVertexAttribArray(a_Position);

  const u_Matrix = gl.getUniformLocation(gl.program, 'u_Matrix');
  let angle = 0.1;
  const m4 = new Matrix4();
  m4.makeRotationZ(angle);
  gl.uniformMatrix4fv(u_Matrix, false, m4.elements);

  gl.clearColor(0.0, 0.0, 0.0, 1.0);
  gl.clear(gl.COLOR_BUFFER_BIT);
  gl.drawArrays(gl.TRIANGLES, 0, 3);

  !(function animate() {
    angle += 0.05;
    m4.makeRotationZ(angle);
    gl.uniformMatrix4fv(u_Matrix, false, m4.elements);

    gl.clear(gl.COLOR_BUFFER_BIT);
    gl.drawArrays(gl.TRIANGLES, 0, 3);
    requestAnimationFrame(animate);
  })()
</script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值