【计算机图形2】实验1: 从[世界坐标系]到[相机坐标系]到[透视投影变化]及[隐藏面消除]的计算

前言:

本文记录计算机图形2的第一个实验,如何从世界坐标系投影到2D平面上并做隐藏面消除。由于我看的材料(课件及资料)很多都是英文的,因此可能导致英文名词写成中文翻译得不对。

从世界坐标系到相机坐标系:

这里引用我在GW上这门课的教授James K. Hahn的课件。




把世界坐标系转成相机坐标系(如图1),就是把世界坐标系的点一个个转换成以相机(观察点)为原点的坐标系中所在的点。换句话说就是,在世界坐标系中选定观察点P(x0,y0,z0)如下图,并指定了对应的xyz方向,形成的新的坐标系即相机坐标系(View Coordinate)。此时P在相机坐标系的坐标为(0,0,0).


如PPT,对于该坐标系的转换,用户只需要指定C, Pref 和 V'即可算出转换的矩阵。然后一一解释该PPT图的参数。


  • C:相机坐标,也是上图的P点,也是观察点。
  • Pref: 观察点,也就是相机往哪个点看。一般直接选择世界坐标系中物体的一个点作为P。这样相机往物体的这个点看就能看到物体。
  • V’:V’和V 我一开始一直不理解它们的区别,后来查阅了资料以及询问老师之后才理解。V’是一个向量,用于计算V向量。当用户指定V’方向向量之后,和方向向量N一起做叉乘(cross multiply)得出U方向向量,U和N叉乘之后即可得出V方向向量。为什么需要V’,因为我们很难直接找到V。当然V’不能给出和N平行的向量不然没有办法求U再求V了。
  • N:方向向量,也是转换后的相机坐标系的Z轴方向,直接通过点Pref减去C得到。为什么是Z轴?因为该轴用于显示物体的深度。
  • V:方向向量,也是相机坐标系的Y轴, 即相机向上的方向。如果把相机看成人的头,N是眼睛看的方向,V是头顶的方向。通过V’和N叉乘得到的U再和N做叉乘得到。当然向量相乘要遵守右手法则
  • U:方向向量,也是相机坐标系的X轴。

通过用户指定C, Pref 和 V',即可求出Mview矩阵。之后Mview * [x, y, z, 1].T 即可得到相机坐标系中的各个点的坐标。其中,(x,y,z,1)是世界坐标系的点的用齐次坐标系表示。

隐藏面消除:

对于物体的每个面,只要它的法向量和Line-of-sight的点乘大于0,即可见。原理就是向量之间角度的问题,如果2个向量互相垂直,如X轴方向的和Y轴方向的向量相乘:(1,0,0)·(0,1,0) = 0 如果大于90度就是负数了就表示看不见该面。

Line-of-sight和Normal Np我都是在相机坐标系求的,此时,View point即相机坐标,即原点(0,0,0)。Np通过一个平面里面的任意两个点叉乘等到。注意右手法则。

投影变化:


从3D投影到2D需要经过投影变换。此过程是在转换到相机坐标系后进行。 在之前,我们的line-of-sight是从相机的位置,即原点出发看物体,而经过投影变化之后,line-of-sight在整个图上都是平行的,而不是基于某一个点出发。原理是:我们看物体,远方的物体看起来比较小,近方的物体看起来比较大。因为,对于我们需要把近处的边拉长。如果不拉长即不做投影变换会导致: 如果不做此投影变化直接把相机坐标系的点的z舍弃,只留下x,y坐标来画图也可以2D的图。但是,此时物体就没有远处小近处大的距离感。如图。

(有做投影变换)

(没有做投影变换)

投影变换计算:



  • d:视角最近看的距离(深度)
  • f:视角看到最远的距离(深度)
  • h:视角的宽度

因为没有做截取,所以超过d和f距离的物体也能看到。 求出Mp后与前面相机坐标系的点相乘即可得投影变换后的点的坐标。



结果图展示:


从最后一张图可以看到,这个隐藏面消除只是对于该面从角度上是否可见,并没有做被覆盖的面消除。后面我会写如何做被覆盖面如何消除。(凌晨了,写一篇博客比做一个实验还累!有木有!)

代码:

https://gitee.com/sengo/graphic-hw1

猜你喜欢

转载自blog.csdn.net/sengo_gwu/article/details/79386592