Vue与WebGL结合---旋转平移矩阵

12 篇文章 1 订阅

本文在上文的基础上加上旋转平移矩阵,以达到对图像进行基本的旋转平移操作的目的。文中部分代码源自《WebGL编程指南》

代码如下:

<template>
  <div>
    <canvas ref="myglCanvas" width="400" height="400"></canvas>
  </div>
</template>

<script>
import Tools from "../lib/tools";
import {mat4} from "../lib/glMatrix/index";
import {glMatrix} from "../lib/glMatrix/index";

export default {
  name: "glCanvas",
  data() {
    return {
      VSHEADER_SOURCE: `attribute vec4 a_Position;
                        uniform mat4 u_modelMatrix;
                        void main(){
                        gl_Position = u_modelMatrix * a_Position;
                        }`,
      FSHEADER_SOURCE: `void main(){
                        gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
                        }`,
    
      gl: null
    };
  },
  methods: {
    initBuffer: function(gl) {
      let vertices = new Float32Array([0, 0.3, -0.3, -0.3, 0.3, -0.3]);
      let n = 3; // The number of vertices

      //旋转角度
      const angle = 60;
      //x方向平移距离
      const transx = 0.5;

      //将角度转为弧度
      const angleRad = glMatrix.toRadian(angle)
      //创建旋转平移矩阵
      let modelMatrix = mat4.create();
      //绕z轴旋转
      mat4.rotateZ(modelMatrix, modelMatrix, angleRad);
      //沿x轴平移
      mat4.translate(modelMatrix, modelMatrix, [transx,0,0]);
      //将模型矩阵传入到顶点着色器
      let u_modelMatrix = gl.getUniformLocation(gl.program,"u_modelMatrix");

      // 创建缓冲区
      let vertexBuffer = gl.createBuffer();
      if (!vertexBuffer) {
        console.log("Failed to create the buffer object");
        return -1;
      }

      // 绑定缓冲区
      gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
      // 将数据写入缓冲区
      gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);

      let a_Position = gl.getAttribLocation(gl.program, "a_Position");
      if (a_Position < 0) {
        console.log("Failed to get the storage location of a_Position");
        return -1;
      }
      //  将缓冲区对象分配给attribute对象
      gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, 0, 0);
      gl.uniformMatrix4fv(u_modelMatrix,false,modelMatrix);
      // 开启attribute对象
      gl.enableVertexAttribArray(a_Position);

      return n;
    },
    setGL: function() {
      this.gl = this.$refs.myglCanvas.getContext("webgl");
    }
  },
  mounted() {
    this.setGL();
    Tools.initShaders(this.gl, this.VSHEADER_SOURCE, this.FSHEADER_SOURCE);
    let n = this.initBuffer(this.gl);
    if (n < 0) {
      console.log("Failed to set the positions of the vertices");
      return;
    }

    //设置背景色
    this.gl.clearColor(0.0, 0.0, 0.0, 1);
    //设置缓冲区颜色
    this.gl.clear(this.gl.COLOR_BUFFER_BIT);
    // Draw the rectangle
    this.gl.drawArrays(this.gl.TRIANGLES, 0, n);
  }
};
</script>

<style scoped>

</style>

9-10行  引入gl-matrix库;

16-20行  顶点着色器,这里点的位置有旋转平移矩阵与点的坐标相乘得到;

39行 将角度转为弧度;

43行  矩阵绕z轴旋转;

45行 矩阵沿x轴平移;

47行  获取顶点着色器变量u_modelMatrix;

68行  给modelMatrix分配给u_modelMatrix;

效果如下:

更多内容请扫码关注我的微信公众号,或者在微信里搜索公众号webgis学习,我会不定期更新自己的webgis方面的学习心得。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值