运用相机模拟的方式比较通俗地讲解了三维图形显示的基本过程,但在具体应用OpenGL函数库编程时,还必须了解三维图形世界中的几个特殊坐标系的概念,以及用这些概念表达的三维图形显示流程。
计算机本身只能处理数字,图形在计算机内也是以数字的形式进行加工和处理的。大家都知道,坐标建立了图形和数字之间的联系。为了使被显示的物体数字化,要在被显示的物体所在的空间中定义一个坐标系。这个坐标系的长度单位和坐标轴的方向要适合对被显示物体的描述,这个坐标系称为世界坐标系。
计算机对数字化的显示物体作了加工处理后,要在图形显示器上显示,这就要在图形显示器屏幕上定义一个二维直角坐标系,这个坐标系称为屏幕坐标系。这个坐标系坐标轴的方向通常取成平行于屏幕的边缘,坐标原点取在左下角,长度单位常取成一个象素的长度,大小可以是整型数。
为了使显示的物体能以合适的位置、大小和方向显示出来,必须要通过投影。投影的方法有两种,即正射投影和透视投影。
有时为了突出图形的一部分,只把图形的某一部分显示出来,这时可以定义一个三维视景体(Viewing Volume)。正射投影时一般是一个长方体的视景体,透视投影时一般是一个棱台似的视景体。只有视景体内的物体能被投影在显示平面上,其他部分则不能。在屏幕窗口内可以定义一个矩形,称为视口(Viewport),视景体投影后的图形就在视口内显示。
为了适应物理设备坐标和视口所在坐标的差别,还要作一适应物理坐标的变换。这个坐标系称为物理设备坐标系。根据上面所述,三维图形的显示流程应如图8-2所示。
|
图8-2 三维图形的显示流程
|
8.1.3 基本变换简单分析
下面举一个简单的变换例子,cube.c:
#include "glos.h"
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glaux.h>
void myinit(void);
void CALLBACK myReshape(GLsizei w, GLsizei h);
void CALLBACK display(void);
void CALLBACK display (void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f (1.0, 1.0, 1.0);
glLoadIdentity (); /* clear the matrix */
glTranslatef (0.0, 0.0, -5.0); /* viewing transformation */
glScalef (1.0, 2.0, 1.0); /* modeling transformation */
auxWireCube(1.0); /* draw the cube */
glFlush();
}
void myinit (void)
{
glShadeModel (GL_FLAT);
}
void CALLBACK myReshape(GLsizei w, GLsizei h)
{
glMatrixMode (GL_PROJECTION); /* prepare for and then */
glLoadIdentity (); /* define the projection */
glFrustum (-1.0, 1.0, -1.0, 1.0, 1.5, 20.0); /* transformation */
glMatrixMode (GL_MODELVIEW); /* back to modelview matrix */
glViewport (0, 0, w, h); /* define the viewport */
}
void main(void)
{
auxInitDisplayMode (AUX_SINGLE | AUX_RGBA);
auxInitPosition (0, 0, 500, 500);
auxInitWindow ("Perspective 3-D Cube");
myinit ();
auxReshapeFunc (myReshape);
auxMainLoop(display);
}
以上程序运行结果就是绘制一个三维的正面透视立方体。其中已经用到了相机模拟中提到的四种基本变换,即视点变换、模型变换、投影变换和视口变换。
下面简单分析一下整个程序过程:
1)视点变换。视点变换是在视点坐标系中进行的。视点坐标系于一般的物体所在的世界坐标系不同,它遵循左手法则,即左手大拇指指向Z正轴,与之垂直的四个手指指向X正轴,四指弯曲90度的方向是Y正轴。而世界坐标系遵循右手法则的。如图8-4所示。当矩阵初始化glLoadIdentity()后,调用glTranslatef()作视点变换。函数参数(x, y, z)表示视点或相机在视点坐标系中移动的位置,这里z=-5.0,意思是将相机沿Z负轴移动5个单位。
通常相机位置缺省值同场景中的物体一样,都在原点处,而且相机初始方向都指向Z负轴。
这里相机移走后,仍然对准立方体。如果相机需要指向另一方向,则调用glRotatef()可以改变。
|
图8-4 视点坐标系与世界坐标系 |
2)模型变换。模型变换是在世界坐标系中进行的。在这个坐标系中,可以对物体实施平移glTranslatef()、旋转glRotatef()和放大缩小glScalef()。例子里只对物体进行比例变换,glScalef(sx, sy, sz)的三个参数分别是X、Y、Z轴向的比例变换因子。缺省时都为1.0,即物体没变化。程序中物体Y轴比例为2.0,其余都为1.0,就是说将立方体变成长方体。
3)投影变换。投影变换类似于选择相机的镜头。本例中调用了一个透视投影函数glFrustum(),在调用它之前先要用glMatrixMode()说明当前矩阵方式是投影GL_PROJECTION。这个投影函数一共有六个参数,由它们可以定义一个棱台似的视景体。即视景体内的部分可见,视景体外的部分不可见,这也就包含了三维裁剪变换。
4)视口变换。视口变换就是将视景体内投影的物体显示在二维的视口平面上。通常,都调用函数glViewport()来定义一个视口,这个过程类似于将照片放大或缩小。
总而言之,一旦所有必要的变换矩阵被指定后,场景中物体的每一个顶点都要按照被指定的变换矩阵序列逐一进行变换。注意:OpenGL中的物体坐标一律采用齐次坐标,即(x, y, z, w),故所有变换矩阵都采用4X4矩阵。一般说来,每个顶点先要经过视点变换和模型变换,然后进行指定的投影,如果它位于视景体外,则被裁剪掉。最后,余下的已经变换过的顶点x、y、z坐标值都用比例因子w除,即x/w、y/w、z/w,再映射到视口区域内,这样才能显示在屏幕上。
实际上,上述所说的视点变换和模型变换本质上都是一回事,即图形学中的几何变换。
只是视点变换一般只有平移和旋转,没有比例变换。当视点进行平移或旋转时,视点坐标系中的物体就相当于在世界坐标系中作反方向的平移或旋转。因此,从某种意义上讲,二者可以统一,只是各自出发点不一样而已。读者可以根据具体情况,选择其中一个角度去考虑,这样便于理解。
分享到:
相关推荐
在三维图形显示技术中,一个重要的方面是数据的体渲染(volume rendering)。Matlab结合Madagascar可以实现这种高级可视化技术。体渲染通过对数据体进行透明度和颜色的插值,形成深度感强烈的3D图像,揭示地震数据的...
而“三维图形”是指在计算机屏幕上通过数学算法和图形学技术构建的立体图像,广泛应用于游戏开发、可视化设计、工程仿真等多个领域。当汇编语言与三维图形结合时,我们可以创建出性能极佳且资源占用极低的图形程序。...
### VC++ 与OpenGL 混合编程实现三维图形处理 #### 一、引言 在现代工程设计、资源勘探等领域,计算机仿真技术扮演着极其重要的角色,尤其是在处理复杂地质条件及工艺结构时,需要利用数学模型建立三维立体图形...
本文将详细介绍如何在MFC环境下利用OpenGL开发三维图形应用,并通过一个具体的案例——三维动态球体模型——来演示整个开发流程。 #### 1. OpenGL与MFC的基础知识 **OpenGL简介** OpenGL是一种跨平台的高性能2D/...
8.1.2 三维图形显示流程 8.1.3 基本变换简单分析 8.2 几何变换 8.2.1 两个矩阵函数解释 8.2.2 平移 8.2.3 旋转 8.2.4 缩放和反射 8.2.5 几何变换举例 8.3 投影变换 8.3.1 正射投影 8.3.2 透视...
在本主题中,我们将探讨如何利用OpenGL来显示复杂的三维图形。OpenGL提供了一组丰富的图形绘制函数,使开发者能够构建出高质量、高性能的图形应用。 首先,OpenGL是一个基于向量图的API,它允许程序员创建复杂的...
本课程主要讲述了三维图形变换计算机游戏程序设计的基础知识,涵盖了向量、矩阵、平面、摄像机系统、视域、背面剔除、裁剪、颜色模型、显示器与缓冲区、绘制流程等内容。通过本课程的学习,学生将了解三维图形变换的...
OpenGL是一个跨语言、跨平台的编程接口,用于渲染高质量的二维和三维图形。在这个程序中,开发者可能利用OpenGL来创建和管理三维模型,以及实现光照效果。光照效果包括环境光、漫射光、镜面光等,通过调整光源位置、...
三维模型技术是计算机图形学领域的一个重要分支,它通过计算机技术构建和渲染出具有立体感的模型,用于实现虚拟环境的真实感展示。在飞行导航、城市规划、模拟演示、教育教学等领域,三维地图技术已经成为一种新兴的...
7.1 描述图元 7.1.1 齐次坐标 7.1.2 点 7.1.3 线 7.1.4 多边形 7.2 绘制图元 7.2.1 定义顶点 7.2.2 构造几何图元 第八章 OpenGL变换 8.1 从三维空间到二维平面 8.1.1 相机模拟 8.1.2 三维图形显示流程 ...
三维图形变换是计算机图形学中的核心概念,涉及如何在三维空间中表示、操作和呈现几何对象。本资料主要讲解了五个关键部分:三维几何变换、投影变换、三维观察、三维裁剪以及OpenGL中的三维图形变换。 在三维几何...
标题中的“ae三维显示”指的是使用Adobe After Effects(AE)的控件或接口在C#应用程序中实现三维可视化。在IT行业中,AE通常用于视频特效和动画制作,但这里的使用方式是将其集成到桌面应用中,展示地理空间数据,...
【计算机图形学实验】是IT领域中的一个重要学习环节,它涉及到计算机动画、三维图形显示流程等多个关键概念。本实验教案旨在帮助学生深入理解和实践这些概念。 首先,讲解了【双缓存系统】,这是在计算机图形学中...
计算机图形学是信息技术领域的一个重要分支,主要研究如何在计算机中表示、处理和显示图形。...在实际开发中,理解并熟练掌握三维管线的工作流程,能够帮助我们更高效地编写高性能的图形应用程序。
总的来说,分布式架构为协同系统中的三维图形渲染提供了解决方案,通过优化渲染和传输流程,提升了系统的整体效率和用户体验。随着硬件性能的不断提升和算法的不断改进,分布式架构在三维图形渲染领域的应用将更加...
8.1.2 三维图形显示流程 8.1.3 基本变换简单分析 8.2 几何变换 8.2.1 两个矩阵函数解释 8.2.2 平移 8.2.3 旋转 8.2.4 缩放和反射 8.2.5 几何变换举例 8.3 投影变换 8.3.1 正射投影 8.3.2 透视...
总的来说,这个项目提供了从图像到三维模型的完整流程,包括图像处理、特征匹配、三维重建以及模型可视化。对于学习和研究计算机视觉、图像处理和三维建模的爱好者来说,这是一个极好的实践案例。通过理解并运行这些...
三维图形程序设计是计算机科学中的一个重要分支,主要涉及利用计算机图形学原理来创建、操作和显示复杂的三维模型和场景。本课程将介绍三维图形的基本概念和技术,帮助学习者理解并掌握如何利用计算机生成和交互三维...