OpenGL之坐标变换.docx

上传人:b****5 文档编号:4548590 上传时间:2022-12-06 格式:DOCX 页数:13 大小:333.72KB
下载 相关 举报
OpenGL之坐标变换.docx_第1页
第1页 / 共13页
OpenGL之坐标变换.docx_第2页
第2页 / 共13页
OpenGL之坐标变换.docx_第3页
第3页 / 共13页
OpenGL之坐标变换.docx_第4页
第4页 / 共13页
OpenGL之坐标变换.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

OpenGL之坐标变换.docx

《OpenGL之坐标变换.docx》由会员分享,可在线阅读,更多相关《OpenGL之坐标变换.docx(13页珍藏版)》请在冰豆网上搜索。

OpenGL之坐标变换.docx

OpenGL之坐标变换

实用标准文案

投影变即几何变换、OpenGL通过相机模拟、可以实现计算机图形学中最基本的三维变换,还实现了矩阵堆栈等。

理解掌握了有关坐标变OpenGL换、裁剪变换、视口变换等,同时,换的内容,就算真正走进了精彩地三维世界。

中的三维物体的显示一、OpenGL

(一)坐标系统

显示二维的但计算机本身只能处理数字,在现实世界中,所有的物体都具有三维特征,

图形,将三维物体及二维数据联系在一起的唯一纽带就是坐标。

这为了使被显示的三维物体数字化,要在被显示的物体所在的空间中定义一个坐标系。

这个坐标系称为世界坐标个坐标系的长度单位和坐标轴的方向要适合对被显示物体的描述,系。

世界坐标系是始终固定不变的。

也就是坐标系以物体的中心为还定义了局部坐标系的概念,所谓局部坐标系,OpenGL当物体模型进行旋这时,坐标原点,物体的旋转或平移等操作都是围绕局部坐标系进行的,如果对物体需要注意的是,转或平移等操作时,局部坐标系也执行相应的旋转或平移操作。

如果缩放比例在案各坐标轴上不同,则局部坐标系也要进行相应的缩放,模型进行缩放操作,无论是在世界坐标系中进行转局部坐标轴之间可能不再相互垂直。

那么再经过旋转操作后,只是不同的坐标系考虑的转换方式不换还是在局部坐标系中进行转换,程序代码是相同的,同罢了。

这就要在图形显要在图形显示器上显示,计算机对数字化的显示物体作了加工处理后,

这个坐标系坐标轴的方这个坐标系称为屏幕坐标系。

示器屏幕上定义一个二维直角坐标系,向通常取成平行于屏幕的边缘,坐标原点取在左下角,长度单位常取成一个象素。

(二)三维物体的相机模拟

