[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的矩阵使用列向量,相乘的顺序正好相反。如果好好学习矩阵的计算方法的话就很容易明白了,列向量和行向量的相乘顺序是完全相反的。也就是说,刚才的的顺序 [扩大缩小>旋转>移动] 得到的结果是完全不一样的,正确的顺序应该是[移动>旋转>扩大缩小],所以生成模型变换矩阵的时候,顺序要特别注意了。

视图变换矩阵的生成使用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的对象来对矩阵进行操作,各种方法的具体内容,现在不明白也不要紧,等必要的时候会进行具体的说明。生成了坐标变换矩阵之后,离绘制多边形还差一小步了。

下次,终于该让多边形显示到画面上了。

转载请注明:转自lufy_legend的博客http://blog.csdn.net/lufy_legend

[WebGL入门]十三,minMatrix.js和坐标变换矩阵,布布扣,bubuko.com

时间: 2024-08-05 04:54:08

[WebGL入门]十三,minMatrix.js和坐标变换矩阵的相关文章

[WebGL入门]十四,绘制多边形

注:文章译自http://wgld.org/,原作者杉本雅広(doxas),文章中如果有我的额外说明,我会加上[lufy:],另外,鄙人webgl研究还不够深入,一些专业词语,如果翻译有误,欢迎大家指正. 这是本次的demo的运行结果 绘制流程 这次终于该绘制多边形了,之前的文章(十一,着色器的编译和连接)中介绍了HTML,顶点着色器和片段着色器,这次看一下javascript从开始到最终的全部处理.如果前两篇文章介绍的内容完全理解的话,这次的内容也应该不难了.或许会有不容易理解的地方,不要着急

[WebGL入门]十七,递归处理和移动?旋转?缩放

注:文章译自http://wgld.org/,原作者杉本雅広(doxas),文章中如果有我的额外说明,我会加上[lufy:],另外,鄙人webgl研究还不够深入,一些专业词语,如果翻译有误,欢迎大家指正. 本次的demo的运行结果 模型坐标变换矩阵的好处 上次,通过操作模型坐标变换矩阵,绘制了多个模型.这次,继续在此基础上,给多个模型再添加上旋转和放大缩小等处理.看过上一篇文章的人应该知道,在3D渲染的世界里,利用VBO和一部分坐标变换矩阵,只需要少量修改,就可以绘制出大量的模型.当然,计算量也

[WebGL入门]二十三,反射光的光照效果

注:文章译自http://wgld.org/,原作者杉本雅広(doxas),文章中如果有我的额外说明,我会加上[lufy:],另外,鄙人webgl研究还不够深入,一些专业词语,如果翻译有误,欢迎大家指正. 本次的demo的运行结果 各种各样的光照 上次,以及上上次,介绍了通过顶点着色器来实现光照效果. 最开始介绍了从平行光源发出的光,上次介绍了平行光源的缺点,以及对应这个缺点的方法,就是环境光源. 这次是光照处理的第三篇,进一步介绍反射光照. 反射光和它的名字一样,就是模拟光的反射.通过反射光,

[WebGL入门]十五,为多边形涂抹颜色(顶点颜色的指定)

注:文章译自http://wgld.org/,原作者杉本雅広(doxas),文章中如果有我的额外说明,我会加上[lufy:],另外,鄙人webgl研究还不够深入,一些专业词语,如果翻译有误,欢迎大家指正. 本次的demo的运行结果 增加顶点属性的个数 上次,终于绘制了一个三角形,但是只绘制了一个纯白色的多边形.这次,给多边形的顶点中添加颜色属性,基本上做的事情和上一篇文章一样,只是稍微增加点步骤而已.首先,就像以前多次重复的那样,顶点可以包含很多种情报(参考:顶点缓存和基础),而且每一个情报叫做

[WebGL入门]十八,利用索引缓存来绘图

注:文章译自http://wgld.org/,原作者杉本雅広(doxas),文章中如果有我的额外说明,我会加上[lufy:],另外,鄙人webgl研究还不够深入,一些专业词语,如果翻译有误,欢迎大家指正. 本次的demo的运行结果 对应复杂的模型 上次,通过操作模型坐标变换矩阵,实现了多个模型的移动,旋转和放大缩小.但是,渲染的依然是简单的三角形,是个构造及其简单的模型.但是实际中,用WebGL来绘制一个简单的三角形的机会是很少见的.至少是个四角多边形吧,通常会是更复杂的模型.伴随着模型的复杂化

[WebGL入门]十一,着色器的编译和连接

注:文章译自http://wgld.org/,原作者杉本雅広(doxas),文章中如果有我的额外说明,我会加上[lufy:],另外,鄙人webgl研究还不够深入,一些专业词语,如果翻译有误,欢迎大家指正. 反复重复的东西 这已经是第11篇了,因为只说了一些基本的东西,到现在为止连个多边形也没绘制出来.哎呀呀呀......不管怎么说吧,基础是很重要的.那就在这些基础上,来绘制一个多边形吧.需要准备的知识都已经介绍过了,剩下的就是按照步骤开始绘制多边形.首先,来确认一下绘制的步骤.?从HTML中获取

[WebGL入门]十六,绘制多个模型

注:文章译自http://wgld.org/,原作者杉本雅広(doxas),文章中如果有我的额外说明,我会加上[lufy:],另外,鄙人webgl研究还不够深入,一些专业词语,如果翻译有误,欢迎大家指正. 本次的demo的运行结果 顶点缓存的重复利用 上一篇文章中,向多边形的三个顶点中添加了颜色这个新的顶点属性,给多边形涂抹了颜色.而且知道,使用新的VBO可以给对顶点属性进行自由的扩张.那么,这次来挑战一下同时绘制多个模型.但是,不准备新的VBO,还利用上次的VBO,就是说,重复利用VBO,只操

[WebGL入门]二十一,从平行光源发出的光

注:文章译自http://wgld.org/,原作者杉本雅広(doxas),文章中如果有我的额外说明,我会加上[lufy:],另外,鄙人webgl研究还不够深入,一些专业词语,如果翻译有误,欢迎大家指正. 本次的demo的运行结果 照亮世界 上次绘制了一个像甜甜圈一样的圆环体模型,虽然没有涉及特别的新知识,但是也算成功的绘制出了3D模型了吧. 那么,这次来看一下光. 光在3D渲染中有很多种类和使用方法,想把光研究透彻,也是很不容易的. 现实世界中我们能看到物体,是因为物体反射的光进入我们的眼睛.

WebGL入门教程第1篇——六色立方

WebGL入门教程第1篇——六色立方 WebGL,一项允许开发人员在浏览器里操纵GPU来显示图形的技术.让我们一起走进WebGL的世界. 读者对象 本系列适合具有基础JavaScript知识的开发人员. 准备工作 我们应该在本地搭建好web服务器,或者安装了具有预览功能的IDE.如果你安装了Visual Studio,Nivk童鞋为我们开发了WebGL代码提示功能,你可以通过以下步骤使Visual Studio支持WebGL代码提示:打开Visual Studio——点击工具——点击选项——展开