[WebGL入门]十三,minMatrix.js和坐标变换矩阵
注:文章译自http://wgld.org/,原作者杉本雅広(doxas),文章中假设有我的额外说明,我会加上[lufy:],另外,鄙人webgl研究还不够深入,一些专业词语,假设翻译有误,欢迎大家指正。
坐标变换矩阵的基本功能
进行主要的3D渲染的时候,须要准备3个坐标变换矩阵,这个在之前的文章中说过非常多次了。
第一个是模型变换矩阵,DirectX中叫做世界变换矩阵。模型变换矩阵影响的是所绘制的模型,模型的位置,模型的旋转,模型的放大和缩小等相关的情况。
第二个是视图变换矩阵,简单来说,就是定义拍摄3D空间的镜头(摄像机),决定了镜头的位置,镜头的參考点,镜头的方向等。
第三个是投影变换矩阵,这个坐标变换定义了屏幕的横竖比例,剪切的领域等,另外获取远近法则的效果也须要用这个变换矩阵。
依据这些内容,差点儿相同知道了须要对矩阵进行哪些操作。使用minMatrix.js能够对矩阵进行主要的操作,来看一下minMatrix.js都能完毕哪些操作吧。
minMatrix.js的基本功能
本站点开发的minMatrix.js,包括矩阵的生成和矩阵的基本操作,minMatrix.js的核心是一个叫做matIV的对象,通过这个对象能够进行全部的矩阵操作,使用minMatrix.js来操作矩阵的时候,首先,须要生成一个matIV对象。
>生成matIV对象的代码
var m = new matIV();
像上面这样,变量m就是matIV对象的一个实例,通过m.方法名能够调用matIV对象中存在的方法。
以下,列举一下minMatrix.js中定义的matIV对象的方法,先不用立即明确它们的意思,大致看一下就能够。
>>minMatrix.js:create | ||
函数 | : | matIV.create() |
參数 | : | 无 |
返回值 | : | 矩阵 |
生成一个4x4的方阵,里面包括16个元素,事实上是一个Float32Array对象,全部的元素都被初始化为0。 |
>>minMatrix.js:identity | ||
函数 | : | matIV.identity(dest) |
參数 | : | dest > 初始化的矩阵 |
返回值 | : | 初始化后的矩阵 |
将接收的矩阵參数进行初始化并返回。 |
>>minMatrix.js:multiply | ||
函数 | : | matIV.multiply(mat1,mat2,dest) |
參数 | : | mat1 > 相乘的原始矩阵 |
參数 | : | mat2 > 作为乘数的矩阵 |
參数 | : | dest > 用来保存计算结果的矩阵 |
mat1在左,mat2在右,相乘后的结果保存到dest中。 |
>>minMatrix.js:scale | ||
函数 | : | matIV.scale(mat,vec,dest) |
參数 | : | mat > 原始矩阵 |
參数 | : | vec > 缩放向量 |
參数 | : | dest > 用来保存计算结果的矩阵 |
模型变换中的放大缩小,mat是原始矩阵,vec是X,Y,Z的各个缩放值组成的向量,最后的计算结果保存在dest中。 |
>>minMatrix.js:translate | ||
函数 | : | matIV.translate(mat,vec,dest) |
參数 | : | mat > 原始矩阵 |
參数 | : | vec > 表示从原点開始移动一定距离的向量 |
參数 | : | dest > 用来保存计算结果的矩阵 |
模型变换中的坐标移动,mat是原始矩阵,vec是X,Y,Z的各个方向上的移动量组成的向量,最后将计算结果保存到dest中。 |
>>minMatrix.js:rotate | ||
函数 | : | matIV.rotate(mat,angle,axis,dest) |
參数 | : | mat > 原始矩阵 |
參数 | : | angle > 旋转角度 |
參数 | : | axis > 旋转轴的向量 |
參数 | : | dest > 用来保存计算结果的矩阵 |
模型变换中的旋转,mat是原始矩阵,angle是旋转角度,axis是旋转轴向量,最后将计算结果保存到dest中。 |
>>minMatrix.js:lookAt | ||
函数 | : | matIV.lookAt(eye,center,up,dest) |
參数 | : | eye > 镜头位置向量 |
參数 | : | center > 镜头參考点的向量 |
參数 | : | up > 镜头的方向向量 |
參数 | : | dest > 用来保存计算结果的矩阵 |
视图变换矩阵的生成,eye是镜头在三维空间中的位置,center是这个镜头的參考点,up是镜头的方向向量,最后将计算结果保存到dest中。 |
>>minMatrix.js:perspective | ||
函数 | : | matIV.perspective(fovy,aspect,near,far,dest) |
參数 | : | fovy > 视角 |
參数 | : | aspect > 屏幕的宽高比例 |
參数 | : | near > 近截面的位置 |
參数 | : | far > 远截面的位置 |
參数 | : | dest > 用来保存计算结果的矩阵 |
投影变换矩阵的生成,这里生成的是一般被称为[透视射影]的投影变换矩阵,包括远近法则。fovy是视角,aspect是屏幕的横竖比例,near是近截面的位置(必须是大于0的数值),far远截面的位置(随意数值),最后将计算结果保存到dest中。 |
>>minMatrix.js:transpose | ||
函数 | : | matIV.transpose() |
參数 | : | mat > 原始矩阵 |
參数 | : | dest > 用来保存计算结果的矩阵 |
矩阵的行列互换,将计算结果保存到dest中。 |
>>minMatrix.js:inverse | ||
函数 | : | matIV.inverse(mat,dest) |
參数 | : | mat > 原始矩阵 |
參数 | : | dest > 用来保存计算结果的矩阵 |
求矩阵的逆矩阵,mat是原始矩阵,求的的逆矩阵保存到dest中。 |
仅仅包括了特定的功能,所以设计的非常简单。
矩阵变换的流程
使用minMatrix.js的话,能够操作矩阵,那么先来确认一下操作顺序。
模型变换也好,视图变换,投影变换也好,假设不先生成矩阵的话,就什么也做不了。所以首先运行matIV.create生成矩形,然后通过matIV.identity来初始化矩阵,代码例如以下。
>使用matIV对象初始化矩阵
// 生成matIV对象
var m = new matIV(); // 矩阵初始化
var Matrix = m.identity(m.create());
这种话,就能够使用Matrix变量了。
上面的代码同一时候运行矩阵的生成和初期化,向以下这样分开运行也是能够的。
>使用matIV对象初始化矩阵(2)
var Matrix = m.create();
m.identity(Matrix);
然后用这个初始化完的矩阵,来运行自己想要的操作。比方,想使用模型矩阵将模型的坐标向x方向移动一个1.0,代码例如以下。
>モデル変換行列に移動成分を与える例
var Matrix = m.identity(m.create());
m.translate(Matrix, [1.0, 0.0, 0.0], Matrix);
这种话,矩阵Matrix就成为经过了向x方向移动1.0的模型变换后的矩阵了。相同,旋转和缩放也是能够的。可是须要注意的是,移动,旋转,缩放的运行顺序。先移动后旋转和先旋转后移动的结果是有变化的。这是由于旋转是以原点为中心的。所以要十分注意模型变换的运行顺序。
详细的运行顺序应该是,扩大缩小>旋转>移动,这样就能将缩放旋转后的模型移动到正确的位置。
可是,这样还没有完。
OpenGL的矩阵使用列向量,相乘的顺序正好相反。假设好好学习矩阵的计算方法的话就非常easy明确了,列向量和行向量的相乘顺序是全然相反的。也就是说,刚才的的顺序 [扩大缩小>旋转>移动] 得到的结果是全然不一样的,正确的顺序应该是[移动>旋转>扩大缩小],所以生成模型变换矩阵的时候,顺序要特别注意了。
视图变换矩阵的生成使用matIV.lookAt函数,投影变换矩阵的生成使用matIV.perspective函数。
到这一步,模型,视图,投影的各个变换矩阵都已经生成了,然后将三个矩阵相乘,生成最后的坐标变换矩阵,数组之间的相乘使用matIV.multiply函数。
可是,这里有些须要注意的地方。
模型,视图,投影的三个矩阵相乘的顺序非常重要,之前的文章(五,矩阵的基础知识)也说明过了,矩阵相乘的顺序假设改变的话,结果也会改变。尽管说普通的四则运算中求积的时候,左右交换顺序得到的结果是一样的,可是矩阵的话,结果就变了。
坐标变换矩阵一般多使用模型,视图,投影的英文单词的第一个英文字母来表示,如mvpMatrix。相乘的顺序不是mvp,而是p>v>m。使用minMatrix.js的话,代码样例例如以下。
>准备坐标变换的样例
// 各种矩阵的生成和初始化
var mMatrix = m.identity(m.create()); // 模型变换矩阵
var vMatrix = m.identity(m.create()); // 视图变换矩阵
var pMatrix = m.identity(m.create()); // 投影变换矩阵
var mvpMatrix = m.identity(m.create()); // 终于的坐标变换矩阵 // 各个矩阵相乘的顺序使用演示样例
m.multiply(pMatrix, vMatrix, mvpMatrix); // p和v相乘
m.multiply(mvpMatrix, mMatrix, mvpMatrix); // 然后和m相乘
使用到如今位置的步骤,生成坐标变换矩阵之后,终于通知给WebGL,这种方法下回再说。
总结
这次介绍了一下本站点的矩阵计算的库minMatrix.js的主要的用法,和坐标变换矩阵的顺序。
minMatrix.js通过一个叫做matIV的对象来对矩阵进行操作,各种方法的详细内容,如今不明确也不要紧,等必要的时候会进行详细的说明。生成了坐标变换矩阵之后,离绘制多边形还差一小步了。
下次,终于该让多边形显示到画面上了。
[WebGL入门]十三,minMatrix.js和坐标变换矩阵的更多相关文章
- [WebGL入门]十四,绘制多边形
注意:文章翻译http://wgld.org/.原作者杉本雅広(doxas),文章中假设有我的额外说明,我会加上[lufy:].另外,鄙人webgl研究还不够深入.一些专业词语,假设翻译有误,欢迎大家 ...
- Bootstrap入门(二十三)JS插件1:模态框
Bootstrap入门(二十三)JS插件1:模态框 1.静态实例 2.动态实例 3.模态框的尺寸和效果 4.包含表单的模态框 模态框经过了优化,更加灵活,以弹出对话框的形式出现,具有最小和最实用的功能 ...
- [WebGL入门]二十三,反射光的光照效果
注:文章译自http://wgld.org/,原作者杉本雅広(doxas).文章中假设有我的额外说明.我会加上[lufy:],另外,鄙人webgl研究还不够深入.一些专业词语.假设翻译有误.欢迎大家指 ...
- [WebGL入门]十六,绘制多个模型
注意:文章翻译http://wgld.org/.原作者杉本雅広(doxas),文章中假设有我的额外说明,我会加上[lufy:],另外.鄙人webgl研究还不够深入.一些专业词语.假设翻译有误.欢迎大家 ...
- [WebGL入门]十八,利用索引缓存来画图
注:文章译自http://wgld.org/.原作者杉本雅広(doxas),文章中假设有我的额外说明.我会加上[lufy:].另外,鄙人webgl研究还不够深入,一些专业词语,假设翻译有误,欢迎大家指 ...
- [WebGL入门]二十一,从平行光源发出的光
注:文章译自http://wgld.org/,原作者杉本雅広(doxas),文章中假设有我的额外说明.我会加上[lufy:],另外,鄙人webgl研究还不够深入,一些专业词语.假设翻译有误,欢迎大家指 ...
- [WebGL入门]十五,为多边形涂抹颜色(顶点颜色的指定)
注:文章译自http://wgld.org/.原作者杉本雅広(doxas),文章中假设有我的额外说明,我会加上[lufy:].另外.鄙人webgl研究还不够深入.一些专业词语.假设翻译有误.欢迎大家指 ...
- [WebGL入门]十一,着色器编译器和连接器
注意:文章翻译http://wgld.org/,原作者杉本雅広(doxas).文章中假设有我的额外说明.我会加上[lufy:].另外.鄙人webgl研究还不够深入.一些专业词语,假设翻译有误.欢迎大家 ...
- WebGL入门教程(二)-webgl绘制三角形
前面已经介绍过了webgl,WebGL入门教程(一)-初识webgl(http://www.cnblogs.com/bsman/p/6128447.html),也知道了如何绘制一个点,接下来就用web ...
随机推荐
- 文件上传流式处理commons-fileupload
1. 从请求中获取MultipartFile @RequestMapping(value="/upload", method=RequestMethod.POST) public ...
- scrapy-爬取斗图
scrapy-爬取斗图代码 <一> 开局三连杀 1.创建run的文件
- GO语言学习(十六)Go 语言结构体
Go 语言结构体 Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型. 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合. 结构体表示一项记录,比如保存图 ...
- 【例题 7-9 UVA-1601】The Morning after Halloween
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 对于没有出现的,当成0节点就好. 所以总是认为有3个人需要走到各自的终点. 将平面图转成点边图.这样比较好枚举. (二维变成一维,模 ...
- 洛谷 P2025 脑力大人之监听电话
P2025 脑力大人之监听电话 题目背景 画外音: (声明:不要管前面那个,纯属意外,现已经重新编题,绝对原创) 上次海选,我们选出了参赛者中的20%参加本次比赛,现在我们将进行第二轮的筛选,这次的比 ...
- vue 图片lazyload
今天看到我一醉哥的一篇朋友圈分享:<不如我们从头来过 | 掘金> 看完之后,百感交集,互联网的浪潮使创业公司如雨后春笋般崛起, 每一个初创公司都会有一群怀着美好愿景的小伙伴, 但是当寒冬来 ...
- 最新GitHub新手使用教程(Windows Git从安装到使用)——详细图解
说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 一.叙述 1.Git简介 Git(读音为/gɪt/.)是一个开源的分布式版本控制系统,可以有效.高速地处理从很小到非常大的项目版本 ...
- GO语言学习(七)Go 语言变量
Go 语言变量 变量来源于数学,是计算机语言中能储存计算结果或能表示值抽象概念.变量可以通过变量名访问. Go 语言变量名由字母.数字.下划线组成,其中首个字母不能为数字. 声明变量的一般形式是使用 ...
- CQRS之旅——旅程6(我们系统的版本管理)
旅程6:我们系统的版本管理 准备下一站:升级和迁移 "变化是生活的调味品."威廉·考珀 此阶段的最高目标是了解如何升级包含实现CQRS模式和事件源的限界上下文的系统.团队在这一阶段 ...
- mootools常用特性和示例(基础篇2)
接着上一篇:mootools常用特性和示例(基础篇1) 1.表单操作 html: <form id="myForm" action="submit.php" ...