webgl-矩阵、旋转、平移、缩放

news2025/1/18 11:54:50

关键代码

旋转

        /*

         * [

         *     cosB, -sinB, 0, 0,

         *     sinB, cosB,  0, 0,

         *     0,     0,    1, 0,

         *     0,     0,    0, 1

         *  ]

         *

         *  矩阵本该是这个但是由于webgl的矩阵行和列是颠倒的所以我们传入的矩阵也需要倒置

         */

        rotationMatrix = [

            cosB, sinB, 0, 0,

            -sinB, cosB, 0, 0,

            0, 0, 1, 0,

            0, 0, 0, 1

        ]

平移矩阵

 

        //向x轴正方向平移0.2

        translateMatrix = [

            1, 0, 0, 0.2,

            0, 1, 0, 0,

            0, 0, 1, 0,

            0, 0, 0, 1

        ]

缩放矩阵

 

        //沿着x,y轴放大2倍

        scaleMatrix =[

            2, 0, 0, 0,

            0, 2, 0, 0,

            0, 0, 1, 0,

            0, 0, 0, 1

        ]

html

<!DOCTYPE html>

<head>

    <style>

        *{

            margin: 0px;

            padding: 0px;

        }

    </style>

</head>

<body>

    <canvas id = 'webgl'>

        您的浏览器不支持HTML5,请更换浏览器

    </canvas>

    <script src="./main.js"></script>

</body>

main.js

let canvas = document.getElementById('webgl')

canvas.width = window.innerWidth

canvas.height = window.innerHeight

let radio = window.innerWidth / window.innerHeight;

let ctx = canvas.getContext('webgl')

//创建顶点资源和像素资源(颜色)

let vertexSource = `

attribute vec2 a_position;

uniform mat4 matrix;

void main() {

  gl_Position = matrix * vec4(a_position, 0.0, 1.0);

  gl_PointSize = 10.0;

}

`

let fragmentSource = `

precision mediump float;

void main (){

  gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);

}

`

if (initShader(ctx, vertexSource, fragmentSource)) {

    //画三角形

    let vertexs = [

        //   x     y    R    G    B

        -0.5, 0.0, 1.0, 0.0, 0.0, //第一个点的信息

        0.5, 0.0, 0.0, 1.0, 0.0, //第二个点的信息

        0.0, 0.5, 0.0, 0.0, 1.0,//第三个点的信息

    ]

    let float32Array = new Float32Array(vertexs)

    //创建buffer

    let buffer = ctx.createBuffer()

    //绑定buffer

    ctx.bindBuffer(ctx.ARRAY_BUFFER, buffer)

    //往buffer中填充值,并指定数据用途

    ctx.bufferData(ctx.ARRAY_BUFFER, float32Array, ctx.STATIC_DRAW)

    //获取vertexShader指定变量内存

    let a_Position = ctx.getAttribLocation(ctx.program, "a_position")

    //指定每两个数组元素为一个点

    /*

     * 当数组元素不需进行分割拆分的时候最后两位可以指定为0,0

     *

     *

     */

    ctx.vertexAttribPointer(

        a_Position, //location: vertex Shader里面的attributes变量的location

        2, ctx.FLOAT, //size: attribute变量的长度 vec2长度2 vec3长度3

        false, //normalized: 正交化 true或false  , [1, 2] => [1/根号5, 2/根号5]

        5 * float32Array.BYTES_PER_ELEMENT, //stride: 每个点的信息所占的BYTES

        0 //offset: 每个点的信息,从第几个BYTES开始数

    )

    ctx.enableVertexAttribArray(a_Position);

    // ctx.drawArrays(ctx.TRIANGLE_FAN, 0, 3)


 

    //旋转矩阵

    let angle = 0

    let rotationMatrix

    let translateMatrix

    function render() {

        angle++

        let cosB = Math.cos(angle / 180 * Math.PI)

        let sinB = Math.sin(angle / 180 * Math.PI)

        /*

         * [

         *     cosB, -sinB, 0, 0,

         *     sinB, cosB,  0, 0,

         *     0,     0,    1, 0,

         *     0,     0,    0, 1

         *  ]

         *

         *  矩阵本该是这个但是由于webgl的矩阵行和列是颠倒的所以我们传入的矩阵也需要倒置

         */

        rotationMatrix = [

            cosB, sinB, 0, 0,

            -sinB, cosB, 0, 0,

            0, 0, 1, 0,

            0, 0, 0, 1

        ]

        //向x轴正方向平移0.2

        translateMatrix = [

            1, 0, 0, 0.2,

            0, 1, 0, 0,

            0, 0, 1, 0,

            0, 0, 0, 1

        ]

        //沿着x,y轴放大2倍

        scaleMatrix =[

            2, 0, 0, 0,

            0, 2, 0, 0,

            0, 0, 1, 0,

            0, 0, 0, 1

        ]

        let matrix = ctx.getUniformLocation(ctx.program, "matrix")

        ctx.uniformMatrix4fv(

            matrix, //localtion:vertex Shader里面的attributes变量的location

            false, //是否转置 一定设置为false

            new Float32Array(rotationMatrix)

        )

        ctx.drawArrays(ctx.TRIANGLE_FAN, 0, 3)

        window.requestAnimationFrame(render)

    }

    render()

}


 

