webGL编程指南 第四章 旋转+平移.TanslatedRotatdTriangle

news2024/10/3 2:24:58

我会持续更新关于wegl的编程指南中的代码。

当前的代码不会使用书中的缩写,每一步都是会展开写。希望能给后来学习的一些帮助

git代码地址 :git

本篇文章将把旋转和平位移结合起来,因为矩阵的不存在交换法则

文章中设计的矩阵地址在这里​​​​​​

我将先学习先旋转再位移

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="../tool/cuon-matrix.js"></script>
</head>

<body>
    <h1>先旋转再位移</h1>
    <h3>可以按下按键ADSW</h3>
    <P id="rotate"></P>
    <P id="translate"></P>
    <canvas id='canvas'></canvas>
    <script>
        let canvas = document.getElementById('canvas');
        canvas.width = window.innerWidth;
        canvas.height = window.innerHeight;
        let gl = canvas.getContext('webgl');

        let vertexShaderSource = `
            attribute vec4 a_Position;
            uniform mat4 u_mat4; 
            void main(){
                gl_Position=u_mat4*a_Position;
            }
        `
        let fragmentShaderSouce = `
            precision mediump float;
            void main(){
                gl_FragColor = vec4(1.0,0.0,0.0,1.0);
            }
        `
        // 创建顶点着色器
        let vertexShader = gl.createShader(gl.VERTEX_SHADER);
        // 绑定顶点着色器
        gl.shaderSource(vertexShader, vertexShaderSource);
        // 编译顶点着色器
        gl.compileShader(vertexShader);

        // 创建片元着色器
        let fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
        // 绑定片元着色器
        gl.shaderSource(fragmentShader, fragmentShaderSouce)
        // 编译片元着色器
        gl.compileShader(fragmentShader)
        //创建渲染程序
        let program = gl.createProgram();
        // 绑定渲染程序
        gl.attachShader(program, vertexShader);
        gl.attachShader(program, fragmentShader);
        gl.linkProgram(program);
        //使用当前渲染程序
        gl.useProgram(program)


        //检测顶点数据是否正确
        if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
            throw gl.getProgramInfoLog(program);
        } 
        //创建矩阵
        let mate4 = new Matrix4()
        // 设置旋转角度
        let rotateX = 0.0;
        // 设置位移的长度
        let translateY = 0.0;
        //三角形的顶点数据
        let positonArray = new Float32Array([0.0, 0.5, -0.5, -0.5, 0.5, -0.5])
        // 获取变量a_Position
        let a_Position = gl.getAttribLocation(program, 'a_Position');
        //获取变量u_mat4
        let u_mat4 = gl.getUniformLocation(program, 'u_mat4');

        //创建缓冲区
        let buffer = gl.createBuffer();
        //绑定缓冲区
        gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
        //缓冲区里面传递数值
        gl.bufferData(gl.ARRAY_BUFFER, positonArray, gl.STATIC_DRAW);
        //给a_Position传递数值
        gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, 0, 0);
        //启用变量
        gl.enableVertexAttribArray(a_Position);

        //绘制
        gl.clearColor(0.0, 0.0, 0.0, 1.0);
     
        //绘制三角形
        const render = function () {
            //设置三角形的角度
            mate4.setRotate(rotateX,0,0,1);
            //设置位移的差量
            mate4.translate(0,translateY,0);
            // 设置矩阵
            gl.uniformMatrix4fv(u_mat4, false, mate4.elements) 
            gl.clear(gl.COLOR_BUFFER_BIT);
            gl.drawArrays(gl.TRIANGLES, 0, 3)

            setNum()
        }
        render()

        document.onkeydown = function (e) {    //对整个页面监听  
            var keyNum = window.event ? e.keyCode : e.which;       //获取被按下的键值  
            //判断如果用户按下了回车键(keycody=13)  
            if (keyNum == 65) {
                console.log('A');
                rotateX -= 1;  
                render()
            }

            //判断如果用户按下了空格键(keycode=32),  
            if (keyNum == 68) {
                console.log('D');
                rotateX +=1;  
                render()
            }
            //判断如果用户按下了空格键(keycode=32),  
            if (keyNum == 83) {
                console.log('S'); 
                translateY-=0.1
                render()
            }


            //判断如果用户按下了空格键(keycode=32),  
            if (keyNum == 87) {
                console.log('W'); 
                translateY+=0.1
                render();

            }
        }
        function setNum(){
            let rotate = document.getElementById("rotate");
            let translate = document.getElementById("translate");

            rotate.innerText =  `旋转的角度:${rotateX}`
            translate.innerText = `平移的距离:${translateY}`
 
        }


    </script>
