guodong's blog

master@zhejiang university
   

三维重建:世界坐标系到视点坐标系的转换(UVN理解)

在OpenGL中,这个阶段实际上是调用函数gluLookAt(eye,center,up)函数。通过这个操作,将摄像机摆放在eye的位置,镜头的上方于up在同一个平面上,视线指向center。

视点坐标系可以理解为为摄像机服务的坐标系,原点在摄像机位置即eye处,它仍然是右手坐标系。三个坐标轴uvn确定如下:

视线轴Z:从center点指向eye点,注意与视线方向相反。

水平轴X: X=up × Z (叉乘,使用右手规则)

上方轴Y: Y=Z × X  y指向的方向通常和up很接近,如果up本身与视线方向恰好垂直时,两者重合。

三个坐标轴UVN的理解

定义相机的朝向:右向量u( ux, uy, uz),上向量v( vx, vy, vz),注视向量n( nx, ny, nz),所有的向量之间是相互正交的,彼此线性无关。此外UVN向量系统还有一个注视点,指定了相机的观察方向,如图:

实际上UVN相机指定了XYZ的新朝向,假设相机处于一个位置(camx, camy, camz),指向了一个目标p点 (objx, objy, objz),那么对于这个目标物体如何进行相机坐标变换呢。

首先这个目标是相对于XYZ坐标系下的坐标(objx, objy, objz),而UVN相机的u,v,n向量坐标也是相对于XYZ坐标系下的坐标,那么我们如果可以得到这个目标在UVN坐标系即以u,v,n为坐标轴(uvn本身就是线性无关的)下的相对坐标,然后只需要进行平移操作就可以完成相机坐标转换了(因为得到相对坐标后,可以调整相机uvn向量方向与xyz坐标轴重合,而此时目标点在UVN坐标系下的相对坐标不变,所以只需要平移就可以完成变换),如何得到UVN坐标系下的相对坐标:

设目标在UVN坐标系下的相对坐标为(obju, objv, objn),obju就是目标在坐标轴u下的分量,objv就是坐标轴v,objn就是坐标轴n下的分量。目标点 p(objx, objy, objz)在UVN坐标系下u轴方向上的分量为向量p点乘u轴正轴方向的单位向量,所以有:

obju = (objx, objy, objz) * (ux, uy, uz)   # 这里的ux,uy,uz表示向量需要是单位向量

同理

objv = (objx, objy, objz) * (vx, vy, vz)

objn = (objx, objy, objz) * (nx, ny, nz)

综上,我们可以得到目标点p(objx, objy, objz)在UVN坐标系下的相对坐标为:

我们称矩阵Muvn为旋转矩阵:

根据旋转矩阵我们求得相对坐标后再继续平移操作,将相机位置(camx, camy, camz)移动到原点处,这样需要相机和目标点同时移动(-camx, -camy, -camz),可以得到平移矩阵Tcam:最后我们可以得到UVN相机下的坐标变换矩阵Tuvn = Muvn * Tcam

现在我们已经知道了如何计算UVN相机模型的相机坐标变换,我们在看下如何计算UVN相机的uvn向量:

  1. 第一步:向量n = 目标点位置 – 观察参考点  = (objx, objy, objz) – (camx, camy, camz)
  2. 第二步:向量v我们先假设为(0, 1, 0),即y轴方向(这种假设是相机没有绕自身n轴旋转情况,否则需要将假设进行一旋转操作)
  3. 第三步:向量u= 向量v × 向量n(这里为什么不是n × v呢,因为是在左手坐标系下)
  4. 第四步:反求v,向量v = 向量n × 向量u
  5. 第五步:将向量u,v,n向量归一化

 

参考链接:

https://blog.csdn.net/nice_xp/article/details/83757486

https://blog.csdn.net/etreeser/article/details/5449854

https://blog.csdn.net/hjq376247328/article/details/49387011




上一篇:
下一篇:

头像

guodong

说点什么

avatar
  Subscribe  
提醒