为了说明在三维物体到二维图象之间,需要经过什么样的变换,我们引入了相机

)模拟的方式,假定用相机来拍摄这个世界,那么在相机的取景器中,就存在人(Camera眼和现实世界之间的一个变换过程。

精彩文档.

实用标准文案

中的各种坐标变换图一、相机模拟OpenGL

从三维物体到二维图象,就如同用相机拍照一样,通常都要经历以下几个步骤:

1、将相机置于三角架上,让它对准三维景物,它相当于OpenGL中调整视点的位置,即视点变换(ViewingTransformation)。

2、将三维物体放在场景中的适当位置,它相当于OpenGL中的模型变换(Modeling

Transformation),即对模型进行旋转、平移和缩放。

3、选择相机镜头并调焦,使三维物体投影在二维胶片上,它相当于OpenGL中把三维模型投影到二维屏幕上的过程,即OpenGL的投影变换(ProjectionTransformation),OpenGL中投影的方法有两种,即正射投影和透视投影。

为了使显示的物体能以合适的位置、大小和方向显示出来,必须要通过投影。

有时为了突出图形的一部分,只把图形的某一部分显示出来,这时可以定义一个三维视景体(ViewingVolume)。

正射投影时一般是一个长方体的视景体,透视投影时一般是一个棱台似的视景体。

只有视景体内的物体能被投影在显示平面上,其他部分则不能。

精彩文档.

实用标准文案

Viewport中的视口变换(4、冲洗底片,决定二维相片的大小,它相当与OpenGL

),视景体投影ViewportTransformation)(在屏幕窗口内可以定义一个矩形,称为视口(后的图形就在视口内显示)规定屏幕上显示场景的范围和尺寸。

也一个三维空间里的物体就可以用相应的二维平面物体表示了,通过上面的几个步骤,就能在二维的电脑屏幕上正确显示了。

总的来说,三维物体的显示过程如下:

图二、三维物体的显示过程二、OpenGL中的几种变换

就是当发出一个转换命令时,具体的说,OpenGL中的各种转换是通过矩阵运算实现的,

(x,y,z,即OpenGL中的物体坐标一律采用齐次坐标,该命令会生成一个4X4阶的转换矩阵(矩阵),当前矩阵与这个转换矩阵相乘,从而生成新的当4X4w),故所有变换矩阵都采用,转换命令通常在顶点坐标命令之前发出,若当前矩阵为v前矩阵。

例如,对于顶点坐标,这个矩阵,则发出转换命令后,生成的新的当前矩阵为CMC,转换命令构成的矩阵为M。

上述过程说明,程序中绘制顶点前的最,从而构成新的顶点坐标CMv再乘以顶点坐标v实际的变换顺序与OpenGL编程中,后一个变换命令最先作用于顶点之上。

这同时也说明,指定的顺序是相反的。

(一)视点变换

它象是在场景中放置就向上边提到的,视点变换确定了场景中物体的视点位置和方向,

(相(即视点)定位在坐标系的原点相机了一架照相机,让相机对准要拍摄的物体。

确省时,负轴),它同物体模型的缺省位置是一致的,显然,如果不进行视点机初始方向都指向Z变换,相机和物体是重叠在一起的。

执行视点变换的命令和执行模型转换的命令是相同的,想一想,在用相机拍摄物体时,

我们也可另外,我们可以保持物体的位置不动,而将相机移离物体,这就相当于视点变换;中,以保持相机的固定位置,将物体移离相机,这就相当于模型转换。

这样,在OpenGL我们必须把视点转换和模型转换结合因此,以逆时针旋转物体就相当于以顺时针旋转相机。

在一起考虑,而对这两种转换单独进行考虑是毫无意义的。

函数,该函gluLookAt()OpenGL除了用模型转换命令执行视点转换之外,实用库还提供了精彩文档.

实用标准文案

该函分别定义了视点的位置、相机瞄准方向的参考点以及相机的向上方向。

数有三个变量,数的原型为voidgluLookAt(GLdoubleeyex,GLdoubleeyey,GLdoubleeyez,GLdoublecenterx,GLdouble

centery,GLdoubleupx,GLdoubleupy,GLdoubleupz);

定义了视点的该函数定义了视点矩阵,并用该矩阵乘以当前矩阵eyex,eyey,eye

变量指定了参考点的位置,该点通常为相机所瞄准的场centercentercenter置变量指定了向上向量的方向upup中心轴线上的点up

场以便模型转换先对物体发生作用通常视点转换操作在模型转换操作之前发出

中物体的顶点经过模型转换之后移动到所希望的位置,然后再对场景进行视点定位等操作模型转换和视点转换共同构成模型视景矩阵

(二)模型变

模型变换是在世界坐标系中进行的。

缺省时,物体模型的中心定位在坐标系的中心处

在这个坐标系中,有三个命令,可以模型变换OpenG

、模型平

glTranslate{fd}(TYPEx,TYPEy,TYPEz);

轴平移物体(或按照相同的量值移动局部轴、z值沿着x轴、y该函数用指定的x,y,z坐标系)。

2、模型旋转

glRotate{fd}(TYPEangle,TYPEx,TYPE,y,TYPEz);

制定模型旋转的角度,单位为度,后三个变量表示以原点angle该函数中第一个变量

的结的连线为轴线逆时针旋转物体。

例如,glRotatef(45.0,0.0,0.0,1.0)0,0,0()到点(x,y,z)度。

轴旋转果是绕z45

、模型缩放3

glScale{fd}(TYPEx,TYPEy,TYPEz);

z、、轴分别进行放大缩小。

函数中的三个参数分别是该函数可以对物体沿着x,y,zxy精彩文档.

实用标准文案

,其2.0轴比例为1.0,即物体没变化。

程序中物体Y轴方向的比例变换因子。

缺省时都为,就是说将立方体变成长方体。

余都为1.0

(三)投影变换

但由于显示器只能用二场景中的物体放在了所希望的位置上,经过模型视景的转换后,维图象显示三维物体,因此就要靠投影来降低维数(投影变换类似于选择相机的镜头)。

最终使得视景体外多余的部分裁剪掉,事实上,投影变换的目的就是定义一个视景体,

和正视)(PerspectiveProjection进入图像的只是视景体内的有关部分。

投影包括透视投影OrthographicProjection)两种。

