OpenGL_向量、基础变换、矩阵

2020-07-21  本文已影响0人  星星1024

一、向量

1. 向量的定义

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

2. OpenGL如何定义向量

GLTools库中有一个组件叫Math3d,其中包含了⼤量好用的OpenGL已知的3D数学和数据类型。
Math3d库,有2个数据类型,能够表示一个三维或者四维向量。

参考代码

// 三维向量/四维向量的声明
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
};

4.向量点乘

点乘运算返回两个向量之间的夹角

math3d库中也包含一些有用的函数使用点乘操作。

// 获取两个向量的点乘结果
float m3dDotProduct3(const M3DVector3f u, const M3DVector3f v);

//获取两个向量夹角的弧度制
float m3dGetAngleBetweenVectors3(const M3DVector3f u, const M3DVector3f v);

5.向量叉乘

2个向量之间叉乘就可以得到另外⼀个向量,新的向量会与原来2个向量定义的平⾯垂直. 要进行叉乘,这两个向量都不必为单位向量”。

  1. 前提条件:两个普通向量
  2. 动作:向量与向量叉乘
  3. 结果:向量(垂直于原来2个向量定义的平面的向量)
叉乘运算的结果返回一个新的向量,这个新向量与原来两个向量垂直.

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

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

二、基础变换

OpenGL中涉及的基础变化主要有以下5种:

变换 解释
视图变换 指定观察者位置
模型变换 在场景中移动物体
模型视图变换 描述视图/模型变换的⼆元性(2种看到模型转换的⽅式 )
投影变换 改变视景体⼤⼩和设置它的投影⽅式
视⼝变换 伪变化,对窗⼝上最终输出进⾏缩放

1. 视觉坐标

下图显示了两个不同视点的视觉坐标系。

2. 视图变换

3. 模型变换

旋转 缩放

4. 模型视图变换

5. 投影变换

6. 视口变换

-将得到的一个场景的二维投影,它将被映射到屏幕上某处的窗口上。这种到物理窗口标的映射是我们最后要做的变换,称为视口变换

三、矩阵

1. 单位矩阵

2. 矩阵分类

3. 矩阵相乘

矩阵乘法基本上意味着遵照规定好的法则进行相乘。

4. 矩阵堆栈

矩阵堆栈是由GLMatrixStack类创建的,其特性是先进后出,根据矩阵类的源码可知,矩阵堆栈中最大只能放64个状态.

矩阵堆栈中关于入栈、相乘、出栈的流程

入栈、相乘、出栈的流程
上一篇下一篇

猜你喜欢

热点阅读