当前位置: 首页 > news >正文

webgl学习笔记四-动画

写在前面

建议先阅读下前面我的三篇文章。

webgl学习笔记一-绘图单点

webgl学习笔记二-绘图多点

webgl学习笔记三-平移旋转缩放

  下面我们将讲解下如何让一个正方形动起来~不断擦除和重绘正方形,并且每次重绘时轻微地改变其角度。

demo

  • 吊下胃口

image

  • html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>

<script src="../../lib/cuon-matrix.js"></script>

<body>
<canvas id="canvas" width="200px" height="200px"></canvas>



</body>
</html>
  • JavaScript
<script>

    // 顶点着色器程序
    var VSHADER_SOURCE =
        'attribute vec4 a_Position;\n' +
        'uniform mat4 u_ModelMatrix;\n' +
        'void main() {\n' +
        '  gl_Position = u_ModelMatrix * a_Position;\n' +
        '}\n';

    // 片元着色器程序
    var FSHADER_SOURCE =
        'void main() {\n' +
        '  gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);\n' +
        '}\n';

    // Rotation angle (degrees/second)
    var ANGLE_STEP = 45.0;

    function main() {

        // init gl
        var gl = initCanvas();

        // Initialize shaders
        var shaderProgram = initShader(gl, VSHADER_SOURCE, FSHADER_SOURCE).program;


        // Write the positions of vertices to a vertex shader
        var n = initVertexBuffers(gl, shaderProgram);
        if (n < 0) {
            console.log('Failed to set the positions of the vertices');
            return;
        }

        // Specify the color for clearing <canvas>
        gl.clearColor(0, 0, 0, 1);

        // Get storage location of u_ModelMatrix
        var u_ModelMatrix = gl.getUniformLocation(shaderProgram, 'u_ModelMatrix');
        if (!u_ModelMatrix) {
            console.log('Failed to get the storage location of u_ModelMatrix');
            return;
        }

        // Current rotation angle
        var currentAngle = 0.0;
        // Model matrix
        var modelMatrix = new Matrix4();

        // Start drawing
        var tick = function () {
            currentAngle = animate(currentAngle);  // Update the rotation angle
            draw(gl, n, currentAngle, modelMatrix, u_ModelMatrix);   // Draw the triangle
            requestAnimationFrame(tick, canvas); // Request that the browser ?calls tick
        };
        tick();
    }

    // init cavas webgl context

    function initCanvas() {

        //获取canvas元素
        var canvas = document.getElementById('canvas');
        //获取绘制二维上下文
        var gl = canvas.getContext('webgl');
        if (!gl) {
            console.log("Failed");
            return null;
        }
        return gl;
    }

    // init shader
    function initShader(gl, vshader_source, fshader_source) {

        //编译着色器

        var vertShader = gl.createShader(gl.VERTEX_SHADER);
        gl.shaderSource(vertShader, vshader_source);
        gl.compileShader(vertShader);

        var fragShader = gl.createShader(gl.FRAGMENT_SHADER);
        gl.shaderSource(fragShader, fshader_source);
        gl.compileShader(fragShader);

        //合并程序
        var program = gl.createProgram();
        gl.attachShader(program, vertShader);
        gl.attachShader(program, fragShader);
        gl.linkProgram(program);
        gl.useProgram(program);

        return {

            program: program
        }
    }

    function initVertexBuffers(gl, shaderProgram) {
        var vertices = new Float32Array([
            -0.5, 0.5, -0.5, -0.5, 0.5, 0.5, 0.5, -0.5
        ]);
        var n = 4;   // The number of vertices

        // Create a buffer object
        var vertexBuffer = gl.createBuffer();
        if (!vertexBuffer) {
            console.log('Failed to create the buffer object');
            return -1;
        }

        // Bind the buffer object to target
        gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
        // Write date into the buffer object
        gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);

        // Assign the buffer object to a_Position variable
        var a_Position = gl.getAttribLocation(shaderProgram, 'a_Position');
        if (a_Position < 0) {
            console.log('Failed to get the storage location of a_Position');
            return -1;
        }
        gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, 0, 0);

        // Enable the assignment to a_Position variable
        gl.enableVertexAttribArray(a_Position);

        return n;
    }

    function draw(gl, n, currentAngle, modelMatrix, u_ModelMatrix) {
        // Set the rotation matrix
        modelMatrix.setRotate(currentAngle, 0, 0, 1);
        modelMatrix.translate(0.35, 0, 0);

        // Pass the rotation matrix to the vertex shader
        gl.uniformMatrix4fv(u_ModelMatrix, false, modelMatrix.elements);

        // Clear <canvas>
        gl.clear(gl.COLOR_BUFFER_BIT);

        // Draw the rectangle
        gl.drawArrays(gl.TRIANGLE_STRIP, 0, n);
    }

    // Last time that this function was called
    var g_last = Date.now();

    function animate(angle) {
        // Calculate the elapsed time
        var now = Date.now();
        var elapsed = now - g_last;
        g_last = now;
        // Update the current rotation angle (adjusted by the elapsed time)
        var newAngle = angle + (ANGLE_STEP * elapsed) / 1000.0;
        return newAngle %= 360;
    }

    main();

</script>

转载于:https://www.cnblogs.com/chenmo-xpw/p/7469144.html

相关文章:

  • 基于Spring MVC实现基于form表单上传Excel文件,批量导入数据
  • 高级终端防护的七大趋势
  • 部署SOA的五大核心原则
  • 《社交网站界面设计(原书第2版)》——第二部分 我是某某 第3章 3.0邀你加入...
  • 《中国人工智能学会通讯》——12.24 问题与挑战
  • MYSQL explain详解
  • mvc简介
  • 多线程下HashMap的死循环问题
  • 在gin框架下集成UEditor富文本编辑器
  • 调用百度地图API搜索地名和关键词
  • 听IBM解读什么是认知商业
  • 知名企业采用Saas 羊群效应或催生行业霸主
  • .net分布式压力测试工具(Beetle.DT)
  • Python中str的format()方法
  • 云计算促使IT体制健全
  • 【译】JS基础算法脚本:字符串结尾
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • docker python 配置
  • ES6简单总结(搭配简单的讲解和小案例)
  • go append函数以及写入
  • JAVA之继承和多态
  • Linux链接文件
  • Linux下的乱码问题
  • MaxCompute访问TableStore(OTS) 数据
  • Rancher-k8s加速安装文档
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • Vue组件定义
  • Yii源码解读-服务定位器(Service Locator)
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 关于for循环的简单归纳
  • 基于组件的设计工作流与界面抽象
  • 检测对象或数组
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 微信小程序填坑清单
  • 小程序 setData 学问多
  • 一起参Ember.js讨论、问答社区。
  • 做一名精致的JavaScripter 01:JavaScript简介
  • 《天龙八部3D》Unity技术方案揭秘
  • Spring Batch JSON 支持
  • 扩展资源服务器解决oauth2 性能瓶颈
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • # .NET Framework中使用命名管道进行进程间通信
  • #NOIP 2014# day.2 T2 寻找道路
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (39)STM32——FLASH闪存
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (pojstep1.1.2)2654(直叙式模拟)
  • (rabbitmq的高级特性)消息可靠性
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (vue)页面文件上传获取:action地址
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (二)正点原子I.MX6ULL u-boot移植
  • (分布式缓存)Redis哨兵
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统