</body>

</html>

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

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

相关文章

苹果cms模板MXone V10.6魔改版网站源码短视大气海报样式

安装模板教程说明&#xff1a; 1、将模板压缩包上传到苹果cms程序/template下解压 2、网站板选择mxone 模板目录填写html 3、网站模板选择好之后一定要先访问前台&#xff0c;然后再进入后台设置 4、主题后台地址&#xff1a; 苹果cms后台点击&#xff0c;自定义菜单配置 …

6.6 Elasticsearch(六)京淘项目改造

文章目录 1.项目准备2.基础配置2.1 添加pom.xml依赖2.2 yml配置es服务器地址列表 3.具体实现3.1 item实体类封装3.2 添加接口3.3 SearchController 4.search.jsp界面4.1 搜索内容展示4.2 高亮内容样式设置4.3 搜索框内容回填4.4 添加上下页按钮 1.项目准备 我们切换回到此前的…

【C++】继承 ⑨ ( 继承中成员变量同名的处理方案 )

文章目录 一、继承中成员变量同名的处理方案1、继承中成员变量同名的场景说明2、使用域作用符区分同名成员变量 二、代码示例 - 继承中成员变量同名的处理方案 一、继承中成员变量同名的处理方案 1、继承中成员变量同名的场景说明 子类 继承 父类 的 成员 , 如果 子类 中定义了…

[数据分析与可视化] 基于Python绘制简单动图

动画是一种高效的可视化工具&#xff0c;能够提升用户的吸引力和视觉体验&#xff0c;有助于以富有意义的方式呈现数据可视化。本文的主要介绍在Python中两种简单制作动图的方法。其中一种方法是使用matplotlib的Animations模块绘制动图&#xff0c;另一种方法是基于Pillow生成…

2023年腾讯云双11活动入口及内容详细解读

2023年腾讯云11.11云上盛惠活动&#xff0c;海量产品轻松上云&#xff0c;免费领取9999元代金券礼包&#xff1b;云服务器、云数据库、COS等上云必备产品&#xff0c;低至1.8折起&#xff1b;云产品助力企业和开发者轻松上云&#xff01; 下面给大家分享腾讯云双11活动入口及活…

Android Jetpack重要吧?需要学习有这么多

Jetpack简单理解 2018年谷歌I/O 发布了一系列辅助Android开发者的实用工具&#xff0c;合称Jetpack&#xff0c;以帮助开发者构建出色的 Android 应用。 官方JetPack介绍 大体上&#xff0c;JetPack是Google推出的一些库的集合。是Android基础支持库SDK以外的部分。包含了组…

问题:Uncaught Error: “xxx“ is read-only

文章目录 问题分析 问题 控制台报错如下 分析 在这里使用了 const 定义常量 const声明一个只读的常量。一旦声明&#xff0c;常量的值就不能改变。 let是块级作用域&#xff0c;函数内部使用let定义后&#xff0c;对函数外部无影响。

【人工智能专栏】(2)知识表示方法 I

目录 1. 知识与知识表示1.1 什么是知识&#xff1f;1.2 什么是数据-信息-知识&#xff1f;1.3 人工智能系统所关心的知识1.4 什么是知识表示&#xff1f;1.5 知识表示要注意的问题1.6 AI对知识表示方法的要求 2. 状态空间法2.1 什么是状态空间法&#xff1f;2.2 状态空间法三要…

数据挖掘和大数据的区别

数据挖掘 一般用于对企业内部系统的数据库进行筛选、整合和分析。 操作对象是数据仓库&#xff0c;数据相对有规律&#xff0c;数据量较少。 大数据 一般指对互联网中杂乱无章的数据进行筛选、整合和分析。 操作对象一般是互联网的数据&#xff0c;数据无规律&#xff0c;…