投影(

即离视点近的物体大,离视点远的物体小,远到极点即透视投影,符合人们心理习惯,

也就是棱台。

成为灭点。

它的视景体类似于一个顶部和底部都被进行切割过的棱椎,为消失,这个投影通常用于动画、视觉仿真以及其它许多具有真实性反映的方面。

的原型为:

OpenGL透视投影函数有两个,其中函数glFrustum()

voidglFrustum(GLdoubleleft,GLdoubleRight,GLdoublebottom,GLdoubletop,GLdouble

near,GLdoublefar);

并且用这个矩阵乘以当前矩它创建一个透视视景体。

其操作是创建一个透视投影矩阵,

,阵。

这个函数的参数只定义近裁剪平面的左下角点和右上角点的三维空间坐标,即(left负值,其左是远裁剪平面的Zfartop)和(right,,-near);最后一个参数-nearbottom,表示离视点的远far下角点和右上角点空间坐标由函数根据透视投影原理自动生成。

near和近,它们总为正值。

该函数形成的视景体如图三所示。

图三、透视投影视景体精彩文档.

实用标准文案

另一个透视函数是:

voidgluPerspective(GLdoublefovy,GLdoubleaspect,GLdoublezNear,GLdoublezFar);

定义视野fov它也创建一个对称透视视景体,但它的参数定义于前面的不同,参zNea是投影平面宽度与高度的比率参aspecX-平面的角度范围[0.0,180.0参负轴到视点的距离,它们总为正值Fa分别是远近裁剪面沿

图四、透视投影视景体

轴指向负方向。

以上两个函数缺省时,视点都在原点,视线沿Z

也就是一个长方又叫平行投影。

这种投影的视景体是一个矩形的平行管道,正射投影,投影后的物体大小尺正射投影的最大一个特点是无论物体距离相机多远,体,如图五所示。

这些行业要求投影后的寸不变。

这种投影通常用在建筑蓝图绘制和计算机辅助设计等方面,物体尺寸及相互间的角度不变,以便施工或制造时物体比例大小正确。

精彩文档.

实用标准文案

图五、正射投影视景体

正射投影函数也有两个,一个函数是:

OpenGLvoidglOrtho(GLdoubleleft,GLdoubleright,GLdoublebottom,GLdoubletop,GLdouble

near,GLdoublefar)

并且用这个实际上这个函数的操作是创建一个正射投影矩阵,它创建一个平行视景体。

,,(leftbottom矩阵乘以当前矩阵。

其中近裁剪平面是一个矩形,矩形左下角点三维空间坐标是);远裁剪平面也是一个矩形,左下角点空间坐标top,-near-near),右上角点是(right,值同时为正和fartop,-far)。

所有的near-far是(left,bottom,),右上角点是(right,负轴。

这意轴,且视点朝向Z或同时为负。

如果没有其他变换,正射投影的方向平行于Z都为负值,物体在视点后面时far和nearnear都为正值。

味着物体在视点前面时far和

另一个函数是:

voidgluOrtho2D(GLdoubleleft,GLdoubleright,GLdoublebottom,GLdoubletop)

它是一个特殊的正射投影函数,主要用于二维图像到二维屏幕上的投影。

它的near和far缺省值分别为-1.0和1.0,所有二维物体的Z坐标都为0.0。

因此它的裁剪面是一个左下角点为(left,bottom)、右上角点为(right,top)的矩形。

(四)视口变换。

视口变换就是将视景体内投影的物体显示在二维的视口平面上。

运用相机模拟方式,我们很容易理解视口变换就是类似于照片的放大与缩小。

在计算机图形学中,它的定义是将经过几何变换、投影变换和裁剪变换后的物体显示于屏幕窗口内指定的区域内,这个区域通常为矩形,称为视口。

OpenGL中相关函数是:

精彩文档.

实用标准文案

glViewport(GLintx,GLinty,GLsizeiwidth,GLsizeiheight);

是视口在屏幕窗口坐标系中的左下角点坐标,这个函数定义一个视口。

函数参数(x,y(0,0,winWidth,winHeight)分别是视口的宽度和高度缺省时参数值参widtheigh指的是屏幕窗口的实际尺寸大小。

所有这些值都是以象素为单位,全为整型数

)裁剪变

中,除了视景体定义的六个裁剪平面(上、下、左、右、前、后)外,OpenG

户还可自己再定义一个或多个附加裁剪平面,以去掉场景中无关的目标,如图六所示。

图六、附加裁剪平面

附加平面裁剪函数为:

voidglClipPlane(GLenumplane,ConstGLdouble*equation);、1

指向一个拥有四个系数值的数组,这四个系数分别是裁剪平面equation函数参数plane由这四个系数就能确定一个裁剪平面。

参数C、、D值。

因此,AAx+By+Cz+D=0的、B,指定裁剪面号。

是GL_CLIP_PLANEi(i=0,1,...)

使得当前所定义,在调用附加裁剪函数之前,必须先启动glEnable(GL_CLIP_PLANEi)

关glDisable(GL_CLIP_PLANEi)的裁剪平面有效;当不再调用某个附加裁剪平面时,可用闭相应的附加裁剪功能。

透视投影gluPerspective()下面这个例子不仅说明了附加裁剪函数的用法,而且调用了函数,读者可以细细体会其中的用法。

例程如下:

#includeglos.h

精彩文档.

实用标准文案

#include

#include

#include

voidmyinit(void);

voidCALLBACKmyReshape(GLsizeiw,GLsizeih);

voidCALLBACKdisplay(void);

voidCALLBACKdisplay(void)

{

GLdoubleeqn[4]={1.0,0.0,0.0,0.0};

glClear(GL_COLOR_BUFFER_BIT);

glColor3f(1.0,0.0,1.0);

glPushMatrix();

glTranslatef(0.0,0.0,-5.0);

/*cliptheleftpartofwire_sphere:

x<0*/

glClipPlane(GL_CLIP_PLANE0,eqn);

glEnable(GL_CLIP_PLANE0);

glRotatef(-90.0,1.0,0.0,0.0);

auxWireSphere(1.0);

glPopMatrix();

glFlush();

}

voidmyinit(void)

{

glShadeModel(GL_FLAT);

}

voidCALLBACKmyReshape(GLsizeiw,GLsizeih)

{

glViewport(0,0,w,h);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

gluPerspective(60.0,(GLfloat)w/(GLfloat)h,1.0,20.0);

glMatrixMode(GL_MODELVIEW);

}

voidmain(void)

{

auxInitDisplayMode(AUX_SINGLE|AUX_RGB);

auxInitPosition(0,0,500,500);

auxInitWindow(ArbitraryClippingPlanes);

myinit();

auxReshapeFunc(myReshape);

auxMainLoop(display);

}

可以实现计算机图形学中最基本的三维变换通过相机模拟即几何变换OpenG

还实现了矩阵堆栈等。

理解掌握了有关OpenG影变换、裁剪变换、视口变换等,同时,精彩文档.

实用标准文案

标变换的内容,就算真正走进了精彩地三维世界。

中的三维物体的显示一、OpenGL

(一)坐标系统

显示二维的但计算机本身只能处理数字,在现实世界中,所有的物体都具有三维特征,

图形,将三维物体及二维数据联系在一起的唯一纽带就是坐标。

这为了使被显示的三维物体数字化,要在被显示的物体所在的空间中定义一个坐标系。

这个坐标系称为世界坐标个坐标系的长度单位和坐标轴的方向要适合对被显示物体的描述,系。

世界坐标系是始终固定不变的。

也就是坐标系以物体的中心为还定义了局部坐标系的概念,所谓局部坐标系,OpenGL当物体模型进行旋这时,坐标原点,物体的旋转或平移等操作都是围绕局部坐标系进行的,如果对物体需要注意的是,转或平移等操作时,局部坐标系也执行相应的旋转或平移操作。

如果缩放比例在案各坐标轴上不同,则局部坐标系也要进行相应的缩放,模型进行缩放操作,无论是在世界坐标系中进行转局部坐标轴之间可能不再相互垂直。

那么再经过旋转操作后,只是不同的坐标系考虑的转换方式不换还是在局部坐标系中进行转换,程序代码是相同的,同罢了。

这就要在图形显要在图形显示器上显示,计算机对数字化的显示物体作了加工处理后,

这个坐标系坐标轴的方这个坐标系称为屏幕坐标系。

示器屏幕上定义一个二维直角坐标系,向通常取成平行于屏幕的边缘,坐标原点取在左下角,长度单位常取成一个象素。

(二)三维物体的相机模拟

为了说明在三维物体到二维图象之间,需要经过什么样的变换,我们引入了相机

)模拟的方式,假定用相机来拍摄这个世界,那么在相机的取景器中,就存在人(Camera眼和现实世界之间的一个变换过程。

精彩文档.

实用标准文案

中的各种坐标变换图一、相机模拟OpenGL

从三维物体到二维图象,就如同用相机拍照一样,通常都要经历以下几个步骤:

1、将相机置于三角架上,让它对准三维景物,它相当于OpenGL中调整视点的位置,即视点变换(ViewingTransformation)。

2、将三维物体放在场景中的适当位置,它相当于OpenGL中的模型变换(Modeling

Transformation),即对模型进行旋转、平移和缩放。

3、选择相机镜头并调焦,使三维物体投影在二维胶片上,它相当于OpenGL中把三维模型投影到二维屏幕上的过程,即OpenGL的投影变换(ProjectionTransformation),OpenGL中投影的方法有两种,即正射投影和透视投影。

为了使显示的物体能以合适的位置、大小和方向显示出来,必须要通过投影。

有时为了突出图形的一部分,只把图形的某一部分显示出来,这时可以定义一个三维视景体(ViewingVolume)。

正射投影时一般是一个长方体的视景体,透视投影时一般是一个棱台似的视景体。

只有视景体内的物体能被投影在显示平面上,其他部分则不能。

精彩文档.

实用标准文案

Viewport中的视口变换(OpenGL4、冲洗底片,决定二维相片的大小,它相当与

),视景体投影ViewportTransformation)(在屏幕窗口内可以定义一个矩形,称为视口(后的图形就在视口内显示)规定屏幕上显示场景的范围和尺寸。

也一个三维空间里的物体就可以用相应的二维平面物体表示了,通过上面的几个步骤,就能在二维的电脑屏幕上正确显示了。

总的来说,三维物体的显示过程如下:

图二、三维物体的显示过程

精彩文档.

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 成人教育 > 远程网络教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1