`
isiqi
  • 浏览: 16752836 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

用UBuntu开发OpenGL程序5

 
阅读更多

本文不少资料来自网络,经过我的整理加工,尽量在一篇文章中讲清楚一小部分程序需要的基本概念,下面是参考列表:
<<OpenGL教程>>
http://old.blog.edu.cn/user1/20928/archives/2007/1863585.shtml
http://blog.163.com/zhaoxin851055@126/blog/static/8112929820092116249704/
http://blog.csdn.net/firefly_liu/archive/2009/05/08/4160296.aspx

glutInitWindowPosition(0, 0);
设置窗口的起始位置,默认值为-1。

glutInitWindowSize(300, 300);
设置初始大小,单位是像素,默认值为300,该参数必须大于0

注意,上面两个函数是建议而不是强迫系统在指定的位置和用指定的尺寸创建窗口。所以,我们需要一种方法去判断真正的窗口位置和尺寸。下面这段话提供了答案:

The intent of the initial window position and size values is to provide a suggestion to the window system for a window's initial size and position. The window system is not obligated to use this information. Therefore, GLUT programs should not assume the window was created at the specified size or position. A GLUT program should use the window's reshape callback to determine the true size of the window.


glutCreateWindow("OpenGL 3D View");
创建顶层窗口,参数是窗口Name.该窗口将成为应用程序的当前窗口。创建成功的窗口显示状态为有效,但是还需要glutDisplayFunc函数才能真正显示出来。
返回>=1的整数,代表该窗口。

glutDisplayFunc(display);
设置绘图的回调函数,glut会自动判断是否需要调用该函数进行重新绘制,也可以通过函数glutPostRedisplay()强制通知glut重绘。


glClearColor(0.0, 0.0, 0.0, 0.0);设置清除色(也就是背景色)
四个参数实际上都是float类型,参数值范围是0和1之间,默认值为0。这个函数不能在glBegin和glEnd之间执行。
第四个参数是Alpha,代表透明度,0是完全透明,1是不透明。

glMatrixMode(GL_PROJECTION);
glOrtho(-5, 5, -5, 5, 5, 15);
glMatrixMode(GL_MODELVIEW);
gluLookAt(0, 0, 10, 0, 0, 0, 0, 1, 0);
这几个函数涉及到矩阵,三维到二维的变换知识。先介绍一下背景知识,然后再看这几个函数的用法。


在真实世界里,所有的物体都是三维的。但是,这些三维物体在计算机世界中却必须以二维平面物体的形式表现出来。那么,这些物体是怎样从三维变换到二维的呢?下面我们采用相机(Camera )模拟的方式来讲述这个概念,如图8-1所示。

实际上,从三维空间到二维平面,就如同用相机拍照一样,通常都要经历以下几个步骤 (括号内表示的是相应的图形学概念):
  第一步,将相机置于三角架上,让它对准三维景物(视点变换,Viewing Transformation )。
  第二步,将三维物体放在适当的位置(模型变换,Modeling Transformation )。
  第三步,选择相机镜头并调焦,使三维物体投影在二维胶片上(投影变换,Projection Transformation )。
  第四步,决定二维像片的大小(视口变换,Viewport Transformation )。
  这样,一个三维空间里的物体就可以用相应的二维平面物体表示了,也就能在二维的电脑屏幕上正确显示了。注意,上图中的投影是透视投影。

投影变换 相当于摄像机的调焦,包括正交投影和透视投影,区别在于:
正交投影,摄像机可以位于裁剪体内,也可以在外。所以near和far可以取两个正值或者一正一负。使用函数glOrtho。
透 视投影,摄像机不可以位于裁剪体内,所以near和far都必须去正值,使用函数glFrustum。它的参数矩阵定义了裁剪体以及投影的类型,但是未定 义摄像机的方位。摄像机位于原点,并面对Z轴的负方向。函数glFrustum只是修改了摄像机的透镜(焦距),并非位置。glFrustum对参数 far和near非常敏感,修改near和far则远景可能就影响很大,所以常用于观察近景。

真实世界里的物体都有三维坐标,称之为世界坐标系。世界坐标系以屏幕中心为原点(0, 0, 0)。你面对屏幕,你的右边是x正轴,上面是y正轴,屏幕指向你的为z正轴。 计算机屏幕采用一个二维坐标系。将世界坐标系中的物体绘制到屏幕坐标系,需要经过一系列步骤。





结合现在的知识,看看下面这段代码:
glMatrixMode(GL_PROJECTION);//glMatrixMode指定后续矩阵操作所使用的matrix stack。
glOrtho(-5, 5, -5, 5, 5, 15);
第一行指定矩阵操作的后续操作为投影变换(PROJECTION)。第二行将摄像机焦距的范围调在左右和下上各5个单位,并且能看到的最近的位置为5单位,最远的位置为15单位。


现在来看看另一个矩阵操作--模型视图(MODELVIEW)
MODELVIEW是在世界坐标系中进行的。在这个坐标系中,可以对观察目标实施平移glTranslatef()、旋转glRotatef()和放大缩小glScalef()。如果观察目标是立方体,其Y轴比例为2.0,其余都为1.0,就是说将立方体变成长方体。
下面这段代码使用了MODELVIEW
glMatrixMode(GL_MODELVIEW);
gluLookAt(0, 0, 10, 0, 0, 0, 0, 1, 0);

gluLookAt是glu库提供的辅助函数,设置视觉坐标系。在实际的编程应用中,用户在完成场景的建模后,往往需要选择一个合适的视角或者不停地变换视角,以对场景作观察。
gluLookAt(
摄像机x,摄像机y,摄像机z,
目标点x,目标点y,目标点z,
摄像机顶朝向x,摄像机顶朝向y,摄像机顶朝向z
)
所以gluLookAt(0, 0, 10, 0, 0, 0, 0, 1, 0) 让摄像机位于3D茶壶的正前方10单位距离观察。如果将10改为-10,则从3D茶壶的正后方看,下面是两个截图:

下面的函数绘制红色茶壶,首先用前面设置的清除色黑色(glClearColor(0.0, 0.0, 0.0, 0.0))清除色彩缓冲区,然后指定绘图颜色为红色,绘制一个相对尺寸为3的茶壶。最后强制渲染引擎绘图。
void display() {
glClear(GL_COLOR_BUFFER_BIT);

glColor3f(1.0, 0, 0);
glutWireTeapot(3);

glFlush();
}

注意glFlush函数返回不代表渲染引擎已经完成渲染(屏幕绘图完成)。


总 之,我的正前方有10单位远有一个尺寸为3的红色茶壶(茶壶位于坐标轴中心),我对相机的焦距进行了设置,使它能够看到正前方的一个长方体所包括的空间内 的景物:左5单位到右5单位的,下5单位到上5单位,我的正前方5单位到正前方15单位。茶壶刚好在这个范围内,所以,我看到了。


这一章开始涉及OpenGL的一些理论知识,目前还比较粗浅。计划后面章节开始增加矩阵方面的探讨。
欢迎大家提出意见,批评和建议。我写这一系列文章也是摸索着进行,如果有错误,随时修改。我的最终目的是开发一个包装OpenGL的开源C++库,可能需要若干年的时间。目前只打算研究Linux上的OpenGL应用,以后会测试Windows。

分享到:
评论

相关推荐

    用UBuntu开发OpenGL程序6 源代码

    本资源包含了一篇关于在Ubuntu上使用NetBeans 6.8开发OpenGL程序的文章,并附带了源代码,便于读者实践和学习。 首先,OpenGL是一个低级的图形库,它不关心窗口系统或用户输入,而是专注于图形渲染。这使得它在游戏...

    用UBuntu开发OpenGL程序8

    摄像头360度旋转示例 开发平台,UBuntu,NetBeans6.8

    ubuntu-Qt5.3-OpenGL-teapot

    在本文中,我们将深入探讨如何在Ubuntu操作系统上利用Qt 5.3框架开发OpenGL应用程序,以实现经典的“茶壶”(teapot)渲染。Qt是一个跨平台的应用程序开发框架,支持多种操作系统,包括Ubuntu,而OpenGL则是一个强大...

    ubuntu下用opengl绘制简单图像

    给定的代码片段是一个简单的OpenGL程序示例,展示了如何在Ubuntu环境下使用OpenGL绘制一个动态的、旋转的点集。以下是代码的关键部分解析: 1. **OpenGL状态设置**: - `glClear(GL_COLOR_BUFFER_BIT)`:清空颜色...

    ubuntu18.04 opengl开发源码(显示yuv)

    在Ubuntu 18.04上进行OpenGL开发,通常涉及到安装必要的开发环境、配置GLFW库以及处理视频数据,特别是YUV格式。YUV是一种常见的视频颜色空间,广泛应用于数字视频处理中。 首先,要开始Ubuntu 18.04上的OpenGL开发...

    linux-ubuntu-opengl-demo.zip

    5. **着色器**:OpenGL着色器是程序,它们运行在GPU上,负责计算像素的颜色和光照效果。有两种主要类型的着色器:顶点着色器(处理几何信息)和片段着色器(处理像素颜色)。GLSL(OpenGL Shading Language)用于...

    ubuntu下 qt5.5 利用opengl画3d坐标系

    在Ubuntu 16.04操作系统中,Qt 5.9.0是一个强大的跨平台应用程序开发框架,广泛用于创建图形用户界面。而OpenGL是一个开放源代码的图形库,专门用于生成2D、3D图像。在Qt中集成OpenGL,可以实现高性能的图形渲染。本...

    在Ubuntu Linux中设置OpenGL开发环境

    接下来,编写你的第一个OpenGL程序。通常,这将包括包含GL/glut头文件,定义窗口大小,主循环,以及渲染函数。例如,一个简单的“Hello, Triangle”程序可能会如下所示: ```cpp #include void display() { ...

    openGL开发所需glsl的封装glad.zip

    在Ubuntu系统中开发OpenGL程序时,通常会遇到一些必要的库和工具,其中glsl(OpenGL Shading Language)是编写着色器的重要语言,而glad则是用于加载和管理OpenGL函数指针的库。 标题中的"openGL开发所需glsl的封装...

    Opengl在vs下C#语言的环境配置+所需安装包

    通过以上步骤,你应该能够在Visual Studio环境下配置好OpenGL与C#的开发环境,开始编写和运行OpenGL应用程序。在开发过程中,记得查看OpenGL和OpenTK的官方文档,以及相关的教程和示例代码,这将极大地帮助你理解和...

    openGLES简单学习-demo

    openGLES在Android系统中广泛应用于游戏开发、图像处理和科学可视化等领域。 **3D图形基础** 在开始学习openGLES之前,我们需要了解一些3D图形的基本概念。3D空间是由三个轴组成的:X轴、Y轴和Z轴。每个物体可以由...

    基于opengl和GLSL的鱼眼全景图

    4. **纹理映射**:使用OpenGL的纹理映射功能,将全景图贴合到球体表面。这一步需要GLSL中的纹理采样指令,确保每个球面上的点都对应全景图上的正确位置。 5. **渲染与显示**:最后,OpenGL会将处理后的图像渲染到...

    openGL开发基本窗口库glfw-3.3.3.tar.gz

    在Ubuntu系统中,开发OpenGL程序时,通常需要一个库来帮助创建并管理窗口,这就是GLFW(OpenGL Function Wrapper)的作用。 GLFW是一个开源库,其最新版本为3.3.3,它为OpenGL提供了一个简洁、跨平台的API,用于...

    ubuntu13.04下qt5的安装及使用

    Ubuntu13.04下安装和使用Qt5的知识点主要包含以下几个方面: 1. **Ubuntu和Qt5的介绍**: - Ubuntu 13.04是Ubuntu操作系统的一个版本,它在软件开发领域被广泛使用。 - Qt是一个跨平台的C++图形用户界面应用程序...

    Ubuntu下Qt静态编译以及使用

    本文将详细介绍如何在 Ubuntu 系统下进行 Qt 的静态编译,并使用编译好的静态库来构建应用程序。 #### 二、为什么要进行 Qt 的静态编译? 通常情况下,Qt 提供的是动态链接库(Dynamic Link Libraries, DLLs),这...

    只需5积分的OPENGL的SOIL资源

    总之,这个“只需5积分的OPENGL的SOIL资源”为Ubuntu用户提供了方便快捷的方式来加载和管理OpenGL应用程序中的图像资源。通过简单的步骤,你可以在自己的项目中集成SOIL库,提升图形处理的效率和便利性。对于初学者...

    ubuntu20.04下QT安装

    在Ubuntu 20.04操作系统中安装QT开发环境是一个重要的步骤,对于任何希望使用Qt进行跨平台应用程序开发的开发者来说都是必要的。以下是一个详细且全面的指南,涵盖了从安装基础开发工具到设置Qt环境的整个过程。 ...

    ubuntu下使用SDL和FFmpeg进行播放视频文件和实时流媒体

    在Ubuntu操作系统中,使用SDL(Simple DirectMedia Layer)和FFmpeg库进行音视频播放和实时流媒体处理是一项常见的任务。这两个强大的开源工具为开发者提供了在Linux环境下构建多媒体应用的便捷途径。 SDL是一个跨...

    OpenGL实现离屏渲染(Offscreen Render),

    这个初级的OpenGL程序Demo就是围绕离屏渲染展开的,旨在帮助初学者理解这一概念。 在OpenGL中,通常的渲染流程是将图形绘制到默认的帧缓冲区,然后显示在屏幕上。离屏渲染则是在一个自定义的帧缓冲对象...

Global site tag (gtag.js) - Google Analytics