OpenGL 模型视图变换、投影变换、视口变换

      产生目标场景的过程类似于用照相机进行拍照:

(1) 把照相机固定在三角架上,并让他对准场景从不同位置观察场景(视图变换)

      gluLookAt

(2) 对场景进行安排,使各个物体在照片中的位置是我们所希望的 移动,旋转或者放大缩小场景中的物体(模型变换)

      glTranslate* ,glRotate* ,glScale*

(3) 选择照相机镜头,并调整放大倍数(调焦) 显示物体时,可以选择物体是如何投影到屏幕上(投影变换)

      glFrustum , gluPerspective , glOrtho

(4) 确定照片的大小,放大照片还是缩小照片 把图形画下来,是要占据整个屏幕还是屏幕的一部分(视口变换)

         glViewPort

 

注意:视图变换必须出现在模型变换之前, 但可以在绘图之前的任何时候执行投影 变换和视口变换,

如果OpenGL中不设置模型,投影,视口,所绘制的几何图形的坐标只能是-1到1(X轴向右,Y轴向上,Z轴垂直屏幕)。

 

默认为视图模型变化 glMatrixMode(GL_MODELVIEW);

默认投影变换为 glOrtho

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我来尝试回答你的问题。 首先,需要明确透视投影和三视图投影的概念。透视投影是指将三维物体投影到二维平面上的一种投影方式,它能够产生透视效果,即近大远小的效果。而三视图投影是指将三维物体投影到三个互相垂直的平面上,分别得到前视图、俯视图和左视图等。 在OpenGL中,透视投影和三视图投影都可以通过矩阵变换来实现。下面简单介绍一下如何实现三视图投影变换。 首先,我们需要定义三个互相垂直的平面,可以通过定义三个相互垂直的向量来实现。假设这三个向量分别为x、y、z轴的单位向量,那么可以得到以下代码: ``` glm::vec3 x_axis(1.0f, 0.0f, 0.0f); glm::vec3 y_axis(0.0f, 1.0f, 0.0f); glm::vec3 z_axis(0.0f, 0.0f, 1.0f); ``` 然后,我们需要定义三个投影矩阵,分别对应前视图、俯视图和左视图。这三个矩阵可以通过调用OpenGL的透视投影函数gluPerspective来计算得到,具体代码如下: ``` glm::mat4 proj_front = glm::perspective(glm::radians(45.0f), (float)width / (float)height, 0.1f, 100.0f); glm::mat4 proj_top = glm::perspective(glm::radians(45.0f), (float)width / (float)height, 0.1f, 100.0f); glm::mat4 proj_left = glm::perspective(glm::radians(45.0f), (float)width / (float)height, 0.1f, 100.0f); ``` 其中,width和height分别表示视口的宽度和高度。需要注意的是,这里的三个投影矩阵都是透视投影矩阵,并不是正交投影矩阵。 最后,我们需要将三个投影矩阵分别与三个平面的变换矩阵进行组合,得到最终的三视图投影矩阵。具体代码如下: ``` glm::mat4 view_front = glm::lookAt(origin, origin + z_axis, y_axis); glm::mat4 view_top = glm::lookAt(origin, origin + y_axis, -z_axis); glm::mat4 view_left = glm::lookAt(origin, origin + x_axis, y_axis); glm::mat4 proj_front_view = proj_front * view_front; glm::mat4 proj_top_view = proj_top * view_top; glm::mat4 proj_left_view = proj_left * view_left; ``` 其中,origin表示观察点的位置。需要注意的是,这里的观察点位置需要根据不同的视图来设置,比如在前视图中观察点应该在物体前方,而在左视图中观察点应该在物体左侧。 最终,我们可以将得到的三个投影矩阵分别应用到OpenGL的渲染流程中,实现三视图投影变换。具体代码如下: ``` glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glMultMatrixf(glm::value_ptr(proj_front_view)); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); // 在这里将物体的变换矩阵应用到模型视图矩阵中 // 渲染前视图 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 在这里进行渲染 glMatrixMode(GL_PROJECTION); glLoadIdentity(); glMultMatrixf(glm::value_ptr(proj_top_view)); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); // 在这里将物体的变换矩阵应用到模型视图矩阵中 // 渲染俯视图 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 在这里进行渲染 glMatrixMode(GL_PROJECTION); glLoadIdentity(); glMultMatrixf(glm::value_ptr(proj_left_view)); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); // 在这里将物体的变换矩阵应用到模型视图矩阵中 // 渲染左视图 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 在这里进行渲染 ``` 以上就是基于OpenGL实现三视图投影变换的简要步骤和代码。希望能对你有所帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值