绘制一个立方体—WebGL旋转变换

本文是WebGL电子书的1.5节内容

实现的基本思路很简单,首先提供如上图所示立方体线框所有顶点的三维坐标,然后通过旋转矩阵对所有顶点进行旋转变换,最后调用绘制函数gl.drawArrays把所有点连成线渲染出来。

通过第1.3、1.4两节课案例知道,显示器上显示的实际上是平面的像素,可以简单理解为三维几何体放在你眼睛和显示器之间,几何体在显示器上的投影,视线一定的情况下, 你看到的投影效果取决几何体的位置状态,如果你学过画法几何应该知道轴测图的概念,没学过画法几何,你初高中也应该见过老师在黑板上画立方体的三维效果图, 如果你的视线沿着立方体的边线,投影就是一个平面的正方形,四条边线没有立体效果。如果你想呈现立体效果,你就要调整你看立方体的角度,那么问题来了,立方体8个顶点,如果让 立方体的三条棱线和xyz轴重合,你可以很容易用Javascript的数组写出他的坐标,假设立方体顶点是WebGL坐标系中的相对值±0.5,8各顶点就是(±0.5,±0.5,±0.5),排列组合就可以, 立方体相对WebGL的坐标系如果是倾斜放的(棱线与坐标轴不重合),你就需要笔算出当前8个顶点的坐标值,立方体还算规则,如果一张人脸上千甚至更多的顶点坐标怎么办?这个时候算法上就是需要 矩阵乘法运算来辅助,对于旋转而言就是旋转矩阵,对于硬件而言就是需要GPU,大规模并行处理顶点数据。上一节课说过平移变换,本节课涉及到的就是旋转变换。

体验测试

  • 你可以更改第14行顶点着色器中代码float radian = radians(30.0);的旋转角度数值,刷新浏览器,观察不同角度立方体的效果
//设置几何体轴旋转角度为30度,并把角度值转化为弧度值
float radian = radians(30.0);
  • 尝试更改第99~104行代码绘制函数的第一个参数绘制模式,可以分别测试LINESLINE_LOOPLINE_STRIP,看看有什么不同,进一步加深对绘制模式的理解,对图元装配的理解
//LINE_LOOP模式绘制前四个点
gl.drawArrays(gl.LINE_LOOP,0,4);
//LINE_LOOP模式从第五个点开始绘制四个点
gl.drawArrays(gl.LINE_LOOP,4,4);
//LINES模式绘制后8个点
gl.drawArrays(gl.LINES,8,8);

着色器内置函数

WebGL着色器提供了一系列可以内置函数,也就是说不用声明可以直接调用的函数。

radians()函数:角度值转化为弧度制,参数是浮点数float,比如30度时,要写成30.0

//旋转角度30度转化为弧度值
float radian = radians(30.0);

cos()是余弦函数,参数要求是弧度值且是浮点数

sin()是正弦函数,参数要求是弧度值且是浮点数

//求解旋转角度余弦值
float cos = cos(radian);
//求解旋转角度正弦值
float sin = sin(radian);

关于WebGL着色器内置函数的更多详细介绍,可以查看第二章2.11节。

代码执行流程简述

执行流程和前几节的案例大同小异,主要是多次调用了绘制命令gl.drawArrays。第63行data变量定义的顶点数据初始化时,会存入内存中,执行第91行代码gl.bindBuffer(gl.ARRAY_BUFFER,buffer);内存中的数据一次性传入显存缓冲区中,传入缓冲区中的顶点数据 可以通过drawArrays方法多次调用,每次drawArrays方法调用,顶点经过渲染管线得到的像素相关数据都会存入帧缓存中,后一次调用,前一次调用生成的像素数据不会清空,最终形成一幅完整的立方体线框图。

旋转变换矩阵解析

假设一个点的坐标是(x,y,z),经过旋转变换后的坐标为(x,,y,,z,)

绕Z轴旋转γ角度

z的坐标不变不变,x、y的坐标发生变化,在笛卡尔坐标系下通过简单的数学计算就可以知道结果,x,=xcosγ-ysinγ,y,=xsinγ+ycosγ

这个过程如何用矩阵的乘法描述,如何利用线性代数进行建模,如果你有足够的数学训练,其实很简单,和上一节课一样为了简化问题, 不做深入线性代数的矩阵变换,仅仅采用矩阵的乘法法则进行验证

绕X轴旋转α角度

x的坐标不变不变,y、z的坐标发生变化,y,=ycosα-zsinα,z,=ysinα+zcosα

绕Y轴旋转β角度

y的坐标不变不变,z、x的坐标发生变化,z,=zcosβ-xsinβ,x,=zsinβ+xcosβ

总结

  1. 如果几何体经过多次旋转可以把每一次的旋转矩阵,连续进行乘法运算,最后再左乘顶点的齐次坐标

  2. 旋转变换和平移变换同时存在,旋转矩阵和平移矩阵一样都是四阶矩阵,因此同样可以先进行乘法运算得到的仍是四阶矩阵,最后再左乘顶点的齐次坐标,这种情况也就是复合变换

视觉测试

