3D图形学基础

2020-07-16  本文已影响0人  E术家

向量

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

向量

在X轴上的向量 (1,0,0) 向量⻓度为1。我们称为⻓度为1的向量为单位向量。

向量长度计算公式

如果⼀个向量不是单位向量,⽽我们把它缩放到1。这个过程叫做标准化。将⼀个向量进⾏标准化就是将它的缩为1。也叫做单位化向量单位向量表示一个方向。

向量 点乘 (dot product)

点乘只能发⽣在2个向量之间进⾏。

2个(三维向量)单元向量之间进⾏点乘运算将得到⼀个标量(不是三维向量,是⼀个标量)。它表示两个向量之间的夹⻆。

前提条件: 2个向量必须为单位向量
动作: 2个三维向量之间进⾏点乘
结构: 返回⼀个[-1,1]范围的值,这个值其实就是 夹⻆的cos值(余弦值)

点乘

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

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

矩阵

在其他编程标准中,许多矩阵库定义⼀个矩阵时,使⽤⼆维数组
OpenGL的约定⾥,更多倾向使⽤⼀维数组;这样做的原因是: OpenGL 使⽤的是 Column-Major(以列为主)矩阵排序的约定。

矩阵 矩阵

⼀个4*4矩阵是如何在3D空间中表示⼀个位置和⽅向的
列向量进⾏了特别的标注:矩阵的最后⼀⾏都为0,只有最后⼀个元素为1

单元矩阵初始化⽅式

// 单元矩阵初始化⽅式1
GLFloat m[] = {
        1,0,0,0, //X Column
        0,1,0,0, //Y Column
        0,0,1,0, //Z Column
        0,0,0,1 // Translation
};
// 单元矩阵初始化⽅式2
M3DMatrix44f m = {
         1,0,0,0, //X Column
         0,1,0,0, //Y Column
         0,0,1,0, //Z Column
         0,0,0,1 // Translation
};
//单元矩阵初始化⽅式3
void m3dLoadIdentity44f(M3DMatrix44f m);

将⼀个向量 * 单元矩阵 ,就相当于⼀个向量 * 1
不会发⽣任何改变

矩阵运算

在线性代数数学的维度,为了便于书写.。所以坐标计算,都是从左往右顺序,进⾏计算。如下列公式:

变换后顶点向量 = V_local * M_model * M_view * M_pro
变换后顶点向量 = 顶点 * 模型矩阵 * 观察矩阵 * 投影矩阵

单元矩阵

在OpenGL 的维度。如下列公式:
变换顶点向量 = M_pro * M_view * M_model * V_local
变换顶点向量 = 投影矩阵 * 视图变换矩阵 * 模型矩阵 * 顶点

单元矩阵

变换

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

模型变换

平移
void m3dTranslationMatrix44(M3DMatrix44f m, float x, float y, float z);

m:平移后获得的新的矩阵(输出的结果)
x:在X轴的平移距离
y:在Y轴的平移距离
z:在Z轴的平移距离

旋转
m3dRotationMatrix44(m3dDegToRad(45.0), float x, float y, float z);

m3dDegToRad(45.0) : 角度转弧度
x:围绕X轴旋转
y:围绕Y轴旋转
z:围绕Z轴旋转

缩放
void m3dScaleMatrix44(M3DMatrix44f m, float xScale, float yScale, float zScale);

m:缩放后获得的新的矩阵(输出的结果)
xScale:在X轴的缩放比
yScale:在Y轴的缩放比
zScale:在Z轴的缩放比
当缩放比为成负数时,实际上是对图像的反转

void m3dMatrixMultiply44(M3DMatrix44f product, const M3DMatrix44f a, const M3DMatrix44f b);

product:变换后获得的新的矩阵(输出的结果)
a:一种变换
b:一种变换

变换的顺序会改变最终的结果

模型变换

可以看到上方和下方都执行了平移&旋转操作,但是最终结果并不相同,是因为这些变换都是基于模型本身坐标系执行的,结果也在本身的坐标系中体现。

上一篇 下一篇

猜你喜欢

热点阅读