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|
- Posted in: 3D图形