你可以长时间凝视本案例浏览器页面上的立方体线框,你的大脑中会有两种立体效果来回切换,大脑混淆,立方体的前后位置来回切换, 主要原因是线框模式不符合实际生活物体光学效应。如果想真实模仿生活就要建立光照模型,模拟物体表面与光线的作用,要知光照模型,且听下回分解。 本节课绘制立方体没用采用面,而是投影线,就是因为没有光照模拟的几何体没有任何立体效果。

绘制一个立方体—WebGL旋转变换相关推荐

  1. opengl es3.0学习篇七:使用opengl绘制一个立方体

    2019独角兽企业重金招聘Python工程师标准>>> 这里简单运用之前所学的知识来实现一个对应的立方体: public class MainActivity extends App ...

  2. OpenGl 绘制一个立方体

    https://www.cnblogs.com/icmzn/p/5049768.html https://blog.csdn.net/auccy/article/details/82392921

  3. 用webgl绘制一个彩色旋转立方体

    #用webgl绘制一个旋转立方体 ** 学习交流欢迎加群:789723098,博主会将一些demo整理共享 ** 今天给大家分享一个用webgl写的简单的三维场景:转动的交互式彩色立方体,其六个面的颜 ...

  4. webgl之绘制一个矩形

    功能:使用webgl绘制一个矩形,这里通过绘制两个三角形来实现一个矩形的绘制 步骤: 1 获取webgl上下文 2 获取着色器字符串 3 创建,加载,编译着色器 4 给着色器的变量赋值 5 绘制图形 ...

  5. 【webgl】绘制一个三角形

    [webgl]绘制一个三角形 文章同时发布于:王鹏飞的个人网站. 作为webgl的第一篇文章,首先我推荐几个学习webgl(opengl)的资源: learnopengl中文官网:https://le ...

  6. 【Qt for Android】OpenGL ES 绘制彩色立方体

    Qt 内置对OpenGL ES的支持.选用Qt进行OpenGL ES的开发是很方便的,很多辅助类都已经具备.从Qt 5.0開始添加了一个QWindow类,该类既能够使用OpenGL绘制3D图形,也能够 ...

  7. 安卓学习笔记38:利用OpenGL ES绘制旋转立方体

    文章目录 零.学习目标 一.绘制图形基本步骤 二.绘制旋转立方体 (一)运行效果 (二)实现步骤 1.创建安卓应用[DrawRotatingCube] 2.建模:立方体类 - Cube 3.渲染:立方 ...

  8. python 3d绘图立方体_python绘制3D立方体

    我想绘制一个平行六面体.其实我从python脚本开始画立方体为:python绘制3D立方体 import numpy as np from mpl_toolkits.mplot3d import Ax ...

  9. 使用 Kitten 编程猫绘制一个魔方

    绘制出的魔方效果如下图所示: 在水平方向和 Y 方向绘制的立方体序列集合,我们前文已经叙述过了,本文主要讨论 Z 方向也就是俯视方向的立方体集合如何绘制. 笔者采用的是 Z 方向驱动的绘制方法.如果要 ...

最新文章

  1. java timer cron_Java之旅--定时任务(Timer、Quartz、Spring、LinuxCron)
  2. 数据统计脚本(汇总)
  3. 前端笔记(7)css属性书写顺序,布局流程,chrome调试工具
  4. android ViewPager页面左右滑动切换
  5. qt 报错pcap.h头文件不存在
  6. kvm虚拟化存储管理(3)
  7. 【JUC】JDK1.8源码分析之ConcurrentLinkedQueue(五)
  8. 组合数学基本工具-- 排列与组合以及简单公式
  9. 微信发ascii_微信公众平台开发(107) 分享到朋友圈和发送给好友
  10. WebAudioAPI 入门
  11. 课时22:函数:递归是神马
  12. ※部分VB文章汇总B※
  13. 删除Github仓库某一次commit信息/历史
  14. Linux网络配置与远程连接
  15. 分析wordpress搭建的网站百度收录不好的原因
  16. access violation at address in module Read of address
  17. 算法系列经典书籍:计算机算法设计与分析(第三版)-王晓东编著-电子工业出版社(高清版课本+课后习题答案)
  18. java poi word 表格 重复_java使用poi操作word, 支持动态的行(一个占位符插入多条)和表格中动态行, 支持图片...
  19. 斯坦福计算机科学博士研究方向,美国人工智能专业Top10名校推荐
  20. edm邮件直投_EDM邮件直投专家_EDM邮件直投专家官方版下载 - 邮件处理 - 绿软家园...

热门文章

  1. 编译原理(第3版-王生原)课后习题答案-第二章
  2. Scratch 疑难杂症视频
  3. ColorUI使用帮助
  4. HTTP请求中Get、Post与后台参数接收的分析
  5. Visual Studio 2022 自定义头文件源文件切换快捷键
  6. python excel 之 按格式生成图表和数据
  7. OKR与个人成长:生活中的 OKR
  8. freertos 学习 资源整理
  9. Webstorm自动保存功能设置
  10. ABAP 服务器的架构和一个典型的 ABAP 程序结构介绍