图形学上课的时候,????坐在第一排划拉瑟图 ,老师突然布置了个作业:推导mv变换的矩阵。常言道上山容易下山难之用轮一时爽,造轮火葬场 ,这可把????急坏了,周末就嗯搁这埋头一顿推。推了挺久的 今天记录一下过程。
mv矩阵的目的是将世界坐标系下的坐标转到相机坐标系下,即通过世界坐标表示相机坐标。其实就是一些平移和旋转变换,然后将坐标系转换即可。所以我们要求得两个变换的矩阵:
- 旋转变换矩阵
- 平移变换矩阵
然后把两个矩阵相乘,得到最终的变换矩阵 M,这个 M 矩阵左乘世界坐标系下的齐次坐标,能够帮助我们将世界坐标转为相机坐标。
好了 背景介绍到这里,❀不多????,开冲!
我们转换的第一步,就是确定相机坐标系的标架。假设已知世界坐标系下:
- 相机原点 p 点坐标
- 视平面法线 n
- 竖直向上向量 vup (在世界坐标中为 (0, 1, 0))
那么我们可以计算 vup 在视平面上的投影v,即平行于视平面的竖直向上分量。方法是通过三角形法则。随后通过n和v的叉乘表示出最后一个轴u:
将 u,v,n 归一化之后,我们得到在世界坐标系下,相机坐标系三个坐标轴指向的方向。
因为 u,v,n 都是归一化的向量,那么我们认为 u,v,n 就是世界坐标系下,相机坐标系的三个基向量。根据右手坐标系法则:u,v,n 向量对应的坐标轴为:
那么我们可以建立一个坐标轴旋转变换矩阵 A,其中A能够将相机坐标系下的坐标转换到世界坐标系,那么容易得出A的表达式:
其中以二维情况举例,验证A的表达的正确性:
上述的 A 矩阵描述了从相机坐标系转换到世界坐标系的过程,其中有:
又因为我们希望通过世界坐标表示相机坐标,即通过 xyz 表示 uvn ,那么我们需要进行转换:
所以我们希望求得 A 矩阵的逆矩阵,幸运的是,A是一个正交矩阵,这意味着:
所以最终的旋转矩阵(世界坐标转眼坐标),我们称之为R,那么有:
此外,我们还需引入平移矩阵T。因为相机的中心坐标 p 点在世界坐标系下的坐标为 (x, y, z),且平移变换仅涉及常数的相加!
假设世界坐标系下点坐标为p’
相机坐标系下点坐标为p
,那么有:
因为我们希望通过世界坐标表示相机坐标,所以有:
因齐次坐标的常数相加集中在最后一列,易得从世界坐标系到相机坐标系的平移矩阵 T 为:
因为最终我们是通过旋转和变换的结合,将坐标进行转换。根据 M = R * T
,我们结合平移和旋转矩阵,可以得出mv变换矩阵 M 的表达式为:
推完了 Orz