OpenGL中几种变换含义

本文详细介绍了OpenGL绘制流水线的各个阶段,包括顶点处理、裁剪与图元组装、光栅化及片元处理等过程。同时,还阐述了在绘制流程中涉及的六种坐标系及其转换方式。

 OpenGL的绘制流水线模型:

顶点--顶点处理模块--裁剪模块和图元组装模块--光栅化模块--片元处理模块--像素

这个过程中涉及的坐标系有:

1、对象坐标系或者建模坐标系

2、世界坐标系

3、眼坐标系或者照相机坐标系

4、裁剪坐标系

5、规范化的设备坐标系

6、窗口坐标系或者屏幕坐标系。

 

1.对于小型的单个实体程序,对象坐标系或者建模坐标系与世界坐标系是相同的,对象标架是对象自身的标架,在这个标架下可以方便地描述对象的大小、位置和方向。

2、一个应用程序可能包含成百上千个单独对象,我们必须把它们放到一个公共场景里,应用程序通常对每个对象实施一系列变换,这些变换可以改变它们的大小、方向和位置,从而使它们处于一个适合于该特定应用程序的标架中,这个标架就是世界坐标系

3、对于应用程序来说,对象标架和世界标架是很自然的标架,然而生成的图像依赖于照相机或者观察者所能看到的内容。几乎所有的图形系统都使用一个标架,该标架原点位于照相机透镜的中心,并且坐标轴平行于照相机的侧面,这就是照相机标架,也可以称为眼标架,因为每个标架变换都对应一个仿射变换,所以从模型坐标系到世界坐标系(模型变换)以及从世界坐标系到眼坐标系(视图变换)都可以用4*4的矩阵来表示。OpenGL把这些变换合并为模-视变换,对应的矩阵为模-视变换矩阵(这里通常用一个模-视变换矩阵来代替两个变换矩阵)。

4、把对象变换到眼坐标系之后,OpenGL就要检查它们是否处于视见体内。如果一个对象位于视见体外,那么就在光栅化之前把它从场景里剪裁掉。为了进行更有效的剪裁,OpenGL先进行投影变换,这个变换把所有可能是可见的对象变换到一个立方体中,该立方体的中心是剪裁坐标系的原点。

5、在投影变换之后,顶点的表示仍然是齐次坐标,顶点的坐标表示再经过透视除法,即用w分量去除其他分量,就得到了在规范化的设备坐标系下的三维表示。

6、根据视口提供的信息,把规范化的设备坐标系下的表示变换为窗口坐标系下的三维表示,窗口坐标是用显示器上的像素来度量的,但仍保留了深度信息。如果去掉了深度信息,就得到了二维屏幕的坐标。


摘自:《交互式计算机图形学-基于OpenGl的自顶向下方法》Edward Angel

湖科大的 OpenGL 课程中,图形变换是重要的内容,主要包括以下几种类型: ### 模型变换 模型变换用于改变物体的位置、大小和方向,主要包含平移、旋转和缩放三种基本操作。 - **平移**:将物体从一个位置移动到另一个位置。在 OpenGL 中,可以使用 `glTranslatef` 函数实现。例如,`glTranslatef(1.0f, 0.0f, 0.0f)` 会将物体沿 x 轴正方向移动 1 个单位。 ```c glTranslatef(x, y, z); // x, y, z 分别是在三个坐标轴上的平移量 ``` - **旋转**:使物体绕指定的轴进行旋转。`glRotatef` 函数可用于实现旋转操作。比如,`glRotatef(45.0f, 0.0f, 0.0f, 1.0f)` 会让物体绕 z 轴旋转 45 度。 ```c glRotatef(angle, x, y, z); // angle 是旋转角度,x, y, z 定义旋转轴 ``` - **缩放**:改变物体的大小。使用 `glScalef` 函数可以对物体进行缩放。例如,`glScalef(2.0f, 2.0f, 2.0f)` 会将物体在三个坐标轴方向上都放大为原来的 2 倍。 ```c glScalef(x, y, z); // x, y, z 分别是在三个坐标轴上的缩放因子 ``` ### 视图变换 视图变换用于确定观察者(相机)的位置和方向。在 OpenGL 中,通常使用 `gluLookAt` 函数来定义视图变换。该函数需要指定相机的位置、观察点的位置以及相机的上方向。 ```c gluLookAt(eyeX, eyeY, eyeZ, centerX, centerY, centerZ, upX, upY, upZ); // eyeX, eyeY, eyeZ 是相机的位置 // centerX, centerY, centerZ 是观察点的位置 // upX, upY, upZ 是相机的上方向 ``` ### 投影变换 投影变换将三维场景投影到二维平面上,主要分为正交投影和透视投影。 - **正交投影**:物体的大小不会因为距离相机的远近而改变,常用于绘制二维图形或需要保持物体真实比例的场景。使用 `glOrtho` 函数实现正交投影。 ```c glOrtho(left, right, bottom, top, near, far); // left, right 是左右边界 // bottom, top 是上下边界 // near, far 是前后裁剪面的距离 ``` - **透视投影**:物体的大小会随着距离相机的远近而变化,更符合人眼的视觉习惯。`gluPerspective` 函数可用于实现透视投影。 ```c gluPerspective(fovy, aspect, zNear, zFar); // fovy 是垂直视角 // aspect 是视口的宽高比 // zNear 和 zFar 分别是近裁剪面和远裁剪面的距离 ``` ### 视口变换 视口变换将投影后的二维图形映射到窗口的特定区域。使用 `glViewport` 函数可以指定视口的位置和大小。 ```c glViewport(x, y, width, height); // x, y 是视口左下角的坐标 // width, height 是视口的宽度和高度 ``` 这些图形变换操作通常是通过矩阵运算来实现的,OpenGL 内部维护了多个矩阵栈,用于存储不同类型的变换矩阵。通过 `glMatrixMode` 函数可以选择当前操作的矩阵栈。例如,`glMatrixMode(GL_MODELVIEW)` 表示选择模型视图矩阵栈,后续的模型变换和视图变换操作都会影响该矩阵栈。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值