//创建顶点阴影和像素阴影

function createShader(ctx, type, source) {

    //创建shader

    let shader = ctx.createShader(type)

    //绑定

    ctx.shaderSource(shader, source)

    //编译shader

    ctx.compileShader(shader)

    //获取编译结果

    let compiler = ctx.getShaderParameter(shader, ctx.COMPILE_STATUS)

    if (compiler) {

        return shader

    } else {

        let log = ctx.getShaderInfoLog(shader)

        console.log("compile shaders error", log)

        //删除异常的shader,防止内存泄露

        ctx.deleteShader(shader)

        return null

    }

}

function createProgram(ctx, vertexShader, fragmentShader) {

    //创建program

    let program = ctx.createProgram()

    if (!program) {

        return null

    }

    //点资源和像素资源合并

    ctx.attachShader(program, vertexShader)

    ctx.attachShader(program, fragmentShader)

    ctx.linkProgram(program)

    //获取linked的结果

    let linked = ctx.getProgramParameter(program, ctx.LINK_STATUS)

    if (linked) {

        return program

    } else {

        //获取link错误信息

        let log = ctx.getProgramInfoLog(program)

        console.log("link program error", log)

        //删除防止内存泄漏

        ctx.delete(program)

        ctx.deleteShader(vertexShader)

        ctx.deleteShader(fragmentShader)

        return null

    }

}

function initShader(ctx, vertexSource, fragmentSource) {

    let vertexShader = createShader(ctx, ctx.VERTEX_SHADER, vertexSource)

    let fragmentShader = createShader(ctx, ctx.FRAGMENT_SHADER, fragmentSource)

    let program = createProgram(ctx, vertexShader, fragmentShader)

    if (program) {

        ctx.useProgram(program)

        //挂载到ctx

        ctx.program = program

        return true

    } else {

        return false

    }

}

效果图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/428079.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[Python工匠]输出③容器类型

在Python中&#xff0c;最常见的内置容器类型有四种&#xff1a;列表、元组、字典、集合。 列表&#xff08;list&#xff09;是一种非常经典的容器类型&#xff0c;通常用来存放多个同类对象&#xff0c;比如从1到10的所有整数&#xff1a; 元组&#xff08;tuple&#xff09;…

phpstudy本地环境搭建图文教程

作者&#xff1a;Eason_LYC 悲观者预言失败&#xff0c;十言九中。 乐观者创造奇迹&#xff0c;一次即可。 一个人的价值&#xff0c;在于他所拥有的。可以不学无术&#xff0c;但不能一无所有&#xff01; 技术领域&#xff1a;WEB安全、网络攻防 关注WEB安全、网络攻防。我的…

chatgpt VS 文心一言使用对比实测

chatgpt VS 文心一言使用对比实测 什么是文心一言 文心一言&#xff08;英语&#xff1a;ERNIE Bot&#xff09;是由百度公司开发的聊天机器人&#xff0c;能够与人交互、回答问题及协作创作。该产品被传媒称为国际著名聊天机器人ChatGPT的中国版及其竞争对手[1][2]。目前已开…

机器学习——数据处理

机器学习简介 机器学习是人工智能的一个实现途径深度学习是机器学习的一个方法发展而来 机器学习&#xff1a;从数据中自动分析获得模型&#xff0c;并利用模型对未知数据进行预测。 数据集的格式&#xff1a; 特征值目标值 比如上图中房子的各种属性是特征值&#xff0c;然…

数据结构——哈希表相关题目

数据结构——哈希表相关题目242. 有效的字母异位词1.暴力解法2.排序后比较3.哈希表383. 赎金信哈希解法49. 字母异位词分组438. 找到字符串中所有字母异位词3. 无重复字符的最长子串76. 最小覆盖子串349. 两个数组的交集1.排序双指针2.哈希表350. 两个数组的交集 II1.排序双指针…

C++缺省参数详解

在C中&#xff0c;我们经常需要定义函数并给它们传递一些参数。有时候&#xff0c;某些参数的值是不经常改变或者只有特殊情况下才需要指定&#xff0c;这时候我们可以用缺省参数来简化代码。 什么是缺省参数&#xff1f; 缺省参数是声明或定义函数时为函数的参数指定一个缺省…

javascript 中使用 ActiveMQ

javascript 中使用 ActiveMQ 1. 参考文档 https://www.eclipse.org/paho/files/jsdoc/index.html 2. html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" con…

SpringBoot——短信发送、手机验证码登录

