相机变换与Ray-Casting

时间:2023-03-09 01:50:47
相机变换与Ray-Casting

p { margin-bottom: 0.1in; direction: ltr; line-height: 120%; text-align: justify; orphans: 0; widows: 0 }

世界坐标系本文都记为xyz坐标系,在体绘制中可以理解为物体空间坐标系。xyz坐标系可以根据体数据的特点人为规定,比如对于一个立方体数据,可选一个顶点为原点,与该顶点相连的三条棱为x,y,z轴。

UVN系统本文都记为UVN坐标系,可以理解为图像空间坐标系。当物体空间坐标系确定后,可认为物体不动,因此多角度观察物体等价于将UVN先绕xyz旋转再平移,得到一个新的坐标系(在OpenGL中,其实是让UVN坐标系不动,让物体所在的xyz坐标系绕UVN旋转平移,这在我的其他博客中有详细介绍),再相对这个新坐标系的某个固定方向观察物体。之所以先旋转,是因为UVN与xyz起初是重合的,原点重合使得旋转不会产生附加位移。我们要把这个前提作为坐标变换的起始条件,因为这样能使变换过程更加简洁,让人更容易理解。

一、旋转:

三个基向量U,V,N分别指向相机的右方、上方和后方从而构成右手坐标系,相机则处于坐标原点。

相机变换与Ray-Casting

1、选定相机eye的位置(物体空间坐标系下,下同)

2、选定观察点位置lookat(一般取xyz坐标系的原点)

3、确定N轴正向的方向向量

相机变换与Ray-Casting

方向由lookat指向eye

4、确定投影面的方向,这一步需要使用辅助向量UP,产生U轴

相机变换与Ray-Casting

5、根据右手系的特点,确定V轴

相机变换与Ray-Casting

这样,UVN轴就确定了。UVN轴的单位向量u,v,n,则UVN坐标系就是xyz坐标系乘旋转矩阵R=[u,v,n]得到的。简要证明如下:

在xyz坐标系中取一点P(x, y, z),乘旋转矩阵R后,位置变为P1

相机变换与Ray-Casting

其实任何坐标都有两个基本要素:坐标值和基。三维空间中任意一个向量都可以由三个线性无关的向量的线性组合表示,所以三维空间中的点可以由三个线性无关的向量+三个组合系数确定。因此

基 = 三个线性无关的向量

坐标值 = 三个组合系数

我们一般使用的坐标

相机变换与Ray-Casting

其真实含义是

相机变换与Ray-Casting

它的基是x,y,z轴正向的单位向量。因此

相机变换与Ray-Casting

其实是以相机变换与Ray-Casting为基的坐标,也可理解成以U,V,N为坐标轴下的坐标,坐标值为

相机变换与Ray-Casting

与变换前相同,即P相对于xyz轴的位置与P1相对于UVN轴的位置相同。于是,从位移的相对性我们可以认为xyz---->UVN经历的旋转与P---->P1经历的旋转相同,从而UVN坐标系就是xyz坐标系乘旋转矩阵R=[u,v,n]得到的得证。

二、平移

平移矩阵T为4x4矩阵

xyz坐标系经旋转、平移后得到UVN坐标系,变换矩阵C = TR

若在UVN坐标系中有一点P,坐标为

相机变换与Ray-Casting

欲求其在xyz坐标系中的坐标

相机变换与Ray-Casting

有下式

相机变换与Ray-Casting

三、投影

为理解方便,可以选取-N轴的方向为投影方向,以N轴在xoy平面的投影为辅助向量UP,以U,V轴的正方向为图像的两条边,UVN坐标系的原点为图像的原点,选定图像大小后,从图像面投出一簇平行射线(每个像素点对应一条射线),对每条射线上体素的不透明度及颜色值进行累加,得出每个像素灰度值。

下面的体数据是一个白色的大正方体(200x200x200),里面有一个红色的球体,球体里面有一个黄色的小正方体。

xyz坐标原点:大正方体内侧顶点

lookat = (0, 0, 0)

图一:eye = (1, 1, 1), UP = (1, 1, 0), T = (75, 350, 450)

相机变换与Ray-Casting

图二:eye = (-1, -1, 1), UP = (-1, -1, 0), T = (125, -150, 450)

相机变换与Ray-Casting

图三:eye = (1, 1, 1), UP = (1, 1, 0), T = (75, 350, 450)

采用公式

相机变换与Ray-Casting

但采用合成的顺序与论文相反,为从前到后累加,每条入射光线上等间距取140个点进行合成。射入体数据的光线颜色的初值都为0。

相机变换与Ray-Casting