基础变换:初识向量/矩阵


未完待续:


3D图形数学初识

向量

向量即可表示方向也可表示数量。
单位向量:长度为1。
标准化:把向量的长度变为1。
math3d库中有两个数据类型能表示向量:M3DVector3f可以表示一个三维向量(X, Y, Z),而M3DVector4f可以表示一个4维向量(X, Y, Z, W)。X、Y、Z的值通过除以W来进行缩放。
要讲他们定义成数组,需:

typedef float M3DVector3f[3];
typedef float M3DVector4f[4];

//声明及初始化
M3DVector3f vVertor;

当与4x4矩阵相乘时,就不可忽略第四个分量W。

  • 点乘
    两个单位向量点乘得到一个两个向量之间的余弦值,在漫射光计算中,表面法向量和指向光源的向量之间大量进行着这种运算。

m3dDotProduct3函数来获取两个向量点乘的结果:

float m3dDotProduct(const M3DVector3f u, const M3DVector3f v);

m3dGetAngleBetweenVectors3(const M3DVector3f u, const M3DVector3f v);

  • 叉乘
    得到一个向量。
    函数m3dCrossProduct3对两个向量叉乘并还回结果向量。
void m3dCrossProduct3(M3DVector3f result, const M3DVector3f u, const M3DVector3f v);

矩阵

最普遍的例子就是坐标变换。就是一个二维数组。我们可以将矩阵看做是一组列向量
进行3D设计时,几乎全部都是3x3和4x4矩阵,

typedef float M3DMatrix33f[9];
typedef float M3DMatrix44f[16];

OpenGL使用一维数组,因为OpenGl使用一种Column-Major(以列为主)矩阵排序的矩阵约束。


理解变换

将3D数据被“压扁”成2D数据的处理过程叫做投影(projection)。
投影只是OpenGL中发生的变换中的一种,变换还允许我们旋转对象、移动对象、伸展、收缩和扭曲。

在我们指定顶点和这些顶点出现在屏幕上之间的这段时间里,可能会发生3种类型的几何变换:视图变换、模型变换和投影变换。

OpenGL变换术语概览

变换 应用
视图 指定观察者或照相机的位置
模型 在场景中移动物体
模型视图 描述视图和模型变换的二元性
投影 改变视景体的大小或重新设置它的形状
视口 这是一种伪变换,只是对窗口上的最终输出进行缩放后

视觉坐标

视觉坐标是相对于观察者的视角而言的。视觉坐标表示一个虚拟的固定坐标系,通常做参考坐标系使用。
从两个视角观察视觉坐标:

从两个视角观察视觉坐标系

利用OpenGl进行3D绘制时,就会使用笛卡尔坐标系。如果不进行任何变化,那么使用的坐标系将与刚描述的视角坐标系相同。


视图变换

视图变换是应用在场景中的第一种变换,允许我们把观察点放在所希望的任何位置,并允许在任何方向上观察场景。

确定视图变换就像在场景中放置照相机并让他指向某个方向。

在透视投影中: 观察点默认在(0,0,0),并沿着z轴负方向进行观察,绘制在z坐标为正的位置的对象则位于观察者背后。
在正投影中,观察者被认为是z轴正无穷的位置,能够看到视景体中的任何东西。
从大局上考虑,在应用任何其他模型变换之前,必须先应用视图变换。这是因为,对视觉坐标而言,视图变换移动了当前的工作坐标系。所以后续变换随后都会基于新调整的坐标系进行。


模型变换

模型变换用于操纵模型和其中的特定对象。这些变换将对象移动到需要的位置,然后再对它们进行旋转和缩放。

场景或对象的最终外观可能很大程度上取决于应用的模型变换顺序。
模型变换:
模型变换

模型变换


模型视图的二元性

视图和模型变换按照它们内部效果和对场景的最终外观来说是一样的。即将对象向后移动和将参考坐标系向前移动在视觉上没有区别。
“模型视图”是指这两种变换在变换管线中进行组合,成为一个单独的矩阵,即模型视图矩阵。
模型变换和视图变换的相对:

相对性


投影变换

投影变换将在模型视图变换之后应用到顶点上,这种投影实际上定义了视景体并创建裁剪平面。

即投影变换指定一个完成的场景是如何投影到屏幕上的最终图像。

对于透视投影,我们需要做的是,指定适当模型视图变换的场景, 然后应用透视投影矩阵。


视口变换

把二维投影映射到屏幕上某处的窗口(物理坐标)上,称为视口变换。


模型视图矩阵

模型视图矩阵是一个4 x 4的矩阵,表示一个变换后的坐标系,可以用来放置对象确定对象的方向

我们为图元提供的顶点将作为一个单列矩阵(向量)的形式来使用,并乘以一个模型属兔矩阵来获得相对于视觉坐标系的经过变换的新坐标。

在单个顶点应用模型视图变换的矩阵方程
最后得到一个向量。


矩阵构造

存储方式为单个数组:

GLfloat matrix[16];

列优先排序:
这里写图片描述

注意: 这16个值表示空间中的一个位置,以及相对于视觉坐标系的3个轴上的方向。

前3列的前3个元素只是方向向量,他们表示空间中X、Y和Z轴上的方向,一般为方向向量。第4列向量包含变换后的坐标原点的X、Y和Z值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值