OpenGL 向量

2020-07-16  本文已影响0人  Joker_King

单位向量

在3D笛卡尔坐标系中,基本上一个顶点就是XYZ坐标空间上的一个位置,而在空间中给定的一个位置,恰恰是由一个单独的XYZ定义的,而这样的XYZ就是向量。

image
在X轴上的向量(1,0,0)。向量长度为1,我们称之为单位向量。
向量长度(向量的模)的计算公式。

单位化向量

如果向量不是单位向量,而我们把它缩放到1,那么这个过程就叫做标准化,将一个向量进行标准化就是把它的模缩为1,也叫单位化向量。

OpenGL如何定义向量

math3d库,有2个数据类型,能够表示一个三维和四维向量。

在典型情况下,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个(三维向量)单元向量之间进行点乘运算将得到一个标量(不是三维向量,是一个标量)。它表示两个向量之间的夹角。

前提条件:

如何单位化向量?

(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个向量定义的平面垂直,同时进行叉乘,不必为单位向量。

image

math3d库中提供了关于叉乘的API。

//1.m3dCrossProduct3函数获得2个向量之间的叉乘结果,得到一个新的向量。
void m3dCrossProduct3(M3DVector3f result,const M3DVector3f  u ,const M3DVector3f v);
上一篇下一篇

猜你喜欢

热点阅读