目录 一、短信发送 1.1 阿里云短信服务 1.1.1 设置短信签名 1.1.2 模板管理 1.1.3 设置AccessKey 1.2 短信发送——代码开发 1.2.1 导入maven坐标 1.2.2 调用API 1.2 手机验证码登录 1.2.1 用户数据库表 1.2.2 修改过滤器 1.2.3 随机生成验证码的工具类 1.2.4 手机验证码登…

【Linux系统查找错误单词项目和vim的三种模式(命令,输入和底线命令模式)和项目的心得体会】

查找文章中拼写错误的单词的C语言程序 编写的C语言程序&#xff1a; #include<stdio.h> #include<string.h> int main() { FILE *fpfopen("essay.txt","r"); FILE *fp1fopen("words.txt","r"); if(fpNULL&&fp1NU…

CorelDRAW 2022矢量图形制作排版软件图文安装教程

CorelDRAW 2022是一款矢量图形制作和排版软件&#xff0c;做为目前图形设计类软件的领航者&#xff0c;CorelDRAW不断在每个新版本中完善功能&#xff0c;突破自我&#xff0c;并且广泛应用于印刷、出版、平面设计制作、包装设计&#xff0c;工业设计&#xff0c;以及服装设计裁…

学会这10款AI绘画工具,你也可以成为插画师

有些人担心人工智能绘画工具会取代插画师&#xff0c;但与其害怕&#xff0c;不如拥抱新技术&#xff01; 跟随本文了解和掌握新技术。如果你是插画师&#xff0c;以下五个人工智能绘画网站是必要的&#xff1a;「即时AI」&#xff0c;Lexica&#xff0c;DALLLeonardo和Scribb…

C++中文件操作与文件流

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C &#x1f525;座右铭&#xff1a;“不要等到什么都没有了&#xff0c;才下…

Flink SQL 在美团实时数仓中的增强与实践

01 Flink SQL 在美团 目前 Flink SQL 在美团已有 100业务方接入使用&#xff0c;SQL 作业数也已达到了 5000&#xff0c;在整个 Flink 作业中占比 35%&#xff0c;同比增速达到了 115%。 SQL 作业的快速增长给我们带来了许多新的问题和挑战&#xff0c;主要包括以下几点&#…

CTR-GCN 论文解读

论文名称&#xff1a;Channel-wise Topology Refinement Graph Convolution for Skeleton-Based Action Recognition论文下载&#xff1a;https://arxiv.org/pdf/2107.12213.pdf论文代码&#xff1a;https://github.com/Uason-Chen/CTR-GCN CTR-GCN 是中科院自动化所发表在 IC…

项目二,easyx的加入

今天是项目的第二天 与昨天的迷离比起来今天大大的有进步 我对实现啥的功能有了一个基本的方案 1对所有路的查询那就是用dfs 2对最短路的查询就是用的floyed但是,查询是要保存路径的,所以想到了,保存每条最短路的时候 同时把最短路的前驱保存下来,我们可以通过前驱把完整的…

InnoDB中索引的实现

B树索引的使用 5.6.1 不同应用中B树索引的使用 在OLTP应用中&#xff0c;查询操作只从数据库中取得一小部分数据&#xff0c;一般可能都在10条记录以下&#xff0c;甚至在很多时候只取1条记录&#xff0c;如根据主键值来取得用户信息&#xff0c;根据订单号取得订单的详细信息…

Linux下最小化安装CentOS-7.6(保姆级)

文章目录安装包开始安装一、 新建一个虚拟机二、配置安装CentOS7.6二、开始安装CentOS三、配置CentOS并下载基本信息安装包 链接&#xff1a;https://pan.baidu.com/s/1DodB-kDy1yiNQ7B5IxwYyg 提取码&#xff1a;p19i 开始安装 一、 新建一个虚拟机 1、 打开VMWare&#x…

UVCCamera 源码解析

本文将通过UVCCamera源码研究 概述相机传感器数据采集至USB数据传输整个过程 下载源码配置调试环境 git clone GitHub - saki4510t/UVCCamera: library and sample to access to UVC web camera on non-rooted Android device 注释调原有 ndk-build编译方式 //tasks.with…

使用 /permissive- 编译器开关时变量名or被识别为关键字

使用 /permissive- 编译器开关时变量名被识别为关键字 VS2022已经默认开启对c14的支持。并且&#xff0c;一般同时开启的还有/permissive-开关。项目属性如下所示&#xff1a; 然而&#xff0c;在许多早期代码中&#xff0c;函数名和变量名使用了c14等新标准中的关键字&#…

德国访问学者申请签证事宜

德国访问学者长期签证所需材料,下面就随知识人网小编一起看一看。 1、护照及复印件两份。 2、申请表附加表两份(里面有好多注意事项&#xff0c;最重要的是用德文填写&#xff0c;当时我就谷歌翻译后写上去的&#xff0c;最后附加表上的地点&#xff0c;有好多人问填办大使馆还…