关于Fragment的生命周期,你知道多少?

Fragment生命周期 Fragment是Android中用于构建用户界面的一种组件。 Fragment具有自己的生命周期&#xff0c;包括以下几个阶段&#xff1a; onAttach(): 当Fragment与Activity关联时调用&#xff0c;可以通过该方法获取到所关联的Activity的引用。 onCreate(): 在Fragment创…

13.4web自动化测试(Selenium3+Java)

一.定义 用来做web自动化测试的框架. 二.特点 1.支持各种浏览器. 2.支持各种平台(操作系统). 3.支持各种编程语言. 4.有丰富的api. 三.工作原理 四.搭环境 1.对照Chrome浏览器版本号,下载ChromeDriver,配置环境变量,我直接把.exe文件放在了jdk安装路径的bin文件夹下了(j…

最新Python深度学习技术进阶与应用

最新Python深度学习技术进阶与应用&#xff08;图神经网络&#xff09; 近年来&#xff0c;伴随着以卷积神经网络&#xff08;CNN&#xff09;为代表的深度学习的快速发展&#xff0c;人工智能迈入了第三次发展浪潮&#xff0c;AI技术在各个领域中的应用越来越广泛。为了帮助广…

网络第一课

✍ 如何理解局域网和广域网&#xff1f; ✍ 路由器和交换机是怎样工作的&#xff1f; ✍ 三层交换机能不能代替路由器&#xff1f; -- 1.局域网 2. 广域网 -- -- 企业网络 运营商架构 数据中心架构 -- 局域网 - 内网 - 私网 -- 通过交换机连接的 转发相同IP地址段的…

若依和芋道

国外卷技术,国内卷业务,做管理业务通常使用开源框架就可以快速满足,若依和芋道都是开源二开工具较为流行的框架,芋道是基于若依的,基本上是开发人员自己写业务开发框架的天花板,两者的前端都是基于vue-element-admin的,使用Gitee上两者的SpringBoot的最轻量化版本进行对…

Transformer 简单理解

文章目录 一、Transformer的架构一、编码1.1 词向量编码&#xff08;Input Embedding&#xff09;1.2 位置编码&#xff08;Positional Encoding&#xff09; 二、Mask2.1 PAD Mask2.2 上三角Mask 二、注意力计算2.1 Q、K、V 向量的生成2.2 自注意力计算流程2.2 单头注意力和多…

MTK OEM解锁步骤

1.在win10 首选安装驱动 插入usb线后&#xff0c;进入在设备管理器 里面看到 未识别黄色图标的 android 以后&#xff0c;右击点击更新驱动&#xff0c;然后安装解压后的驱动 同时在开发者模式里面的 oem解锁开关打开 2. adb 命令解锁步骤 1.adb reboot bootloader 2.fastbo…

Json字符串转换小工具

下载【免费】Json字符串格式化和压缩&#xff0c;支持数组元素的不换行且能转换成16进制资源-CSDN文库 推荐理由&#xff1a; 离线使用支持json字符串的数据格式化和压缩&#xff0c;如&#xff1a;图1支持数组元素的16进制转换&#xff0c;如&#xff1a;图2支持数组元素不换…

【AI视野·今日CV 计算机视觉论文速览 第272期】Fri, 20 Oct 2023

AI视野今日CS.CV 计算机视觉论文速览 Fri, 20 Oct 2023 Totally 62 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computer Vision Papers Putting the Object Back into Video Object Segmentation Authors Ho Kei Cheng, Seoung Wug Oh, Brian Price, Joon Youn…

用长tree方式做等长线

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 相关文章链接: 用set_data_check的方式做等长线 前面讲过了如何用set_data_check做等长线,这里再讲一下如何用cts的方式做。 1)写一个sdc,把等长线的起点设置成clock source,用于创建create_…

网易云音乐下载的歌曲能永久听吗?超级简单!

网易云下载的歌曲当然可以永久听&#xff0c;只是因为网易云音乐是ncm格式&#xff0c;在很多平台不兼容&#xff0c;这时候就需要转换成兼容性更高的MP3格式&#xff0c;了解一些音频转换工具&#xff0c;就可以轻松搞定&#xff01; 方法一&#xff1a;使用野葱视频转换器 1…