云题海 - 专业文章范例文档资料分享平台

当前位置:首页 > (完整版)vc++OpenGL三维图像的生成与显示技术研究说明书毕业设计

(完整版)vc++OpenGL三维图像的生成与显示技术研究说明书毕业设计

  • 62 次阅读
  • 3 次下载
  • 2025/6/3 6:52:58

在计算机图形学中,模型(比如卡车或虚拟世界)一般只是考虑相对坐标,因此没有任何点被真正的区分区。 3.1.1坐标系及观察流程

物体模型要显示在屏幕上必须最终确定其显示的位置,即物体在设备坐标系中的位置。但逻辑上物体的位置总是在待渲染的场景中确定的,即建模坐标系中的位置。场景设计者设置物体在建模坐标系中的位置,然后OpenGL将其最终转换成显示设备坐标系中的位置。其中设计人员需要指定建模坐标系并将其传递给OpenGL,以供 OpenGL 转换。

事实上,在从场景物体位置转化成设备坐标系位置,最后物体显示在

屏幕上的过程中存在四种坐标系:建模坐标系(Modeling Coordinate),世界坐标系(World Coordinate),规范化设备坐标系(Normalized Device Coordinate)和设备坐标系(Device Coordinate),它们之间的坐标变换如图3.1所示。

MC WC NVC

DC

图3.1坐标系变换

3.1.2 OpenGL坐标系方向

OpenGL采用右手系坐标系统,即伸出右手沿正向方向弯曲手指,则定义的方向对应于拇指所指向的方向。如图3.2所示。

图3.2右手法则

3.1.3模型视图变换

场景设计人员需要指定建模坐标系。OpenGL中默认的当前建模坐标系就是世界坐标系,且观察点位于世界坐标系原点,Z轴指向观察点,从观察点看去右边是X轴正向,上边是Y轴正向。若要修改之使其符合场景的

需要,必须指定坐标系变换。在 OpenGL以及绝大多数图形系统中坐标系变换是以矩阵的形式表示的,若要指定变换需将变换矩阵作为参数传递给 OpenGL,即调用 OpenGL模型视图变换。

指定 OpenGL模型视图变换有两种方法:(1)直接传递变换矩阵。(2)指定变换类型和变换参数。

指定矩阵参数的API是glMultMatrix(将参数乘以当前模型视图变换矩阵)和glLoadMatrix(将参数指定为当前模型视图变换矩阵)。该方法的优点是可以一次性指定多个变换的最后的变换结果。

OpenGL模型视图变换对应于几何中三种仿射变换有平移,旋转和缩放三种变换:API分别是glTranslate(平移),glRotate(旋转)和glScale(缩放)。该方法比传递表示一种变换的矩阵参数效率高而且直观。

假设当前矩阵为单位矩阵,然后先乘以一个表示旋转的矩阵R,再乘以一个表示移动的矩阵T,最后得到的矩阵再乘上每一个顶点的坐标矩阵v。所以,经过变换得到的顶点坐标就是((RT)v)。由于矩阵乘法的结合率,((RT)v)=(R(Tv)),换句话说,实际上是先进行移动,然后进行旋转。即:实际变换的顺序与代码中写的顺序是相反的。所以,“先移动后旋转”和“先旋转后移动”得到的结果很可能不同。 3.1.4提高绘图效率和场景的层次性

在绘制具有多层建模层次的复杂场景时,会涉及很多模型视图矩阵操作,可利用OpenGL提供的矩阵堆栈来提升效率。

矩阵堆栈适用于构建层次式的模型,也就是通过简单的模型构建复杂的模型。例如,假如绘制的是一辆有4个轮子的汽车,每个轮子用5颗螺钉固定到汽车上。由于所有的轮子都是相同的,所有的螺钉看上去也没什么区别,因此可以用一个函数绘制轮子,用另一个函数绘制螺钉,这两个函数在一个方便的位置和方向绘制一个轮子或一颗螺钉,例如它们的中心在

原点,并且它们的轴与Z轴对齐。当绘制这辆包括了轮子和螺钉的汽车时,需要4次调用画轮子的函数,每次都使用不同的变换,使每个轮子处于正确的位置。当绘制每个轮子时,需要5次调用画螺钉的函数,每次都要根据轮子进行适当的变换。假定只需要绘制车身和轮子,可以改用以下方法。

