3D相机变换

在此使用UVN相机模型.比起欧拉相机模型,这种模型更自然也更容易.

 

如图,UVN向量定义了以相机位置为原点的一组基向量,相机变换要做到事就是把以xyz为基的世界坐标转换成uvn坐标.

假设在世界坐标系中相机的位置为c(cx, cy, cz),注视目标的位置为lookat(lx, ly, lz), 世界中任意一点 p(px, py,pz), 改点在uvn坐标系中的坐标为p”(px”, py”, pz”).

首先要计算相机的uvn向量.步骤如下:

1. n = lookat – c;

2.假设 v = (0, 1, 0);

3. u = v × n;

4. v = n × u;

5.(可选)将uvn向量分别除以长度,归一化

相机变换由平移和旋转两部分组成,我们可以这样理解: 首先将相机平移回原点, 然后再旋转一定角度使其朝向z轴正方向,这样uvn坐标系就和xyz坐标系重合,此时物体的坐标就是相机坐标了.

平移部分比较简单,可以直接用p’ = p – c = (px – cx , py – cy , pz – cz), 用矩阵表示就是:

      | 1    0     0   0|
T =   | 0    1     0   0|
      | 0    0     1   0|
      |-cx  -cy  -cz   1|

 

旋转部分

将xyz坐标系中的一点转换成uvn坐标系中的点,直观来说, 就是计算该点在 uvn 三个轴上的投影长度, 也就是分别求与对应轴的点积.

                         | ux  vx  nx  0|
p'' = | px' py' pz' 1| * | uy  vy  ny  0| = |p'*u p'*v p'*n 1|
                         | uz  vz  nz  0|
                         | 0   0   0   1|

 

总结:

                        |1     0     0     0|   | ux  vx  nx 0| 
p'' = |px  py  pz  1| * |0     1     0     0| * | uy  vy  ny 0|  
                        |0     0     1     0|   | uz  vz  nz 0|    
                        |-cx   -cy   -cz   1|   | 0   0   0  1| 
           | ux      vx      nx     0|
    =  p * | uy      vy      ny     0|
           | uz      vz      nz     0|
           |-(c*u)  -(c*v)  -(c*n)  1|