三维坐标变换

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第二章三维观察1.三维观察坐标系1.1观察坐标系为了在不同的距离和角度上观察物体,需要在用户坐标系下建立观察坐标系xv,yv,zv(通常是右手坐标系)也称(ViewReferenceCoordinate)。如下图所示,其中,点p0(xo,yo,z0)为观察参考点(ViewReferencePoint),它是观察坐标系的原点。图1.1用户坐标系与观察坐标系依据该坐标系定义垂直于观察坐标系zv轴的观察平面(viewpalne),有时也称投影平面(projectionplane)。图1.2沿zv轴的观察平面1.2观察坐标系的建立观察坐标系的建立如下图所示:图1.3法矢量的定义观察平面的方向及zv轴可以定义为观察平面(viewplane)N法矢量N:在用户坐标系中指定一个点为观察参考点,然后在此点指定法矢量N,即zv轴的正向。法矢量V:确定了矢量N后,再定义观察正向矢量V,该矢量用来建立yv轴的正向。通常的方法是先选择任一不平行于N的矢量V',然后由图形系统使该矢量V'投影到垂直于法矢量N的平面上,定义投影后的矢量为矢量V。法矢量U:利用矢量N和V,可以计算第三个矢量U,对应于xz轴的正向。的指定视图投影到显示设备表面上的过程来处理对象的描述。2.世界坐标系在现实世界中,所有的物体都具有三维特征,但是计算机本身只能处理数字,显示二维的图形,将三维物体和二维数据联系到一起的唯一纽带就是坐标。为了使被显示的物体数字化,要在被显示的物体所在的空间中定义一个坐标系。该坐标系的长度单位和坐标轴的方向要适合被显示物体的描述。该坐标系被称为世界坐标系,世界坐标系是固定不变的。OpenGL中世界坐标用来描述场景的坐标,Z+轴垂直屏幕向外,X+从左到右,Y+轴从下到上。世界坐标系是右手笛卡尔坐标系统。我们用这个坐标系来描述物体及光源的位置。世界坐标系以屏幕中心为原点(0,0,0),长度单位这样来定:窗口范围按此单位恰好是(-1,-1)到(1,1)。3.世界坐标系到观察坐标系在三维观察流水线中,场景构造完成后的第一步工作是将对象描述变换到观察坐标系中。对象描述的转换等价于将观察坐标系叠加到世界坐标系的一连串变换。1.平移观察坐标原点到世界坐标系原点。2.进行旋转,分别让xview、yview和zview轴对应到世界坐标的xw、yw、zw轴。如果指定世界坐标点P=(x0,y0,z0)为观察坐标原点,则将观察坐标系原点移到世界坐标系原点的变换是1000100010001000zyx将观察坐标系叠加到世界坐标系的组合旋转变换矩阵使用单位向量u、v和n来形成。该变换矩阵为1000000nnnvvvuuuzyxzyxzyxR这里,矩阵R的元素是uvn轴向量的分量。将前面的平移和旋转矩阵乘起来获得坐标变换矩阵:Rvcwc.=1000000pnnnnpvvvvpuuuuzyxzyxzyx该矩阵中的平移因子按u、v、n和P0的向量点积计算而得,P0代表从世界坐标系原点到观察原点的向量。换句话说,平移因子实在每一轴上的负投影(观察坐标系中的负分量P0)。这些矩阵元素的取值为uuzuyuxzyx0000vzvyvxuzyx0000nznynxuzyx0000矩阵将世界坐标系中的对象描述变换到观察坐标系。4.投影变换对象描述变换到观察坐标后,下一阶段是将其投影到观察平面上。投影变换就是把三维立体(或物体)投射到投影面上得到二维平面图形。平面几何投影主要指平行投影、透视投影以及通过这些投影变换而得到的三维立体的常用平面图形:三视图、轴视图以及透视图。图形软件一般都支持平行投影和透视投影两种方式。在平行投影中(parallelprojection)中,坐标位置沿平行线变换到观察平面上。图4.1给出了用端点坐标P1和P2描述的线段的平行投影。平行投影保持对象的相关比例不变,这是三维对象计算机辅助绘图和设计中产生成比例工程图的方法。场景中的平行线在平行投影中显示成平行的。一般有两种获得对象平行视图的方法:沿垂直于观察平面的直线投影,或沿某倾斜角度投影到观察平面。P2P1P2'P1'图4.1线段到观察平面的平行投影在透视投影(perspectiveprojection)中,对象位置沿会聚到观察平面后一点的直线变换到投影坐标系。图4.2给出了用端点坐标P1和P2描述的线段的透视投影。与平行投影不同的是,透视投影不保持对象的相关比例。但场景的透视投影真实感教好,因为在透视显示中较远的对象减小了尺寸。P2P1P2'P1'会聚点图4.2线段到观察平面的透视投影5.正投影对象描述沿与投影平面法向量平行的方向到投影平面上的变换称为正投影(orthogonalprojection;或正交投影,orthographicprojection)。这生成一个平行投影变换,其中投影线与投影平面垂直。正投影常常用来生成对象的前视图、侧视图和顶视图,如图5.1所示,前、侧和后方向的正投影称为立面图,顶部正投影称为平面图。工程和建筑绘图通常使用正投影,因为可以精确地绘出长度和角度,并能从图中测量出这些值。图5.1对象的正投影,显示了平面图和立面图6.斜投影斜投影是将三维形体向一个单一的投影面作平行投影,但投影方向不垂直于投影面所得到的平面图形。常选用垂直于某个主轴的投影面,使得平行于投影面的形体表面可以进行距离和角度的测量。斜投影的特点:既可以进行测量又可以同时反映三维形体的多个面,具有立体效果。常用的斜轴测图有斜等测图和斜二测图,如下图所示。图6.1斜投影斜等侧投影:投影方向与投影平面成450的斜平行投影,它保持平行投影平面和垂直投影平面的线的投影长度不变。斜二侧投影:与投影平面成arctg(1/2)角的斜平行投影,它使垂直投影平面的线产生长度为原1/2的投影线。7.透视投影透视投影基本符合人类的视觉习惯,同样尺寸的物体离视点近的比离视点远的大,远到极点即消失。以透视方式在计算机屏幕上观察物体,就如同透过一个完全透明的四方玻璃片看东西一样。想象有一条从眼睛到物体的线,这条直线穿过玻璃,并在玻璃上涂上一个与物体颜色相同的点。如果对所有穿过玻璃的线都这样做,并且保持眼睛不动,那么玻璃片上的图像就是透视变换后得到的图像,这块玻璃片就是窗口。正如人眼睛不能聚焦到非常近或非常远的物体一样,透视投影有2个剪切面——近剪切面和远剪切面,分别将离视点太近和太远的物体部分或全部地剪切掉。透视投影的特点是距离视点近的物体大,距离视点远的物体小,远到极点即为消失。它的观察空间是一个顶部和底部都被切除掉的棱椎,也就是棱台。OpenGL透视投影函数也有两个,其中一个函数是:voidglFrustum(GLdoubleleft,GLdoubleRight,GLdoublebottom,GLdoubletop,GLdoublenear,GLdoublefar);此函数创建一个透视投影的有限观察空间。它的参数只定义近裁剪平面的左下角点和右上角点的三维空间坐标,即(left,bottom,-near)和(right,top,-near);最后一个参数far是远裁剪平面的Z负值,其左下角点和右上角点空间坐标由函数根据透视投影原理自动生成。near和far表示离视点的远近,它们总为正值。另一个函数是:voidgluPerspective(GLdoublefovy,GLdoubleaspect,GLdoublezNear,GLdoublezFar);它也创建一个透视投影的有限观察空间,但它的参数定义于前面的不同,如图7-39所示,参数fovy定义视野在X-Z平面(垂直方向上的可见区域)的角度,范围是[0.0,180.0];参数aspect是投影平面的纵横比(宽度与高度的比值);参数zNear和Far分别是远近裁剪面沿Z负轴到视点的距离,它们总为正值。图7.1透视投影的观察空间8.视口变换和三维屏幕坐标系视口变换类似于照片冲洗过程中的照片裁剪。在计算机图形学中,视口是绘制图像的句型区域。视口以窗口坐标来定义,它表示图像相对于窗口左下角的位置。进行视口变换时,所有顶点都已经经过几何变换,并且位于取景器之外的图像已经被剪切掉了。8.1定义视口打开一个窗口时,系统自动地将视口设置为整个窗口的大小。在OpenGL中可以用glViewport()函数来设置一个较小的绘图区域,该函数的原型如下:voidglViewport(GLintx,GLinty,GLsizeiwidth,GLsizeiheight);该函数的功能是设置窗口。x,y指定一个视口像素矩形的左下角,其初始值是(0,0)。width,height指定一个视口的宽度和高度。当一个OpenGL环境被第一次连接到一个窗口时,参数width和height按此窗口的大小设置。该函数为x和y指定了一种由标准化的设备坐标到窗口坐标的映射几何转化。设(xnd,ynd)是标准化的设备坐标,则窗口坐标(xw,yw)可由下式求得:xwidthxxndw21yheightxyndw21视口的宽度和高度被默认为地截断到一定的范围,具体范围值由所处环境决定。可调用函数glGet(GL_MAX_VIEWPORT_DIMS)查询这一范围值。视口的高宽比一般与投影取景器的高宽比相同,否则会造成图像的变形。在程序的运行过程中,可能会改变窗口的大小,因此程序应该始终检测到这种变化,并作相应的处理。8.2变换z坐标在视口变换中,z坐标或深度坐标被编码并被存储起来。在OpenGL中可以使用glDepthRange()函数缩放z坐标的值,使它处于所要求的范围内。该函数的原型为:voidglDepthRange(GLclampedzNear,GLclampedzFar);该函数的功能是指定一种从归一化深度坐标到窗口深度坐标的映射方法。zNear指定从最近的剪切平面到窗口坐标的映射,其缺省值为0.zFar指定从最远的剪切平面到窗口坐标的映射,其缺省值为1。深度坐标在剪切和除以w后,其范围将变为[-1,1]。其中-1和1分别与最近和最远的剪切平面相对应。该函数将指定该范围内从归一化深度坐标到窗口深度坐标的一种线性映射。不管具体实现的实际深度缓冲区如何,窗口坐标中的深度值将被看做其范围是[0,1]。因此,该函数得到的值将首先被截断到这一范围内。这里,0和1被分别映射成最近和最远的剪切平面。在这种映射下,深度缓冲区的范围可以被完全利用。思考题:1、用户坐标系是什么坐标系?2、创建透视投影的OpenGL函数有哪些?并比较其不同点。3、简单说明斜等侧投影和斜二侧投影的区别。

1 / 10
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功