OpenGL 向量
2020-07-16 本文已影响0人
Joker_King
单位向量
在3D笛卡尔坐标系中,基本上一个顶点就是XYZ坐标空间上的一个位置,而在空间中给定的一个位置,恰恰是由一个单独的XYZ定义的,而这样的XYZ就是向量。
在X轴上的向量(1,0,0)。向量长度为1,我们称之为单位向量。
向量长度(向量的模)的计算公式。
单位化向量
如果向量不是单位向量,而我们把它缩放到1,那么这个过程就叫做标准化,将一个向量进行标准化就是把它的模缩为1,也叫单位化向量。
OpenGL如何定义向量
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:类型 vVector:变量名 M3DVector3f vVector;
//声明一个四维向量并初始化一个四维向量
M3DVector4f vVertex = {0,0,1,1};
//声明⼀个三分量顶点数组,例如生成一个三角形
M3DVector3f vVerts[] = {
-0.5f,0.0f,0.0f, 0.5f,0.0f,0.0f, 0.0f,0.5f,0.0f
};
向量、点乘
向量可以进行加法,减法计算。但是向量里有一个在开发中使用价值非常高的操作,叫做“点乘(dot product)”。点乘只能发生在2个向量之间进行;
2个(三维向量)单元向量之间进行点乘运算将得到一个标量(不是三维向量,是一个标量)。它表示两个向量之间的夹角。
前提条件:
- 2个向量必须为单位向量。
- 动作:2个三维向量之间进行点乘。
- 结构:返回一个「-1,1]范围的值,这个值其实就是夹角的cos值(余弦值)
如何单位化向量?
(x/|xyz|, y/|xyz|, z/|xyz|);
使用一个非零相量除以它的模(向量的长度),就可以得到方向相同的单位向量。
image
math3d库中提供了关于点乘的API。
//1.m3dDotProduct3函数获得2个向量之间的点乘结果;
float m3dDotProduct3(const M3DVector3f u,const M3DVector3f v);
//2.m3dGetAngleBetweenVector3可获得2个向量之间夹角的弧度值;
float m3dGetAngleBetweenVector3(const M3DVector3f u,const
M3DVector3f v);
向量、叉乘
向量之间的叉乘(cross product)也是在业务开发里非常有用的一个计算方式;2个向量之间叉乘就可以得到另外一个向量,新的向量会与原来2个向量定义的平面垂直,同时进行叉乘,不必为单位向量。
- 前提:2个普通向量;
- 动作:向量与向量叉乘;
- 向量(垂直于原来2个向量定义的平面的向量);
math3d库中提供了关于叉乘的API。
//1.m3dCrossProduct3函数获得2个向量之间的叉乘结果,得到一个新的向量。
void m3dCrossProduct3(M3DVector3f result,const M3DVector3f u ,const M3DVector3f v);