计算机图形学实验七定义一个简单形体(OpenGL提供的基础形体,如立方体、球体等),并生成正交投影及透视投影视图

实验内容、目的、及要求

实验内容

定义一个简单形体(OpenGL提供的基础形体,如立方体、球体等),并生成正交投影及透视投影视图;

实验目的

1、掌握OpenGL中的三维观察流程,及相关函数;

2、掌握OpenGL中的相关坐标系概念;

实验要求

  1. 使用OpenGL等图形库实现;
  2. 可交互,可调整观察姿态及位置(调整相机位置、姿态等);
  3. 无需考虑斜平行投影;
  • 实验数据/结果,实验总结/收获

3.1 实验数据和结果

  1. OpenGL中的三维观察流程,及相关函数说明

①三维观察流程

  1. 设置投影矩阵:使用glMatrixMode(GL_PROJECTION)函数指定当前操作为设置投影矩阵模式,然后使用glLoadIdentity()函数将当前矩阵重置为单位矩阵,并使用gluPerspective()或glFrustum()等函数设置视景体的空间大小和形状。
  2. 设置模型视图矩阵:使用glMatrixMode(GL_MODELVIEW)函数指定当前操作为设置模型视图矩阵模式,然后使用glLoadIdentity()函数将当前矩阵重置为单位矩阵,使用glTranslate()、glRotate()、glScale()等函数对物体进行变换,并使用gluLookAt()函数设置相机位置和朝向。
  3. 执行渲染操作:根据已经设置好的投影矩阵和模型视图矩阵,执行渲染操作将图形绘制到屏幕上。

②相关函数说明

  1. glMatrixMode(mode):将当前矩阵模式设置为mode,常用模式有GL_MODELVIEW和GL_PROJECTION。
  2. glLoadIdentity():将当前矩阵重置为单位矩阵。
  3. gluPerspective(fovy, aspect, near, far):设置透视投影矩阵,参数分别为垂直视角,视口宽高比,近平面距离和远平面距离。
  4. glFrustum(left, right, bottom, top, near, far):设置平截头体投影矩阵,参数分别为左、右、下、上、近、远平面距离。
  5. glTranslate(x, y, z):对当前矩阵进行平移变换,参数分别为x、y、z轴方向的偏移量。
  6. glRotate(angle, x, y, z):对当前矩阵进行旋转变换,angle为旋转角度,(x,y,z)为旋转轴的坐标。
  7. glScale(x, y, z):对当前矩阵进行缩放变换,参数分别为x、y、z方向的缩放比例。
  8. gluLookAt(eyeX, eyeY, eyeZ, centerX, centerY, centerZ, upX, upY, upZ):设置相机位置和朝向,参数分别为相机位置和观察点位置,以及相机向上方向。

③OpenGL中的相关坐标系概念

在OpenGL中,涉及到的坐标系包括世界坐标系、观察空间坐标系、裁剪空间坐标系、屏幕坐标系等,具体如下:

  1. 世界坐标系:用于描述场景中物体的位置和朝向。通常是以固定的参考点为原点建立的直角坐标系。
  2. 观察空间坐标系(也称视图坐标系):用于描述相机位置和方向。这个坐标系通常是在世界坐标系中建立起来的,通过相机位置和方向变换可以将场景转换到相对于观察者的空间中。
  3. 裁剪空间坐标系:由OpenGL自动进行的、一种投影后的坐标系。该坐标系会在最后一个变换阶段之后形成,即模型视图矩阵和投影矩阵均已经应用完毕后。它是一个以相机为原点的立方体坐标系,其中任何位于立方体外面的顶点都被剔除掉。
  4. 屏幕坐标系:描述了场景在屏幕上实际显示的位置和大小。它是一个二维平面的直角坐标系,通常将屏幕的左上角作为坐标系的原点。
  1. 实验算法说明

在本实验中,我才用自定义点的坐标,调用OpenGL库中的glVertex3fv函数进行立方体图形的绘制,针对两种投影方式(正交投影和透视投影),我定义了两种绘制窗口的函数,这样针对用户不同的选择,可以选择生成不同绘制窗口。

关于调整观察姿态及位置(调整相机位置、姿态等)的问题,我采用鼠标拖动和鼠标点击检测的回调函数,这样随着鼠标的拖动和点击,就可以改变图形的坐标进而重新绘制图像渲染到窗口上,就可以实现利用鼠标拖动来调整观察姿态及位置。

  1. 算法实现说明
  1. 立方体图形的绘制:定义两个二维数组vertex_list、index_list,vertex_list存放顶点集合,index_list存放绘图顺序集合,调用glVertex3fv函数进行三维图形的绘制,在这里绘制的立方体是镂空状态的,因为我在绘制顶点的时候,调用GL_LINES模式,所以实际上是在三维空间里面依次绘制立方体的边。

  1. 正交投影的实现:首先用glViewport函数设置窗口视口,左下角为(0,0),窗口大小为设置的宽和高,然后glMatrixMode指定当前操作为设置投影矩阵模式,然后使用glLoadIdentity()函数将当前矩阵重置为单位矩阵,然后利用glOrtho函数设置正射投影,正射投影将场景中的物体等比缩放到绘图窗口,不考虑透视效果,最后设置模型视图窗口,glMatrixMode(GL_MODELVIEW)函数指定当前操作为设置模型视图矩阵模式,这样就基本完成正交投影的窗口设置。

  1. 透视投影的实现:首先用glViewport函数设置窗口视口,左下角为(0,0),窗口大小为设置的宽和高,然后glMatrixMode指定当前操作为设置投影矩阵模式,然后使用glLoadIdentity()函数将当前矩阵重置为单位矩阵,然后利用gluPerspective函数设置透视投影,透视投影是一种在屏幕上呈现物体时具有更现实感和深度感的投影方式,此时必须将模型视图矩阵和投影矩阵都设置为身份矩阵(即重置它们)。最后设置模型视图窗口,glMatrixMode(GL_MODELVIEW)函数指定当前操作为设置模型视图矩阵模式,这样就基本完成透视投影的窗口设置。

  1. 鼠标调整观察姿态及位置的实现:分别设置的鼠标点击和鼠标拖动回调函数,鼠标点击主要是为了记录鼠标在窗口的初始坐标,鼠标拖动函数用来实现观察位置的改变,即可以拖动立方体观察其全貌。

  1. 实验测试及说明

正交投影和透视投影均放了两张图,是鼠标拖动后的不同观察效果。可以看出正交投影(Orthographic Projection)所显示的场景不会因为物体的距离而产生远近关系,而是在屏幕上等比例缩放。适用于需要显示二维和三维图形但不需要远近感的情况。透视投影(Perspective Projection)则是通过将视场角度和纵横比带入参数实现的。它能够呈现出物体随着距离远近的大小变化和位置变化以及消失点,使场景具有更加真实的远近感

详细代码见链接:https://download.csdn.net/download/weixin_53249260/88236665 

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值