当前位置:文档之家› 计算机图形学显示变换算法具体程序实现

计算机图形学显示变换算法具体程序实现

数学与软件科学学院实验报告学期:___2010 至_2011 第__一__ 学期2010年12月21日课程名称:____计算机图形学 _____ 专业:__信息与计算科学_ 2007级_5_班实验编号: 07 实验项目_____显示变换__指导教师__庞朝阳_ 姓名:学号: 20070605 __实验成绩:_____实验目的:(1) 了解掌握显示变换的相关知识,知道什么是平行投影和透视投影;实验内容:(1) 知道显示变换是什么;(2) 掌握平行投影变换;(3) 掌握透视投影变换;(4) 编写并执行简单的Prolog程序,并熟悉测试或调试的方法。

实验步骤:(1)显示变换三维空间中的物体要在二维的屏幕显示出来,必须通过投影的方式把三维物体转换成二维的平面图形。

投影的方式有平行投影,透视投影。

平行投影变换(2)平行投影变换平行投影可根据投影方向与投影面的夹角分为:正投影和斜投影。

当投影方向与投影面垂直时,为正投影;否则为斜投影。

A.正投影1.假设投影平面垂直于Z轴,且位于Z=Z0外,则在视坐标系中任意一点(X,Y,Z)的投影是过该点的投影线与投影平面的交点,如下图:P(x,y,z) p`(x`,y`,z`)Z0 Z则空间点的坐标与投影坐标间关系为:x`=x , y`=y , z`=z即```1xyz=000010000000001Z.1xyz2.```1x y z =1000010000000001 . 1x y z 即平面投影的变换矩阵为:Mz (平)=10000100000001同理可得:在y0z 平面的投影变换矩阵为:Mx(平) =0000010000000001 在x0z 平面的投影变换矩阵为:My(平) =10000000001002.斜投影 如下图求空间中任意一点D (x,y,z )在斜面ABC 上的投影。

Step1:确定一定Q,并过P 作斜面的法向量n 。

X ZYACBP由=(1,0,1)T ,=(0,1,-1)T及 = * =(1,1,1)T。

单位值得:=31⎪⎪⎪⎭⎫ ⎝⎛111。

P 点坐标为P (1/2,0,1/2)。

Step2:将过点的法向量n 平移到原点O ,记该平移变换为T P =⎪⎪⎪⎪⎪⎭⎫⎝⎛--10002/110000102/1001。

Step3:将平移后的法向量 (连同斜面)绕x 轴旋转α角度,使斜面与xOz 面垂直,则: cos α=22,则α=4/π , sin α=22,即: R x ()α=⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡-10000cos sin 00sin cos 00001αααα=⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡-100222200222200001Step4:记旋转后法向量为1n ,则有:1n = R x ()α*=31⎪⎪⎪⎪⎪⎭⎫⎝⎛0201记1n 与z 轴的夹角为β,则tan β =22,即sin β=31,cos β=32。

Step5:使1n 连同斜面)绕y 轴旋转-β角度后与z 轴重合,即斜面与xOy 面重合,则:R y ()β-=()()()()⎪⎪⎪⎪⎪⎭⎫⎝⎛-----10000cos 0sin 00100sin 0cos ββββ=⎪⎪⎪⎪⎪⎪⎪⎭⎫⎝⎛-1000320310010031032 Step6:绕z 轴向xOy 面平行投影(正投影),则有:M ()平z =⎪⎪⎪⎪⎪⎭⎫⎝⎛1000000000100001 Step7:作一系列逆变换,使P 点还原到原来位置。

像上:对任意点D (x,y,z ),它在斜面ABC 上的投影记为D '(x ’,y ’,z ’,),则有⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡1'''z y x =T 1-P *R ()α1-x *R ()β1-y * R y ()β-* R x ()α* T P *⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡1z y x如原点(0,0,0)在斜面ABC 上的投影点为(1/3, 1/3, 1/3)②透视投影变换据投影定义,空间任意一点的透视投影是投影中心与空间点构成的投影线与投影平面的交点。

假设视点(投影中心)为E (0,0,d ),投影平面为xOy 面,空间中任意一点记为P (x ,y ,z ),求P 点在xOy 面上的像点P ’(x ’,y ’,z ’)及P 到P ’点的变换矩阵M ()透z 。

如下图所示:求解:利用三角形相似原理⎪⎩⎪⎨⎧=-=+=-=+=0)/(|)|/(/')/(|)|/(/'z z d d z d d y y z d d z d d x x −−−→−==d/1r 令⎪⎩⎪⎨⎧=+=+=0')1/(')1/('z rz y y rz x x 则有:⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡H z y x '''=⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡1000000000100001*⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡100010000100001r *⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡1z y x =⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡100000000100001r *⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡1z y x即M ()透z =⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡-1/10000000100001d。

若记为:(x ’,y ’,z ’,H )=(x,y,z,1)* M ()透z则M ()透z =⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡-1000/100000100001d 同理,若视点E 在y 轴上,即E (0,d ,0),且投影面为xOz 平面,则有:M ()透y =⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡-10/10010000000001d 或⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡-10000100/10000001d 若视点E 在x 轴上,即E (d ,0,0),且投影面为yOz 平面,则有:⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡H z y x '''=⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡-100/1010000100000d 或⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡-100001000010/1000d ③视坐标系与视变换(斜方向投影)前面得到的是特殊情况下的透视和平行投影的变换矩阵,而实际情况往往需要在一般情况下进行投影变换。

首先根据场景要求建立一视坐标系(如下图),然后构建一个视平面(也称投影平面),使该平面与z v 轴垂直。

显示过程即是场景中物体从世界坐标转换成视坐标。

最后,把视坐标再投影到视平面。

Step1:建立视坐标系。

1.取视平面(投影平面)的法矢量为视坐标系的z 轴方向。

记为z vl 单位矢量。

2.记视平面中心P 0为视坐标系原点,P 0(x 0,y 0,z 0),则存在平移矢量OP =(x 0,y 0,z 0)T. 3.取y v ,使y v *z v =04.由x v = y v *z v 确定视坐标的x 轴,从而得到视坐标系(P 1,x 111,,v v v z y ). Step2:求世界坐标系(O,x w w w z y ,,)到视坐标(P, x v , y v ,z v )的变换。

x w =(1,0,0)T,y W =(0,1,0)T,z w =(0,0,1)T设x v =u x * x w +m x * y W +n x * z w y v =u y * x w +m y * y W +n y * z w z v =u z * x w +m z * y W +n z * z w 考虑到原点(平移变换),则有:(x v ,y v ,z v ,P )=(x w ,y W ,z w ,O )*M且:M=⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡10000z n n n y m m m x u u u z y x z y xz y x Step3:求世界坐标中任意一点P (x,y,z )在视平面内的投影P ’(x ’,y ’,z ’)。

(p 在z v 的负向)。

则有:⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡1'''z y x = T ()透y *M*⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡1z y x .其中:T ()透z =⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡1000/100000100001d 。

④.求侧面在xOy 面的投影 思路:R ()β-Y →R ⎪⎭⎫⎝⎛-απ2X →T ⎪⎪⎭⎫ ⎝⎛-22Z →P ()投Z 即:⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡1'''z y x =R()β--1Y*R⎪⎭⎫ ⎝⎛--απ21x*T ⎪⎪⎭⎫ ⎝⎛--221z*P z*T ⎪⎪⎭⎫⎝⎛-22Z * R ⎪⎭⎫⎝⎛-απ2X * R ()β-Y *⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡1z y x⑤窗口到视区的变换。

由于在图形显示时往往只需要显示某一部分,这时可以在投影面上定义一个窗口, 只有在窗口内的图形才被显示,而窗口外的部分则不显示。

在屏幕上也可定义一个矩 形,称为视区。

经过窗口到视区的变换,窗口内的图形才能变换到视区中显示。

假设窗口的左下角顶点坐标为(WXL,WYB ),右下角顶点坐标为(WXR,WYT ) 视区左下角为(VXL,VYT ),右下角顶点为(VXR,VYT ),则要将窗口内的点(x w ,y w ),映射到视区内的点(x v ,y v ),则据相似原理有:VXL VXR VXL x v --=WXL WXR WXL x w -- , VYB VYT VTB y v --=WYBWYT WYBy w --由此可得:x v =VXL+( x w -WXL)*s x y v =VYB+( y w -VYB)*s y其中:s x =VXL VXR VXL VXR -- , s y =WYBWYT WYBVYT --上述窗口到视区变换,也可通过一系列变换的组合得到。

变换过程如下: Step1:将窗口左下角顶点(WXL,WYB )平移至窗口所在坐标T 1。

Step2:进行缩放变换,使窗口大小与视区相等T 2。

Step3:将窗口内的点映射到视区中,再进行反平移,将视区左下角移到后来的位置T 3。

即有:T窗视= T3* T2* T1=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡1001001VYB VXL *⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡100000y xs s *⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡--1001001WYB WXL =⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡+-+-100*0*0VYB s WYB s VXL s WXL s y y x x综上:⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡1v v y x =⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡+-+-100*0*0VYB s WYB s VXL s WXL s y y x x*⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡1w w y x。

相关主题