个书《Unity实战》手稿——第一章MVP矩阵

1 MVP矩阵的推导
Unity中可以很方便的利用系统API函数来实现不同向量在不同空间下的转换。但是,这也为我们真正了解MVP矩阵的意义带来了很大的困难,究竟一个点在不同空间如何表示呢?每一步的变化的目的是什么?这些如果不清楚每个步骤的作用,势必会云里雾里,也为继续深入研究图形学带来了障碍,即所谓的基础没有牢固带来的后果。在本节中我们会展示一个点在变换中具体实现步骤,让读者能有一个直观、深入、透彻的了解矩阵变换。

1.1 定义世界坐标系
不同的坐标系,都可以有自己的表示形式,都可以作为世界坐标系。其实他们都是平等的关系,以谁作为世界坐标系都是可以的。推演到现实中例子,比如我们以自己为原点,将右手方向定义为x轴,将自己的正朝向定义为z轴,将自己头顶的方向定义为y轴,这就构成了一个坐标系,这样我们就可以定义空间中任意一个物体的坐标了。同事另外一个人,也可以用自己的右手、正前方、头顶三个方向定义一个坐标系。于是我们每个人都有了以自己为中心的坐标系。那么对于空间中一个物体,相对于自己,以及相对于另外一个人坐标是不一样的,更比如所有的人都不存在,那么如何表示这个物体的坐标呢?此时就要构建一个最基本的坐标系了,就是所谓的世界坐标系。
有了世界坐标系,我们才能定义其他的坐标系。下面,我们在Unity中绘制一个世界坐标系。
在这里插入图片描述
图1.1 绘制出xyz轴,构建世界坐标系

1.2 定义局部坐标系
有了世界坐标系之后,我们就可以定义一个局部坐标系了,我们在(1,1,1)位置创建一个物体。

在这里插入图片描述
图1.2 创建一个黑色Cube,它为局部坐标系的原点

这个黑色的物体就是我们的LocalCube。
在创建一个LocalCube看向的物体,LocalCubeLookAt,如下图所示:
在这里插入图片描述
图1.3 创建一个红色Cube,它为黑色Cube看向的目标,即为局部坐标系的forward方向

我们将黑色的LocalCube和红色的LocalCubeLook的连线看成局部坐标系的forward方向,也就是local_z方向。
在这里插入图片描述
图1.4 绘制局部坐标系的xyz轴

我们得到了如上图的局部坐标系。

这样我们就得到了两个坐标系,一个是世界坐标系,一个是局部坐标系。
世界坐标系的三个轴为:
X轴(1,0,0)
Y轴(0,1,0)
Z轴(0,0,1)
局部坐标系的三个轴为:
X轴(0.7071068, -1.490116E-08, 0.7071069)
Y轴(0.4082483, 0.8164966, -0.4082484)
Z轴(-0.5773503, 0.5773503, 0.5773503)

红色立方体的世界坐标为(0.5,1.5,1.5)
而红色立方体在黑色立方的局部坐标是(0,0, 0.8660254)
现在的加入我们只给出了红色立方的体世界坐标(0.5,1.5,1.5),以及局部坐标系,那么怎么变化为局部坐标呢?
localCube的worldToLocalMatrix:
在这里插入图片描述
localCube的localToWorldMatrix:
在这里插入图片描述

而localCube的x、y、z轴分别为:
X轴(0.7071068, -1.490116E-08, 0.7071069)
Y轴(0.4082483, 0.8164966, -0.4082484)
Z轴(-0.5773503, 0.5773503, 0.5773503)
我们知道三个轴的方向,如何反推出localCube的worldToLocalMatrix呢? 我们假设矩阵的第四列为(x,y,z,1),有如下的等式:
在这里插入图片描述
这一步的根据是,localCube的位置(1,1,1)在自己的坐标系中其local坐标肯定是(0,0,0)。故而有上面等式。推导出x、y、z值,为-1.41421、-0.81650、-0.57735。从而
在这里插入图片描述
这个与(1.1)式子localCube的worldToLocalMatrix是相同的。故得出localCube的世界转局部的矩阵。对(1.4)式矩阵求逆,可以得到localToWorldMatrix,这里就等于(1.2)式子。

【注】
这里遇到一个问题,就是使用cube作为黑色物体的时候,由于我们使用了缩放,所以矩阵也有缩放,所以我们这里使用如下的方式使得矩阵单位化:

在这里插入图片描述
这里的localCube为空物体,子节点Cube的缩放是(0.2,0.2,0.2)。子节点Cube起到可视化的作用。
图1.5 localCube为空物体,子节点Cube起到可视化的作用

1.3 构建透视矩阵
1.3.1 绘制视椎体
黑色的立方体出,架设一台摄像机,绘制出其平截头体。
在这里插入图片描述
图1.6 黑色立方体所在之处的视椎体

向量(OP) ⃗=P-O=
待补充。
在这里插入图片描述
图1.7 黑色立方体所在之处的视椎体可视化

1.3.2 透视投影矩阵的推导
如上图所示,视椎体中的任何一点,经过透视投影,映射到近平面上的一个点。我们假设任意点Q其坐标(x,y,z,1),经过一个矩阵的变换之后,最终在近平面上的点的坐标为的(x’,y’,z’,1)。
在这里插入图片描述
图1.8 点Q为视椎体中的任意一点,其投影在近平面上的点为Q’。

如图1.8图,视椎体中的任意点Q,其投影在近平面上的点为Q’。已知道Q点的坐标为(x,y,z,1),那么求Q’的坐标。由于三角形近似原理得到:
在这里插入图片描述
这里的OP等于近平面near,OR为Q的z坐标;
GQ’为近平面上x’坐标;FQ为x坐标;
PG为近平面上的y’坐标;RF为y坐标;
由此得到:
在这里插入图片描述
从而得到:
在这里插入图片描述
近平面的边界为左右边界为(left, right),上下边界为(top, bottom)。
所以:

在这里插入图片描述
在OpenGL中,将近平面的点映射到(-1,1)之间,所以两边同时减去left。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
下面我们要将黄色的立方体,画在近平面上。
在这里插入图片描述
展示结果为:
在这里插入图片描述

【参考文献】

  1. Mathematics.for.3D.Game.Programming.and.Computer.Graphics,.Lengyel,.3ed,.Course,.2012
  2. https://en.wikipedia.org/wiki/Homogeneous_coordinates
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值