绘制车身。记住自己的位置,并移动到右前轮的位置。绘制轮子,并丢弃上一次所进行的变换,使自己回到车身的原点位置。记住自己的位置,然后移动到左前轮。类似地,对于每个轮子,需要绘制轮子,记住自己的位置,然后连续地移动移动到绘制螺钉的每个位置,在画完每个螺钉之后丢弃上一次所进行的变换。由于变换是以矩阵的形式存储的,因此矩阵堆栈提供了一种理想的机制,用来完成这种类型的连续的记忆,移动和丢弃操作。

在OpenGL中模型视图矩阵的操作是矩阵堆栈最顶部的那个元素。 glPushMatrix是压栈,glPopMatrix是弹出。

3.2 投影

一个场景要显示在屏幕上必须确定场景中的哪些物体是可见的,投影变换的一个目的就是定义一个可视空间。定义可视空间有两种用途。它决定了一个3D空间中的物体如何映射到屏幕上(即通过使用透视投影或正投影),并且定义了哪些物体或物体的部分被裁剪于最终的图像之外。投影有透视投影和正投影两种类型。 3.2.1透视投影

透视投影最显著的特点是透视缩放(foreshortening):物体距观察点越

远,它最终在屏幕上看上去就越小,比如在火车头内向前照一个铁轨的照片,两条铁轨似乎在远处相交了。这是因为透视投影的可视空间是一个金字塔的平截头体。位于可视空间之内的物体被投影到金字塔的顶点,也就是观察点位置。靠近观察点的物体看上去大一些,因为和远处的物体相比,在平截头体的较大部分里,它们占据了相对较大的可视空间。这种投影方法常用于动画,视觉模拟以及其他要求某种程度的现实感的应用领域,因为它和日常生活中用眼睛观察事物的方式相同。

g1Frustum ()函数用于定义一个平截头体,它计算一个用于实现透视投影的矩阵,并把它与当前的投影矩阵(一般为单位矩阵)相乘。记住,可视空间用于裁剪那些位于它之外的物体。平截头体的4个侧面,项面和底面对应于可视空间的6个裁剪平面,位于这些平面之外的物体或物体的部分将被裁剪掉,不会出现在最终的图像中。且g1Frustum()函数并不需要定义一个对称的可视空间。

图3.3 glFrustum()创建透视投影

平截头体在三维空间中有一个默认的方向,可以在投影矩阵上执行旋转或移动,来改变方向。但是,这种方法难度较大。glFrustum()的使用不是很直观。因此,也可以用OpenGL工具库函数g1uPerspective()。这个函数创建一个可视空间,它与调用glFrustum()所产生的可视空间相同,但可以用一种不同的方式来指定它。这个函数并不是指定近裁剪平面的角,而是指定y方向上的视野的角度(θ)和纵横比(xy)。(对于正方形的屏幕,纵横比为1.0)。这两个参数足以确定沿实现方向的未平截头体金字塔,还需要指定观察点和近侧及远侧裁剪平面的距离,也就是对这个金字塔进行截除。此外,g1uPerspective()仅限于创建沿视线方向同时在x轴和y轴上对称的平截头体,这通常是所需要的。

和glFrustum()函数一样,可以执行旋转或移动,改变由gluPerspective()

  • 收藏
  • 违规举报
  • 版权认领
下载文档10.00 元 加入VIP免费下载
推荐下载
本文作者:...

共分享92篇相关文档

文档简介:

在计算机图形学中,模型(比如卡车或虚拟世界)一般只是考虑相对坐标,因此没有任何点被真正的区分区。 3.1.1坐标系及观察流程 物体模型要显示在屏幕上必须最终确定其显示的位置,即物体在设备坐标系中的位置。但逻辑上物体的位置总是在待渲染的场景中确定的,即建模坐标系中的位置。场景设计者设置物体在建模坐标系中的位置,然后OpenGL将其最终转换成显示设备坐标系中的位置。其中设计人员需要指定建模坐标系并将其传递给OpenGL,以供 OpenGL 转换。 事实上,在从场景物体位置转化成设备坐标系位置,最后物体显示在屏幕上的过程中存在四种坐标系:建模坐标系(Modeling Coordinate),世界坐标系(World Coordinate),规范化设备坐标系(Normalized Device Coordinate)和设备坐标系(Dev

× 游客快捷下载通道(下载后可以自由复制和排版)
单篇付费下载
限时特价:10 元/份 原价:20元
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:fanwen365 QQ:370150219
Copyright © 云题海 All Rights Reserved. 苏ICP备16052595号-3 网站地图 客服QQ:370150219 邮箱:370150219@qq.com