对于学习OpenGL有一个误区,就是大家认为,如果不能精通那些3D图形数学知识,会让我们寸步难行,其实不然。就像我们不需要懂得任何关于汽车结构和内燃机方面的知识也能每天开车。但是,我们最好能对汽车有足够的了解,以便我们意识到 什么时候需要更换机油、定期加油、汽车常规保养工作。同样要成为一名可靠和有能力的OpenGL程序员,至少需要理解这些基础知识,才知道能做什么?以及哪些工具适合我们要做的工作。初学者,经过一段时间的实践,就会渐渐理解矩阵和向量。并且培养出一种更为直观的能力,能够在实践中充分利用所学的内容。
即使大家现在还没有能力在脑海中默算出2个矩阵的乘法、也要明⽩矩阵是什么?以及这些矩阵对 OpenGL意味着什么?
GLTools 库中有⼀个组件叫Math3d,其中包含了⼤量好⽤的OpenGL一致的3D数学和数据类型。虽然我们不必亲自进行所有的矩阵和向量的操作,但我们要知道它们是什么?以及如何运用它们。
关于3D数学,是大家触碰OpenGL、甚⾄你们接触的 AR Kit 框架以及 Unity3D、游戏开发都是必须学习的一块。
在开发过程我们涉及到的图形变换,就会涉及到矩阵/向量的计算。例如大家在使用CAnimation实现仿射变换,就使用了OpenGL渲染技术。
下面,我们一起来看看OpenGL矩阵与向量吧
-
OpenGL里的矩阵/向量使用
3个值(x、y、z)组合起来表示2个重要的值,⽅向和数量
-
OpenGL math3d库
math3d库,有2个数据类型,能够表示一个三维或者四维向量。“M3DVector3f”可以表示一个三维向量(x,y,z),而“M3DVector4f”则可以表示⼀个四维向量量(x,y,z,w)。在典型情况下,w坐标设为1.0。x,y,z值通过除以w,来进行缩放。而除以1.0则本质上不改变x,y,z值。
typedef float M3DVector3f[3];
typedef float M3DVector4f[4];
//声明一个三分量向量操作:
M3DVector3f vVector3;
//声明一个四分量的操作:
M3DVector4f vVector4 = {0.0f,0.0f,1.0f,1.0f};
//声明一个三分量顶点数组,例如生成一个三角形
M3DVector3f vVerts[] = {
-0.5f,0.0f,0.0f,
0.5f,0.0f,0.0f,
0.0f,0.5f,0.0f
};
说到这里,我们来了解下向量/矩阵的点乘与叉乘
-
向量/矩阵 点乘
//实现点乘方法:
// 方法1:返回的是-1,1之间的值。它代表这个2个向量的余弦值。
float m3dDotProduct3(const M3DVector3f u,const M3DVector3f v);
//方法2:返回2个向量之间的弧度值。
float m3dGetAngleBetweenVector3(const M3DVector3f u,const M3DVector3f v);
-
向量/矩阵 叉乘
void m3dCrossProduct3(M3DVector3f result,const M3DVector3f u ,const M3DVector3f v);
那在OpenGL下的矩阵又是怎样的呢?
typedef float M3DMatrix33f[9];
typedef float M3DMatrix44f[16];
-
OpenGL变换术语
以上就是这次OpenGL矩阵与向量的一些基本知识啦,后面会单独开一篇文章分析讲解矩阵的压栈和出栈,欢迎大家持续关注!
网友评论