VC2005下利用OpenGL实现三维绘图

合集下载

采用OpenGL实现的三维游戏引擎设计与开发

采用OpenGL实现的三维游戏引擎设计与开发

采用OpenGL实现的三维游戏引擎设计与开发近年来,随着游戏产业的蓬勃发展,三维游戏引擎成为游戏开发领域的热门话题。

采用OpenGL实现的三维游戏引擎设计与开发,成为众多游戏开发者关注的焦点。

本文将深入探讨采用OpenGL实现的三维游戏引擎的设计与开发过程,带领读者一窥其奥秘。

一、三维游戏引擎概述三维游戏引擎是指用于开发三维游戏的软件框架,它提供了各种功能和工具,帮助开发者创建出高质量、逼真的三维游戏。

OpenGL作为一种跨平台的图形库,被广泛应用于三维游戏引擎的开发中。

采用OpenGL实现的三维游戏引擎具有良好的跨平台性和性能表现,因此备受开发者青睐。

二、OpenGL简介OpenGL(Open Graphics Library)是一种用于渲染2D、3D矢量图形的跨平台图形库。

它提供了一系列的函数接口,帮助开发者利用硬件加速来进行图形渲染。

OpenGL具有强大的图形处理能力和良好的跨平台性,适合用于开发各种类型的图形应用程序,尤其是三维游戏引擎。

三、三维游戏引擎设计1. 游戏引擎架构在设计三维游戏引擎时,首先需要考虑其架构设计。

一个典型的三维游戏引擎包括渲染引擎、物理引擎、场景管理器、资源管理器等模块。

渲染引擎负责处理图形渲染相关任务,物理引擎处理物体之间的碰撞和运动等物理效果,场景管理器负责管理游戏场景中的各种对象,资源管理器则负责加载和管理游戏所需的资源文件。

2. 图形渲染技术在采用OpenGL实现的三维游戏引擎中,图形渲染技术是至关重要的一环。

OpenGL提供了丰富的图形渲染功能,包括顶点着色器、片元着色器、纹理映射等功能。

通过合理地利用这些功能,可以实现出色彩丰富、逼真度高的画面效果。

3. 物理模拟技术除了图形渲染技术外,物理模拟技术也是三维游戏引擎不可或缺的一部分。

通过物理引擎模拟物体之间的碰撞、重力等物理效果,可以使得游戏更加真实和具有交互性。

在设计三维游戏引擎时,需要合理地集成物理模拟技术,以提升游戏体验。

基于OpenGL的三维图形绘制实验

基于OpenGL的三维图形绘制实验

基于OpenGL的三维图形绘制实验基于OpenGL的三维图形绘制实验⽬录实验题⽬:交互图形程序设计基础实验 (3)1.实验⽬的 (3)2.实验内容 (3)2.1 实验内容 (3)2.2 实验任务 (3)3.实验过程 (4)3.1 预处理 (4)3.3 主要函数说明 (5)3.4 过程描述 (6)3.5 运⾏截图 (7)4.实验结果 (7)5.实验体会 (7)实验题⽬:交互图形程序设计基础实验1.实验⽬的1)理解并掌握三维基本图形数据结构表⽰⽅法。

2)掌握编写OpenGL图形程序的基本⽅法.3)掌握OpenGL基本图形表⽰及绘制。

2.实验内容2.1 实验内容基于OpenGL的三维图形绘制实验⽬的是掌握图形信息的表⽰、数据的组织,在此基础上基于OpenGL绘制出三维图形。

实验内容包括OpenGL编程环境搭建、OpenGL程序结构、基本数据类型、核⼼函数等的使⽤;基本图形的绘制(点、线段、折线、闭合折线、多边形、三⾓形、三⾓扇、三⾓条带、四边形、四边形条带等)及图形属性控制(线宽、颜⾊、线型、填充样式等);对指定的若⼲三维模型进⾏建模、绘制,在⼀个程序框架下实现,提交1次程序,1份实验报告。

2.2 实验任务1、使⽤Visual C++建⽴⼀个单⽂档(SDI)程序,完成OpenGL绘制框架程序的设计。

在此基础上参照提供的资料,定义绘制函数,基于⾃定义的若⼲点坐标与颜⾊,分别绘制绘制点、线段、不闭合折线、闭合折线、多边形、三⾓形、四边形、三⾓扇、三⾓条带、四边形条带。

2、使⽤1中建⽴的程序框架,完成如下任务:(1)绘制正棱柱(底⾯多变形的边数及⾼度可以通过对话框输⼊)(2)正棱锥(底⾯多变形的边数及⾼度可以通过对话框输⼊)(3)正棱台(底⾯多变形的边数、台⾼、锥⾼可以通过对话框输⼊)注意模型坐标系的选择和顶点坐标的计算,每个图形的绘制单独写成函数。

加⼊菜单绘制三、四、五、六边的情况,其他边数情况从弹出对话框中输⼊参数,然后绘制。

opengl教程c语言版

opengl教程c语言版

OpenGL教程(c语言)1.第一课:说起编程作图,大概还有很多人想起TC的#include <graphics.h>吧?但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的?就靠TC那可怜的640*480分辨率、16色来做吗?显然是不行的。

本帖的目的是让大家放弃TC的老旧图形接口,让大家接触一些新事物。

OpenGL作为当前主流的图形API之一,它在一些场合具有比DirectX更优越的特性。

1、与C语言紧密结合。

OpenGL命令最初就是用C语言函数来进行描述的,对于学习过C语言的人来讲,OpenGL是容易理解和学习的。

如果你曾经接触过TC的graphics.h,你会发现,使用OpenGL作图甚至比TC更加简单。

2、强大的可移植性。

微软的Direct3D虽然也是十分优秀的图形API,但它只用于Windows系统(现在还要加上一个XBOX游戏机)。

而OpenGL不仅用于Windows,还可以用于Unix/Linux等其它系统,它甚至在大型计算机、各种专业计算机(如:医疗用显示设备)上都有应用。

并且,OpenGL的基本命令都做到了硬件无关,甚至是平台无关。

3、高性能的图形渲染。

OpenGL是一个工业标准,它的技术紧跟时代,现今各个显卡厂家无一不对OpenGL 提供强力支持,激烈的竞争中使得OpenGL性能一直领先。

总之,OpenGL是一个很NB的图形软件接口。

至于究竟有多NB,去看看DOOM3和QUAKE4等专业游戏就知道了。

OpenGL官方网站(英文)下面我将对Windows下的OpenGL编程进行简单介绍。

学习OpenGL前的准备工作第一步,选择一个编译环境现在Windows系统的主流编译环境有Visual Studio,Broland C++ Builder,Dev-C++等,它们都是支持OpenGL的。

但这里我们选择Visual Studio 2005作为学习OpenGL的环境。

opengl 原理

opengl 原理

opengl 原理OpenGL是一种图形编程接口,使得开发者可以利用硬件加速来绘制2D和3D图形。

它提供了一系列函数和状态机,使用C语言进行编程。

OpenGL的工作原理如下:1. 初始化:在使用OpenGL之前,需要先初始化OpenGL环境。

这包括创建图形上下文、加载图形驱动程序、设置显示设备等操作。

2. 设置状态:OpenGL使用一系列状态来控制绘制过程。

这些状态可以包括清除颜色缓冲区的颜色、设置深度测试、开启光照等。

开发者可以利用OpenGL提供的函数来设置这些状态。

3. 创建对象:在OpenGL中,开发者需要创建对象来表示物体或场景。

常用的对象包括顶点数组对象(Vertex Array Object,VAO)和顶点缓冲对象(Vertex Buffer Object,VBO)。

这些对象用于存储顶点数据、纹理坐标等信息。

4. 编写着色器:OpenGL使用着色器来控制顶点和片段(像素)的处理过程。

开发者需要编写顶点着色器和片段着色器,并将它们编译为可执行的着色器程序。

顶点着色器用于处理顶点数据,而片段着色器用于处理像素数据。

5. 绘制物体:在绘制物体之前,需要将顶点数据、纹理坐标等信息传递给OpenGL。

开发者可以使用VAO和VBO来管理这些数据。

然后,利用着色器程序和绘制命令(如glDrawArrays 和glDrawElements)来执行绘制操作。

6. 渲染:在绘制完成后,OpenGL会对图形进行渲染。

这包括执行光栅化过程(将几何图形转换为像素)和颜色插值等操作。

最终,渲染结果将会显示在屏幕上。

7. 清理:在使用完OpenGL之后,需要进行清理操作,释放资源。

这包括删除VAO和VBO对象、卸载着色器程序、关闭OpenGL环境等。

总结起来,OpenGL的工作原理涵盖了环境初始化、状态设置、对象创建、着色器编写、物体绘制、渲染和清理等步骤。

通过合理地利用这些步骤,开发者可以实现高效的图形编程。

基于OpenGL的三维动画效果设计与实现

基于OpenGL的三维动画效果设计与实现

基于OpenGL的三维动画效果设计与实现OpenGL是一种跨平台的图形库,广泛应用于计算机图形学、游戏开发和虚拟现实等领域。

在OpenGL的基础上,可以实现各种精美的三维动画效果,如逼真的光影效果、自然的物理模拟和华丽的特效等。

本文将介绍如何基于OpenGL实现三维动画效果。

一、OpenGL简介OpenGL(Open Graphics Library)是一种跨平台的图形库,可以用于开发高性能的3D图形应用程序。

它提供了一套标准的API,程序员可以使用OpenGL库里的函数来绘制各种图形,包括点、线、三角形等。

OpenGL的主要优点是跨平台,程序可以在不同的操作系统和硬件上运行,并且不需要对程序做太多的修改。

二、OpenGL开发环境在开始OpenGL开发之前,需要配置正确的开发环境。

OpenGL的开发环境包括编程语言、OpenGL库、窗口系统和OpenGL的开发工具等。

编程语言:OpenGL支持多种编程语言,如C/C++、Java、Python等。

其中,C/C++是最常用的开发语言,因为它可以直接调用OpenGL的函数库。

OpenGL库:OpenGL库是开发OpenGL程序时必须的工具,它包含了OpenGL 的所有函数和常量。

窗口系统:OpenGL需要一个可视化的窗口系统,用来显示图形界面。

常用的窗口系统有Windows、Linux和MacOS等。

开发工具:开发OpenGL程序需要使用各种IDE和编辑器,如Visual Studio、CodeBlocks和Eclipse等。

三、实现三维动画效果的基础知识1.三维坐标系OpenGL使用右手坐标系表示三维坐标系,其中x轴向右,y轴向上,z轴向外。

2.矩阵变换OpenGL可以通过矩阵变换来实现图形的移动、旋转、缩放等操作。

常用的变换矩阵包括平移矩阵、旋转矩阵和缩放矩阵。

3.光照模型光照模型是OpenGL中重要的概念之一,它用来计算光源对物体的影响。

其中,主要包括光源的位置、光线的颜色和强度等因素。

openGL三维网格坐标,旋转,缩放,灯光设置,纹理读取,模型读取(MFC单文档)

openGL三维网格坐标,旋转,缩放,灯光设置,纹理读取,模型读取(MFC单文档)

openGL三维网格坐标,旋转,缩放,灯光设置,纹理读取,模型读取(MFC单文档)在我的MFC单文档项目中enableview.h和enableview.cpp负责上面的窗口建立,myopenglview.h和myopenglView.cpp主要是功能的实现1.三维网格建立:void GLGrid(float pt1x, float pt1y, float pt1z, float pt2x, float pt2y, float pt2z, int num){const float _xLen = (pt2x - pt1x) / num;const float _yLen = (pt2y - pt1y) / num;const float _zLen = (pt2z - pt1z) / num; glLineWidth(2.f);glLineStipple(1, 0x0303);//线条样式glBegin(GL_LINES);glEnable(GL_LINE_SMOOTH);int xi = 0;int yi = 0;int zi = 0;//绘制平行于X的直线for (zi = 0; zi <= num; zi++){float z = _zLen * zi + pt1z;for (yi = 0; yi <= num; yi++){float y = _yLen * yi + pt1y;glVertex3f(pt1x, y, z);glVertex3f(pt2x, y, z);}}//绘制平行于Y的直线for (zi = 0; zi <= num; zi++){float z = _zLen * zi + pt1z;for (xi = 0; xi <= num; xi++){float x = _xLen * xi + pt1x;glVertex3f(x, pt1y, z);glVertex3f(x, pt2y, z);}}//绘制平行于Z的直线for (yi = 0; yi <= num; yi++){float y = _yLen * yi + pt1y;for (xi = 0; xi <= num; xi++){float x = _xLen * xi + pt1x;glVertex3f(x, y, pt1z);glVertex3f(x, y, pt2z);}}glEnd();}void CmyopenglView::ordination() {glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);glEnable(GL_BLEND);glEnable(GL_POINT_SMOOTH); //设置反走样glHint(GL_POINT_SMOOTH_HINT, GL_NICEST); //设置反走样glEnable(GL_LINE_SMOOTH);glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);glEnable(GL_POL YGON_SMOOTH);glHint(GL_POL YGON_SMOOTH_HINT, GL_NICEST);glRotatef(-45, 0.0, 1.0, 0.0);//网格glPushMatrix();glColor3f(0.9f, 0.9f, 0.9f);glTranslatef(-4, -4, -4);GLGrid(0,0,0,8,0,8,20);glPopMatrix();glPushMatrix();glTranslated(-4,4, -4);glRotatef(90, 1.0, 0.0, 0.0);glColor3f(0.9f, 0.9f, 0.0f);GLGrid(0, 0, 0, 8, 0, 8, 20);glPopMatrix();glPushMatrix();glTranslatef(-4, -4, -4);glRotatef(90, 0.0, 0.0, 1.0);glColor3f(0.0f, 0.9f, 0.0f);GLGrid(0, 0, 0, 8, 0, 8, 20);glPopMatrix();glDisable(GL_BLEND);glDisable(GL_LINE_SMOOTH);glDisable(GL_POINT_SMOOTH);glDisable(GL_POL YGON_SMOOTH);}我们在ordination()函数中增加绘制x,y,z坐标的代码void CmyopenglView::ordination() {glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);glEnable(GL_BLEND);glEnable(GL_POINT_SMOOTH); //设置反走样glHint(GL_POINT_SMOOTH_HINT, GL_NICEST); //设置反走样glEnable(GL_LINE_SMOOTH);glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);glEnable(GL_POL YGON_SMOOTH);glHint(GL_POL YGON_SMOOTH_HINT, GL_NICEST);glRotatef(-45, 0.0, 1.0, 0.0);//网格glPushMatrix();glColor3f(0.9f, 0.9f, 0.9f);glTranslatef(-4, -4, -4);GLGrid(0,0,0,8,0,8,20);glPopMatrix();glPushMatrix();glTranslated(-4,4, -4);glRotatef(90, 1.0, 0.0, 0.0);glColor3f(0.9f, 0.9f, 0.0f);GLGrid(0, 0, 0, 8, 0, 8, 20);glPopMatrix();glPushMatrix();glTranslatef(-4, -4, -4);glRotatef(90, 0.0, 0.0, 1.0);glColor3f(0.0f, 0.9f, 0.0f);GLGrid(0, 0, 0, 8, 0, 8, 20);glPopMatrix();//x//glTranslatef(-2, -2, -2);glColor3f(1.0f, 0.0f, 0.0f);glBegin(GL_LINES);glVertex3f(0.0f, 0.0f, 0.0f);glVertex3f(3.5, 0.0f, 0.0f);glEnd();glPushMatrix();glTranslatef(3.5, 0.0f, 0.0f);glRotatef(90.0f, 0.0f, 1.0f, 0.0f);glutWireCone(0.027, 0.09, 10, 10);glPopMatrix();//yglColor3f(0.0f, 1.0f, 0.0f);glBegin(GL_LINES);glVertex3f(0.0f, 0.0f, 0.0f);glVertex3f(0.0, 3.5, 0.0f);glEnd();glPushMatrix();glTranslatef(0.0, 3.5, 0.0f);glRotatef(90.0f, -1.0f, 0.0f, 0.0f);glutWireCone(0.027, 0.09, 10, 10);glPopMatrix();//zglColor3f(0.0f, 0.0f, 1.0f);glBegin(GL_LINES);glVertex3f(0.0f, 0.0f, 0.0f);glVertex3f(0.0, 0.0f, 3.5);glEnd();glPushMatrix();glTranslatef(0.0, 0.0f, 3.5);glRotatef(90.0f, 0.0f, 0.0f, 1.0f);glutWireCone(0.027, 0.09, 10, 10);glPopMatrix();glDisable(GL_BLEND);glDisable(GL_LINE_SMOOTH);glDisable(GL_POINT_SMOOTH);glDisable(GL_POL YGON_SMOOTH); }、2.基本三维图形创建点模型/线模型/面模型glColor3f(1.0f, 1.0f, 1.0f);if (model == 1){if (type == 1)glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);if (type == 2)glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);if (type == 3)glPolygonMode(GL_FRONT_AND_BACK, GL_POINT);auxSolidCube(4);}if (model == 2){if (type == 1)glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);if (type == 2)glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);if(type == 3)glPolygonMode(GL_FRONT_AND_BACK, GL_POINT);auxSolidSphere(3.0);}if (model == 3){glPushMatrix();glRotatef(90, -1.0, 0.0, 0.0);if (type == 1)glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);if (type == 2)glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);if (type == 3)glPolygonMode(GL_FRONT_AND_BACK, GL_POINT);glutSolidCone(3, 3, 100, 100);glPopMatrix();}if (model == 4){if (type == 1)glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);if (type == 2)glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);if (type == 3)glPolygonMode(GL_FRONT_AND_BACK, GL_POINT);glutSolidTeapot(2.5);}3.鼠标相应旋转缩放BOOL enableview::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt){// TODO: 在此添加消息处理程序代码和/或调用默认值double a = zDelta / 120;if ((scale + a * 0.1) < 10)scale += a * 0.1;this->InvalidateRect(NULL, FALSE);return CView::OnMouseWheel(nFlags, zDelta, pt);}void enableview::OnMouseMove(UINT nFlags, CPoint point){// TODO: 在此添加消息处理程序代码和/或调用默认值if (nFlags & MK_LBUTTON == TRUE) {//MessageBox("mouse move function triggered!", "attentino", MB_OK);du += point.x - oldmx; //鼠标在窗口x轴方向上的增量加到视点绕y轴的角度上,这样就左右转了h += 0.03f*(point.y - oldmy); //鼠标在窗口y轴方向上的改变加到视点的y坐标上,就上下转了if (h>15.0f) h = 15.0f; //视点y坐标作一些限制,不会使视点太奇怪else if (h<-5.0f) h = -5.0f;oldmx = point.x, oldmy = point.y; //把此时的鼠标坐标作为旧值,为下一次计算增量做准备/*CString debug;debug.Format(_T("h,du= %0.3f %3d\n"), h, du);OutputDebugString(debug);*///OnPaint();this->OnDraw(this->GetDC()); //重绘界面}else if (nFlags & MK_RBUTTON == TRUE){oldmx += point.x - oldmx;oldmy += point.y - oldmy;glTranslatef(oldmx, oldmy, -0.1f);this->OnDraw(this->GetDC());oldmx = point.x, oldmy = point.y;}else {oldmx = point.x, oldmy = point.y;//OutputDebugString(_T("mouse up\n"));}//CView::OnMouseMove(nFlags, point);}4.键盘相应旋转缩放BOOL CmyopenglView::PreTranslateMessage(MSG* pMsg){if (pMsg->message == WM_KEYDOWN) // If a keydown message{if (pMsg->wParam == _T('W')){this->rotate_x += 6.0;if (this->rotate_x > 360)this->rotate_x = -360;this->InvalidateRect(NULL, FALSE);}if (pMsg->wParam == _T('X')){this->rotate_x += 6.0;if (this->rotate_x < -360)this->rotate_x = 360;this->InvalidateRect(NULL, FALSE);}if (pMsg->wParam == _T('A')){this->rotate_y -= 6.0;if (this->rotate_y < -360)this->rotate_y = 360;this->InvalidateRect(NULL, FALSE);}if (pMsg->wParam == _T('D')){this->rotate_y += 6.0;if (this->rotate_y > 360)this->rotate_y = -360;this->InvalidateRect(NULL, FALSE);}if (pMsg->wParam == _T('Z')){this->rotate_z -= 6.0;if (this->rotate_z < -360)this->rotate_z = 360;this->InvalidateRect(NULL, FALSE);}if (pMsg->wParam == _T('E')){this->rotate_z += 6.0;if (this->rotate_z > 360)this->rotate_z = -360;this->InvalidateRect(NULL, FALSE);}if (pMsg->wParam == _T('Q')){if ((scale + 2) < 10)scale += 2;this->InvalidateRect(NULL, FALSE);}if (pMsg->wParam == _T('R')){scale -= 2;this->InvalidateRect(NULL, FALSE);}}return CView::PreTranslateMessage(pMsg);}5.灯光设置:单方位灯光/多方位光/多种类型光效果// 设置材质颜色GLfloat mat_ambient[] = { 0.6f, 0.6f, 0.6f, 1.0f }; // 蓝色的材质环境光GLfloat mat_diffuse[] = { 0.6f, 0.6f, 0.9f, 1.0f }; // 蓝色的材质漫反射光GLfloat mat_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f }; // 全白色的材质镜面反射光GLfloat mat_emission[] = { 0.5f, 0.5f, 0.5f, 1.0f }; // 淡白色的材质辐射光GLfloat no_mat[] = { 0.0f, 0.0f, 0.0f, 1.0f }; // 无光(黑色光),用于关闭某种属性光时应用GLfloat no_shininess[] = { 0.0f }; // 无镜面反射GLfloat low_shininess[] = { 5.0f }; // 低镜面反射指数GLfloat high_shininess[] = { 70.0f }; // 高镜面反射指数void CmyopenglView::InitalLigt(){GLfloat light_position1[4] = { -52, -16, -50, 0 };GLfloat light_position2[4] = { -26, -48, -50, 0 };GLfloat light_position3[4] = { 16, -52, -50, 0 };GLfloat direction1[3] = { 52, 16, 50 };GLfloat direction2[3] = { 26, 48, 50 };GLfloat direction3[3] = { -16, 52, 50 };GLfloat light_position4[4] = { 52, 16, 50, 0 };GLfloat light_position5[4] = { 26, 48, 50, 0 };GLfloat light_position6[4] = { -16, 52, 50, 0 };GLfloat direction4[3] = { -52, -16, -50 };GLfloat direction5[3] = { -26, -48, -50 };GLfloat direction6[3] = { 16, -52, -50 };GLfloat color1[4], color2[4], color3[4], color4[4], color5[4], color6[4];glClearColor(1, 1, 1, 0);glEnable(GL_DEPTH_TEST);glDepthFunc(GL_LESS);if (color_type == 0) { //彩色灯光color1[0] = 1; color1[1] = 0; color1[2] = 0; color1[3] = 1;color2[0] = 0.5; color2[1] = 1; color2[2] = 0; color2[3] = 1;color3[0] = 0; color3[1] = 0; color3[2] = 1; color3[3] = 1;color4[0] = 1; color4[1] = 0; color4[2] = 0; color4[3] = 1;color5[0] = 0.5; color5[1] = 1; color5[2] = 0; color5[3] = 1;color6[0] = 0; color6[1] = 0; color6[2] = 1; color6[3] = 1;GLfloat ambient[4] = { 0.3f, 0.3f, 0.3f, 1.0f };GLfloat material_color[4] = { 1, 1, 1, 0.5f };GLfloat material_specular[4] = { 0.5f, 0.5f, 0.5f, 0.5f };GLfloat material_ambient[4] = { 0.0, 0.0, 0.0, 0.0 };glLightfv(GL_LIGHT3, GL_POSITION, light_position4);glLightfv(GL_LIGHT3, GL_SPOT_DIRECTION, direction4);glLightfv(GL_LIGHT3, GL_DIFFUSE, color4);glLightfv(GL_LIGHT3, GL_SPECULAR, color4);glLightfv(GL_LIGHT4, GL_POSITION, light_position5);glLightfv(GL_LIGHT4, GL_SPOT_DIRECTION, direction5);glLightfv(GL_LIGHT4, GL_DIFFUSE, color5);glLightfv(GL_LIGHT4, GL_SPECULAR, color5);glLightfv(GL_LIGHT5, GL_POSITION, light_position6);glLightfv(GL_LIGHT5, GL_SPOT_DIRECTION, direction6);glLightfv(GL_LIGHT5, GL_DIFFUSE, color6);glLightfv(GL_LIGHT5, GL_SPECULAR, color6);glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient);glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, material_specular);glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, material_color);glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, material_ambient);glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 128);glDisable(GL_LIGHT0);glDisable(GL_LIGHTING);glEnable(GL_LIGHTING);glEnable(GL_LIGHT3);glEnable(GL_LIGHT4);glEnable(GL_LIGHT5);glDisable(GL_COLOR_MATERIAL);return;}if (color_type == 1){//白色灯光glDisable(GL_LIGHT3);glDisable(GL_LIGHT4);glDisable(GL_LIGHT5);glDisable(GL_LIGHTING);GLfloat m_LightPostion[4] = { 0.0f, 10.0f, 10.0f, 1.0f };GLfloat ambientLight[] = { 0.25f, 0.25f, 0.25f, 1.0f };GLfloat diffuseLight[] = { 0.5, 0.5f, 0.5f, 1.0f };GLfloat specularLight[] = { 0.5f, 0.5f, 0.5f, 1.0f };glEnable(GL_LIGHTING);glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientLight);glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight);glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight);glLightfv(GL_LIGHT0, GL_SPECULAR, specularLight);glLightfv(GL_LIGHT0, GL_POSITION, m_LightPostion);glEnable(GL_LIGHT0);glEnable(GL_COLOR_MATERIAL);glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);}else {glDisable(GL_LIGHT3);glDisable(GL_LIGHT4);glDisable(GL_LIGHT5);glDisable(GL_LIGHTING);glDisable(GL_COLOR_MATERIAL);glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);//glDisable(GL_LIGHTING);GLfloat no_ambientLight[] = { 0.0f, 0.0f, 0.0f, 1.0f }; // 用于关掉默认的全局环境光// 设置光源的颜色GLfloat ambientLight[] = { 0.8f, 0.8f, 0.8f, 1.0f }; // 白色环境光GLfloat diffuseLight[] = { 0.8f, 0.8f, 0.8f, 1.0f }; // 白色漫射光GLfloat specularLight[] = { 0.8f, 0.8f, 0.8f, 1.0f }; // 白色镜面反射光GLfloat m_LightPostion[] = { 0.0f, 0.0f, 1.0f, 0.0f }; // 光源起始位置// 1.仅漫射光if (color_type == 12) {glEnable(GL_LIGHTING);//glLightModelfv(GL_LIGHT_MODEL_AMBIENT, no_ambientLight); // 关掉默认的全局环境光glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientLight);glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight);glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight);glLightfv(GL_LIGHT0, GL_SPECULAR, specularLight);glLightfv(GL_LIGHT0, GL_POSITION, m_LightPostion);glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat); // 关闭材质的环境反射光颜色glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); // 设置mat_diffuse的材质漫反射光glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat); //关闭材质的镜面反射光颜色glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess); // 设置材质的镜面反射指数为0glMaterialfv(GL_FRONT, GL_EMISSION, no_mat); // 关闭材质的辐射光glEnable(GL_LIGHT0);}// 2.仅镜面光if (color_type == 13) {glEnable(GL_LIGHTING);//glLightModelfv(GL_LIGHT_MODEL_AMBIENT, no_ambientLight); // 关掉默认的全局环境光glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientLight);glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight);glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight);glLightfv(GL_LIGHT0, GL_SPECULAR, specularLight);glLightfv(GL_LIGHT0, GL_POSITION, m_LightPostion);glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat);glMaterialfv(GL_FRONT, GL_DIFFUSE, no_mat);glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);glMaterialfv(GL_FRONT, GL_SHININESS, low_shininess);glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);glEnable(GL_LIGHT0);}// 3.漫射光与低镜面光if (color_type == 16) {glEnable(GL_LIGHTING);glLightModelfv(GL_LIGHT_MODEL_AMBIENT, no_ambientLight); // 关掉默认的全局环境光glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientLight);glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight);glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight);glLightfv(GL_LIGHT0, GL_SPECULAR, specularLight);glLightfv(GL_LIGHT0, GL_POSITION, m_LightPostion);glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat);glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);glMaterialfv(GL_FRONT, GL_SHININESS, low_shininess);glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);glEnable(GL_LIGHT0);}// 4.辐射光与低镜面光if (color_type == 18) {glEnable(GL_LIGHTING);glLightModelfv(GL_LIGHT_MODEL_AMBIENT, no_ambientLight); // 关掉默认的全局环境光glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientLight);glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight);glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight);glLightfv(GL_LIGHT0, GL_SPECULAR, specularLight);glLightfv(GL_LIGHT0, GL_POSITION, m_LightPostion);glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat);glMaterialfv(GL_FRONT, GL_DIFFUSE, no_mat);glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);glMaterialfv(GL_FRONT, GL_SHININESS, low_shininess);glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);glEnable(GL_LIGHT0);}}}6.纹理载入映射BOOL CmyopenglView::LoadImageResources() {FILE *File = NULL;AUX_RGBImageRec* textrue_Resource[6];if (model == 5 && type == 51)resource_path[0] = "shuijing.bmp";if(model == 5 && type == 52 )resource_path[0] = "earth.bmp";if (model == 5 && type == 53)resource_path[0] = "painting1.bmp";if (model == 5 && type == 54)resource_path[0] = "5.bmp";/*resource_path[1] = "image/2.bmp";resource_path[2] = "image/3.bmp";resource_path[3] = "image/4.bmp";resource_path[4] = "image/5.bmp";resource_path[5] = "image/6.bmp";*///装载图像文件资源for (int i = 0; i < 6; i++)//如果只需要一张贴图其实resource_path数组只需要一个元素就可以了{File = fopen(resource_path[0], "r");if (!File){//MessageBox(NULL, "加载图像资源文件失败!", "Fail", MB_OK);return FALSE;}fclose(File);CString str = CString(resource_path[0]);USES_CONVERSION;LPCWSTR wszClassName = A2CW(W2A(str));textrue_Resource[i] = auxDIBImageLoad(wszClassName);File = NULL;}//生成纹理glGenTextures(6, texture);for (int i = 0; i < 6; i++){glBindTexture(GL_TEXTURE_2D, texture[i]);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);//Use the mipmap textureglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, \textrue_Resource[i]->sizeX, textrue_Resource[i]->sizeY, \GL_RGB, GL_UNSIGNED_BYTE, textrue_Resource[i]->data);//删除堆上的临时图像delete textrue_Resource[i]->data;delete textrue_Resource[i];}return TRUE;}void CmyopenglView::Draw_textrue() {GLUquadricObj* qobj;glClearColor(0.0, 0.0, 0.0, 0.0);glShadeModel(GL_FLAT);glEnable(GL_DEPTH_TEST);glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);InitalLigt(); ///初始化光照信息glEnable(GL_TEXTURE_2D);glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);glPushMatrix();glTranslatef(0.0f, 0.0f, scale); //滚轮缩放gluLookAt(r*cos(c*du), h, r*sin(c*du), 0, 0, 0, 0, 1, 0); //从视点看远点,y轴方向(0,1,0)是上方向,鼠标拖动glRotatef(this->rotate_x, 1.0, 0.0, 0.0);glRotatef(this->rotate_y, 0.0, 1.0, 0.0);glRotatef(this->rotate_z, 0.0, 0.0, 1.0);if (iao)ordination();glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);qobj = gluNewQuadric();//画球体glBindTexture(GL_TEXTURE_2D, texture[0]);glEnable(GL_TEXTURE_2D);gluQuadricTexture(qobj, GL_TRUE);//纹理函数if (type == 51){glBegin(GL_QUADS);// Front FaceglTexCoord2f(0.0f, 0.0f); glVertex3f(-3.0f, -3.0f, 3.0f);glTexCoord2f(1.0f, 0.0f); glVertex3f(3.0f, -3.0f, 3.0f);glTexCoord2f(1.0f, 1.0f); glVertex3f(3.0f, 3.0f, 3.0f);glTexCoord2f(0.0f, 1.0f); glVertex3f(-3.0f, 3.0f, 3.0f);// Back FaceglTexCoord2f(0.0f, 0.0f); glVertex3f(-3.0f, -3.0f, -3.0f);glTexCoord2f(1.0f, 0.0f); glVertex3f(-3.0f, 3.0f, -3.0f);glTexCoord2f(1.0f, 1.0f); glVertex3f(3.0f, 3.0f, -3.0f);glTexCoord2f(0.0f, 1.0f); glVertex3f(3.0f, -3.0f, -3.0f);// Top FaceglTexCoord2f(0.0f, 0.0f); glVertex3f(-3.0f, 3.0f, -3.0f);glTexCoord2f(1.0f, 0.0f); glVertex3f(-3.0f, 3.0f, 3.0f);glTexCoord2f(1.0f, 1.0f); glVertex3f(3.0f, 3.0f, 3.0f);glTexCoord2f(0.0f, 1.0f); glVertex3f(3.0f, 3.0f, -3.0f);// Bottom FaceglTexCoord2f(0.0f, 0.0f); glVertex3f(-3.0f, -3.0f, -3.0f);glTexCoord2f(1.0f, 0.0f); glVertex3f(3.0f, -3.0f, -3.0f);glTexCoord2f(1.0f, 1.0f); glVertex3f(3.0f, -3.0f, 3.0f);glTexCoord2f(0.0f, 1.0f); glVertex3f(-3.0f, -3.0f, 3.0f);// Right faceglTexCoord2f(0.0f, 0.0f); glVertex3f(3.0f, -3.0f, -3.0f);glTexCoord2f(1.0f, 0.0f); glVertex3f(3.0f, 3.0f, -3.0f);glTexCoord2f(1.0f, 1.0f); glVertex3f(3.0f, 3.0f, 3.0f);glTexCoord2f(0.0f, 1.0f); glVertex3f(3.0f, -3.0f, 3.0f);// Left FaceglTexCoord2f(0.0f, 0.0f); glVertex3f(-3.0f, -3.0f, -3.0f);glTexCoord2f(1.0f, 0.0f); glVertex3f(-3.0f, -3.0f, 3.0f);glTexCoord2f(1.0f, 1.0f); glVertex3f(-3.0f, 3.0f, 3.0f);glTexCoord2f(0.0f, 1.0f); glVertex3f(-3.0f, 3.0f, -3.0f);glEnd();}if( type == 52 )gluSphere(qobj, 4, 60, 60);//二次曲面qobjif( type == 53 )gluCylinder(qobj, 3.5, 3.5, 6, 26, 23);if( type == 54 )gluCylinder(qobj, 3.5, 0.0, 6, 26, 23);glPopMatrix();glDisable(GL_TEXTURE_2D);}6.读取obj模型我只是简单的读取vt,vn,f等基本参数void CmyopenglView::ReadObj(char* Filename) {VN.clear();V.clear();VT.clear();F.clear();FQ.clear();ifstream in(Filename);string aline; //逐行读入string erase;while (getline(in, aline)){if (aline[0] == 'v'){if (aline[1] == 'n') //vn{istringstream sin(aline);V ertex v;sin >> erase >> v.x >> v.y >> v.z;VN.push_back(v);}else if (aline[1] == 't')//vt{istringstream sin(aline);Texture v;sin >> erase >> v.s >> v.t;VT.push_back(v);}else //v{istringstream sin(aline);V ertex v;sin >> erase >> v.x >> v.y >> v.z;V.push_back(v);}}else if (aline[0] == 'f'){istringstream sin(aline);sin >> erase;vector<string> strvector;string temp;while (sin >> temp) {strvector.push_back(temp);}if (strvector.size() == 3) {//三角面片Face fff;for (int count = 0; count < 3; count++) {string kkk = strvector[count];int i = 0;int num = 0;//顶点索引for (; i < kkk.size() && kkk[i] != '/'; i++)num = num * 10 + kkk[i] - '0';fff.v[count] = num;i++;num = 0;//vtnum = 0;for (; i < kkk.size() && kkk[i] != '/'; i++)num = num * 10 + kkk[i] - '0';fff.vt[0] = num;i++;num = 0;//法向量索引for (; i < kkk.size() && kkk[i] != '/'; i++)num = num * 10 + kkk[i] - '0';fff.vn[count] = num;}F.push_back(fff);}else if (strvector.size() == 4){FaceQ fff;for (int count = 0; count < strvector.size(); count++) { string kkk = strvector[count];int i = 0;int num = 0;//顶点索引for (; i < kkk.size() && kkk[i] != '/'; i++)num = num * 10 + kkk[i] - '0';fff.v[count] = num;i++;num = 0;//vtnum = 0;for (; i < kkk.size() && kkk[i] != '/'; i++)num = num * 10 + kkk[i] - '0';fff.vt[0] = num;i++;num = 0;//法向量索引for (; i < kkk.size() && kkk[i] != '/'; i++)num = num * 10 + kkk[i] - '0';fff.vn[count] = num;}FQ.push_back(fff);}}}}绘制obj模型:void CmyopenglView::OnReadobj(){model = 6;wchar_t filters[] =L"3D模型文件(*.obj)\|*.obj|所有文件(*.*)|*.*||";CFileDialog fileDlg(TRUE, NULL, NULL,OFN_HIDEREADONL Y, filters);if (fileDlg.DoModal() == IDOK){CString strBuf = fileDlg.GetPathName();USES_CONVERSION;char *Filename = T2A(strBuf.GetBuffer(0));ReadObj(Filename);}stringstream ss;ss <<"OK!";string str;ss >> str;CString s;s = str.c_str();MessageBox(s);float min_x, min_y, min_z, max_x, max_y, max_z;min_x = min_y = min_z = 10000000;max_x = max_y = max_z = -1000000;for (int i = 0; i < V.size(); i++){min_x = min(min_x, V[i].x);min_y = min(min_y, V[i].y);min_z = min(min_z, V[i].z);max_x = max(max_x, V[i].x);max_y = max(max_y, V[i].y);max_z = max(max_z, V[i].z);}worldx = (min_x + max_x) / 2;worldy = (min_y + max_y) / 2;worldz = (min_z + max_z) / 2;type = 1;Invalidate();CDC* ppDC = GetWindowDC();OnDrawGL(ppDC);// TODO: 在此添加命令处理程序代码}void CmyopenglView::Draw_obj(){if (type == 1) {if (!VN.empty()) {for (int i = 0; i < F.size(); i++) {glBegin(GL_LINE_LOOP);for (int j = 0; j < 3; j++) {glV ertex3f(V[F[i].v[j] - 1].x, V[F[i].v[j] - 1].y, V[F[i].v[j] - 1].z);}glEnd();}for (int i = 0; i < FQ.size(); i++) {glBegin(GL_LINE_LOOP);for (int j = 0; j < 4; j++) {glV ertex3f(V[FQ[i].v[j] - 1].x, V[FQ[i].v[j] - 1].y, V[FQ[i].v[j] - 1].z);}glEnd();}}else {for (int i = 0; i < F.size(); i++) {glBegin(GL_LINE_LOOP);for (int j = 0; j < 3; j++) {glV ertex3f(V[F[i].v[j] - 1].x, V[F[i].v[j] - 1].y, V[F[i].v[j] - 1].z);}glEnd();}for (int i = 0; i < FQ.size(); i++) {glBegin(GL_LINE_LOOP);for (int j = 0; j < 4; j++) {glV ertex3f(V[FQ[i].v[j] - 1].x, V[FQ[i].v[j] - 1].y, V[FQ[i].v[j] - 1].z);}glEnd();}}}else if (type == 3) {glBegin(GL_POINTS);for (int i = 0; i < V.size(); i++)glV ertex3f(V[i].x, V[i].y, V[i].z);glEnd();}else{if (!VN.empty()) {for (int i = 0; i < F.size(); i++) {glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);glBegin(GL_TRIANGLES);for (int j = 0; j < 3; j++) {glNormal3f(VN[F[i].vn[j] - 1].x, VN[F[i].vn[j] - 1].y, VN[F[i].vn[j] - 1].z);glV ertex3f(V[F[i].v[j] - 1].x, V[F[i].v[j] - 1].y, V[F[i].v[j] - 1].z);}glEnd();}for (int i = 0; i < FQ.size(); i++) {glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);glBegin(GL_QUADS);for (int j = 0; j < 4; j++) {glNormal3f(VN[FQ[i].vn[j] - 1].x, VN[FQ[i].vn[j] - 1].y, VN[FQ[i].vn[j] - 1].z);glV ertex3f(V[FQ[i].v[j] - 1].x, V[FQ[i].v[j] - 1].y, V[FQ[i].v[j] - 1].z);}glEnd();}}else{for (int i = 0; i < F.size(); i++) {glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);glBegin(GL_TRIANGLES);for (int j = 0; j < 3; j++) {glV ertex3f(V[F[i].v[j] - 1].x, V[F[i].v[j] - 1].y, V[F[i].v[j] - 1].z);}glEnd();}for (int i = 0; i < FQ.size(); i++) {glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);glBegin(GL_QUADS);for (int j = 0; j < 4; j++) {glV ertex3f(V[FQ[i].v[j] - 1].x, V[FQ[i].v[j] - 1].y, V[FQ[i].v[j] - 1].z);}glEnd();}}}}。

C语言实现OpenGL渲染

C语言实现OpenGL渲染

C语言实现OpenGL渲染OpenGL是一种强大的图形渲染API(应用程序接口),它可用于创建高性能的2D和3D图形应用程序。

在本文中,我们将探讨如何使用C语言实现OpenGL渲染。

1. 初始化OpenGL环境在开始之前,我们需要初始化OpenGL环境。

这可以通过以下步骤完成:1.1. 创建窗口使用C语言中的窗口创建库(如GLUT或GLFW)创建一个可见的窗口。

这个窗口将充当我们OpenGL渲染的目标。

1.2. 设置视口使用glViewport函数将窗口的尺寸设置为需要进行渲染的大小。

视口定义了OpenGL将渲染的区域。

1.3. 创建正交投影或透视投影矩阵使用glOrtho或gluPerspective函数创建透视或正交投影矩阵。

投影矩阵将定义OpenGL渲染的视图。

2. 渲染基本图形一旦我们初始化了OpenGL环境,我们可以开始渲染基本图形。

以下是一些常见的基本图形渲染函数:2.1. 绘制点使用glBegin和glEnd函数,以及glVertex函数,可以绘制一个或多个点。

2.2. 绘制线段使用glBegin和glEnd函数,以及glVertex函数,可以绘制一条或多条线段。

2.3. 绘制三角形使用glBegin和glEnd函数,以及glVertex函数,可以绘制一个或多个三角形。

2.4. 绘制多边形使用glBegin和glEnd函数,以及glVertex函数,可以绘制一个或多个多边形。

3. 设置光照效果为了给渲染的图形添加逼真感,可以设置光照效果。

以下是一些常见的光照函数:3.1. 设置光源使用glLight函数,可以设置光源的位置、光照颜色等参数。

3.2. 设置材质属性使用glMaterial函数,可以设置渲染对象的表面材质属性,如漫反射、镜面反射等。

3.3. 使用光照模型使用glShadeModel函数,可以选择光照模型,如平滑光照模型或平面光照模型。

4. 纹理映射纹理映射能够使渲染的图形更逼真。

基于OpenGL的三维图形ActiveX控件开发及其应用研究

基于OpenGL的三维图形ActiveX控件开发及其应用研究

基于OpenGL 的三维图形ActiveX 控件开发及其应用研究张 琦 孙 伟摘要 基于OpenGL 的三维图形ActiveX 控件的开发方法和应用实例,开发出的三维图形控件在数控机床、加工中心等现代制造设备的远程故障诊断系统中得到了较好的应用,并可广泛地应用于3D-CAD 软件开发及产品远程发布等其他方面。

关键词:OpenGL 三维图形 ActiveX 控件 远程故障诊断中图分类号:TP391 文献标识码:A 文章编号:1671—3133(2005)07—0086—04Development and application research of 3D graphics ActiveX control based on OpenGLZhang Oi ,Sun WeiAbstract Researches the deveIopment method and appIications of 3D graphics ActiveX controI based on OpenGL.The deveIoped 3D graphics ActiveX controIs have been weII used in the remote diagnosis system ,and it may aIso be used in the deveIopment of 3D -CAD software ,and remote teaching ,remote product reIease and many other aspects.Key words :OpenGL 3D graphics ActiveX controls Remote diagnosisActiveX 是以微软COM 模型为理论基础建立起来的技术,它的前身是微软的OLE 技术。

ActiveX 控件是ActiveX 技术中最基本和最重要的成员之一,是一种可以插入到网页或其他应用程序中进行重用的软件部件。

中国传媒大学数字媒体技术教案

中国传媒大学数字媒体技术教案

目录《Direct3D编程》教学大纲(106001) (1)《互动业务系统设计》教学大纲(106002) (3)《计算机图形学》教学大纲(106003) (5)《计算机网络协议基础》教学大纲(106004) (8)《计算机组成与设计》教学大纲(106005) (11)《媒体内容安全技术》教学大纲(106006) (13)《媒体网络规划与设计》教学大纲(106007) (16)《媒体网络与交互电视技术概论》教学大纲(106008) (18)《媒体资产与业务管理技术》教学大纲(106009) (20)《面向对象程序设计—C++》教学大纲(106010) (23)《面向对象程序设计-JAVA》教学大纲(106011) (26)《面向对象程序设计-VB》教学大纲(106012) (28)《嵌入式计算机系统C》教学大纲(106013) (29)《数据库技术与SQL语言》教学大纲(106015) (34)《数字图像处理A》教学大纲(106016) (35)《数字图像处理B》教学大纲(106017) (38)《数字影视保护技术》教学大纲(106018) (40)《数字语音技术(A)》教学大纲(106019) (41)《数字语音技术(B)》教学大纲(106020) (43)《信息安全数学基础》教学大纲(106022) (45)《虚拟现实技术》教学大纲(106023) (48)《游戏测评技术》教学大纲(106024) (50)《游戏人工智能》教学大纲(106025) (51)《游戏设计基础》教学大纲(106026) (53)《游戏音效技术》教学大纲(106027) (55)《智能视频分析技术》教学大纲(106028) (57)《自然人机交互技术》教学大纲(106029) (58)《游戏引擎原理》教学大纲(106030) (60)《电子商务和信息安全》教学大纲(106031) (62)《现代电视技术》教学大纲(106032) (64)《Direct3D编程》教学大纲(106001)一、课程基本信息课程编号:106001英文名称:Direct3D Programming授课对象:数字媒体技术专业本科生开课学期:第三学年春季学期学分/学时:2学分/32学时先修课程:C语言程序设计(131002),面向对象程序设计-C++ (106010)教学方式:课堂讲授课程简介:《Direct3D》课程主要涵盖了Direct3D初始化、绘制流水线、颜色、光照、纹理、Alpha 融合、模板以及如何使用Direct3D实现游戏中所需的技术。

动画考试试卷试题

动画考试试卷试题

动画考试一试题1、名词解说(每个2分,共10分)2、填空(每个2分,共40分)3、简答(每题3分,共30分)4、编程(第1小题6分,第2小题14分,共20分)填空:1)此刻电影的播放速度为(24帧/秒),电视画面的播放速度为(25帧/秒)或(30帧/秒)。

2)为了降低动画的成本,经常采纳(一拍二)或(一拍三)模式,即连续的两帧或三帧重复同一幅画面。

3)1996年,《动画总动员》世界上第一部完好用计算灵活画制作的电影。

3000万美元的投资,获取了破纪录的亿美元的票房收入,还获取奥斯卡最正确剧本奖的提名,其意义在于:给电影制作开拓了崭新道路。

4)制作一部完好的动画片大概上需要三个阶段:(先期筹办阶段)、(中期制作阶段)和(后期制作阶段)。

中期制作阶段主要达成画面制作,包含(原画创作)、(中间插画制作)、画面测试、描线和上色。

(5)OpenGL((OpenGraphicsLibrary ),开放图形库)是一种图形显示软件工具包,它为图形硬件(比如显卡)供给软件接口。

6)(OpenGL)为计算灵活画供给由图形生成图像帧的工具。

7)本书介绍怎样在MicrosoftVC++2005环境下鉴于MFC开发(OpenGL)应用程序。

8)OpenGL函数库主要分为三类:(中心库)、(工具库)、(协助库)。

9)中心库应付的链接文件是“”,对应的头文件是(),在中心库中的函数名称往常以(gl)开头。

(10)工具库对应的链接文件是“”,对应的头文件是(),工具库中的函数名称往常以(glu)开头。

11)协助库对应的链接文件是“”,对应的头文件是(),协助库中的函数名称往常以(aux)开头。

12)假如有gl0rtho(,,,,,),则近裁剪面的左下角坐标为(,,),右下角坐标为(,,),远裁剪面的左下角的坐标为(,,),右上角的坐标为(,,)。

13)绘制真切感图形主要进行两种操作:(设置光源)和(设置材质)。

14)在OpenGL中,每个光源包含以部下性(颜色)、(地点)、(方向)。

openGL+数值模拟实时三维可视化的C#

openGL+数值模拟实时三维可视化的C#

数值模拟实时三维可视化的C#与OpenGL实现访问100次作者:朱泰山,王一一,冯国泰1. 引言当代CFD/NHT等大型数值模拟软件的开发工作在全球范围内进行得如火如荼,但主要的成果集中在国外大型相关专业软件开发商,如ANSYS公司的FLUENT和CFX等。

国内,尤其是高校内同类软件的开发应该在计算性能和个性化上寻求创新和突破,如果一味地依赖商用软件,我国与国外先进水平的差距将会越拉越大。

哈尔滨工业大学推进理论与技术研究所开发的HITurbine主要是针对航空以及地面燃气涡轮内部流场的数值模拟而设计开发的,图1为HITurbine的主界面。

图1 HITurbine主界面由于现有大多已有成熟的数值程序是由Fortran编写的,所以HITurbine考虑并采用了如图2所示系统结构:C#Main Program& InterfaceFortranOpenGLReal-time 3D ResultVisualizationComputation Program(DLL)Other APIHPC,etc图2 HITurbine系统的结构2. 实时三维可视化实现目前,微软公司已推出的DirectX 9.0c中已经包含了一个Managed DirectX程序集,这个程序集为.NET框架下的托管代码提供了访问Direct3D的接口,这使得C#能够方便地编写Direct3D代码[1]。

OpenGL目前的进展有些落后,虽然运用C/C++、VB以及Fortran等开发OpenGL程序的技术已经相对成熟(参见文献[2][3]),然而.NET仍没有提供OpenGL API的接口,所以也不存在C#开发OpenGL的标准和规范,这对于擅长界面编写的C#来说,亦可称为一种挑战。

Direct3D的参考书籍和网络资源相当丰富,其中在.NET环境下的开发框架在文献[1][4]中有详细的叙述,而OpenGL的资源则相对少得很多。

基于OpenGL三维图形的开发

基于OpenGL三维图形的开发

纹理映射(Texture Mapping):利用OpenGL纹理映射功能可以十分 逼真地表达物体表面细节。 位图显示和图象增强:图象功能除了基本的拷贝和像素读写外,还提 供融合(Blending)、反走样(Antialiasing)和雾(fog)的特殊图 象效果处理。以上三条可是被仿真物更具真实感,增强图形显示的效 果。
用户必须从点、线、面等最基本的图形单 元开始构造自己的三维模型
OpenGL提供了以下的对三维物体的绘制 方式:
网格线绘图方式(wireframe):这种方式仅绘制三维物体的网格轮廓 线。 深度优先网格线绘图方式(depth_cued):用网格线方式绘图,增加 模拟人眼看物体一样,远处的物体比近处的物体要暗些。 反走样网格线绘图方式(antialiased):用网格线方式绘图,绘图时采 用反走样技术以减少图形线条的参差不齐。 平面消隐绘图方式(flat_shade):对模型的隐藏面进行消隐,对模型 的平面单元按光照程度进行着色但不进行光滑处理。
OpenGL具体功能
模型绘制:OpenGL能够绘制点、线和多边形。应用这些基 本的形体,我们可以构造出几乎所有的三维模型。 OpenGL通常用模型的多边形的顶点来描述三维模型。如 何通过多边形及其顶点来描述三维模型,在指南的在后续 章节会有详细的介绍。 模型观察:在建立了三维景物模型后,就需要用OpenGL描 述如何观察所建立的三维模型。观察三维模型是通过一系 列的坐标变换进行的。模型的坐标变换在使观察者能够在 视点位置观察与视点相适应的三维模型景观。在整个三维 模型的观察过程中,投影变换的类型决定观察三维模型的 观察方式,不同的投影变换得到的三维模型的景象也是不 同的。最后的视窗变换则对模型的景象进行裁剪缩放,即 决定整个三维模型在屏幕上的图象。

如何在C++中进行图形绘制操作

如何在C++中进行图形绘制操作

如何在C++中进行图形绘制操作?在C++中进行图形绘制操作通常需要使用特定的图形库或API。

以下是一些常用的图形库和其使用方法:1. **OpenGL**OpenGL是一种跨平台的图形库,用于进行3D图形渲染。

可以通过包含OpenGL的头文件和链接OpenGL库来使用它。

绘制一个简单的窗口并进行基本的图形绘制操作的示例代码如下:```cpp#include <GL/glut.h>void display(){glClear(GL_COLOR_BUFFER_BIT);glBegin(GL_TRIANGLES);glColor3f(1.0, 0.0, 0.0);glVertex2f(-0.5, -0.5);glColor3f(0.0, 1.0, 0.0);glVertex2f(0.5, -0.5);glColor3f(0.0, 0.0, 1.0);glVertex2f(0.0, 0.5);glEnd();glFlush();}int main(int argc, char **argv) {glutInit(&argc, argv); glutCreateWindow("OpenGL Window"); glutDisplayFunc(display); glutMainLoop();return 0;}```2. **SDL**SDL(Simple Directmedia Layer)是一个用于编写游戏和多媒体应用程序的库。

它提供了对图形、声音、输入和网络等方面的跨平台支持。

可以使用SDL库中的函数进行图形绘制操作。

绘制一个简单的窗口并进行基本的图形绘制操作的示例代码如下:```cpp#include <SDL.h>int main(int argc, char *argv[]){SDL_Init(SDL_INIT_VIDEO);SDL_Window *window = SDL_CreateWindow("SDL Window", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, SDL_WINDOW_SHOWN);SDL_Renderer *renderer = SDL_CreateRenderer(window, -1, 0);SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);SDL_RenderClear(renderer);SDL_SetRenderDrawColor(renderer, 0, 255, 0, 255);SDL_Rect rect;rect.x = 100;rect.y = 100;rect.w = 200;rect.h = 200;SDL_RenderDrawRect(renderer, &rect);SDL_RenderPresent(renderer);SDL_Delay(2000);SDL_DestroyRenderer(renderer);SDL_DestroyWindow(window);SDL_Quit();return 0;}```3. **Qt**Qt是一个跨平台的应用程序开发框架,提供了丰富的图形绘制操作功能。

OpenGL三维图形编程基础

OpenGL三维图形编程基础
2009年3月又公布了升级版新规范OpenGL 3.1,也是这套跨平台免费API有史以来的第九次更新。 OpenGL 3.1将此前引入的OpenGL着色语言“GLSL”从1.30版升级到了1.40版,通过改进程序增强 了对最新可编程图形硬件的访问,还有更高效的顶点处理、扩展的纹理功能、更弹性的缓冲管 理等等。
rgba模式颜色索引模式colorindexrgba模式为每个像素点指定颜色可提供丰富多彩的色彩效果其中a是混合因子用于各种特效处理对于显示能力不足的硬件可采用颜色索引模式系统提供一个颜色表通常有256或4096种颜色各像素点通过索引颜色表项得到颜色值opengl基本功能711光照和材质在现实生活中物体因为受光照射和自身对各种频率光波的吸收与反射能力的不同而呈现各自不同的颜色opengl的实现假设光仅仅由三原色rgb组成物体对三原色分别有不同的反射率即材质利用物理光学模型计算物体实际的颜色opengl基本功能811纹理映射texturemapping由于物体采用图元primitive表示点线多边形绘制时有效渲染的地方也仅仅是这些点线多边形其它位置的颜色值则通过插值实现这就造成了物体绘制的不真实纹理映射通过贴图的方式为物体表面贴上真实的色彩花纹这些被指定贴上的图片就称作纹理textureopengl提供了完善的纹理映射机制opengl基本功能911反走样antialiasing线段在计算机中是通过一系列的像素来近似逼近的而这些像素实际上是一个个的小正方形因此线段常常呈锯齿状这被称为走样aliasingopengl通过计算线段对各个像素的不同覆盖率来实现反走样antialiasingopengl基本功能1011图像特效融合blending为了使三维图形更加具有真实感经常需要处理半透明或透明的物体图像这就需要用到融合技雾fog正如自然界中存在烟雾一样opengl提供了fog的基本操作来达到对场景进行雾化的效果opengl基本功能1111双缓存doublebuffering动画出色的动画效果是opengl的一大特色opengl通过双缓存实现动画前台缓存显示当前帧后台缓存同时进行后续帧的场景计算生成画面opengl语法特点15所有opengl函数都使用gl作为前缀如glclearcolor所有opengl常量都使用gl开头并且所有字母都大写如glfalseopengl语法特点25opengl函数后缀说明后缀中的阿拉伯数字一般表示参数的数目如glvertex2i13表示该函数有两个参数阿拉伯数字后的小写字符一个或多个表示参数类型如glvertex2i13表示该函数的两个参数都为32位整数integer表示参数类型的后缀定义见下表opengl语法特点35opengl函数后缀说明opengl语法特点45opengl函数后缀说明有

OpenGL 4颜色及3D图形绘制

OpenGL 4颜色及3D图形绘制
ຫໍສະໝຸດ 4.4 顶点数组
启用数组 glEnableClientState(GL_VERTEX_ARRAY); 将准备好的数组告知程序,使用glVertexPointer(),原 型如下: void glVertexPointer( GLint size, //每个顶点占用的数组元素数量 GLenum type, //数组元素的数据类型 GLsizei stride, //元素之间的间隔,一般系统为0 const GLvoid *pointer //指向数组的指针 );
正方体为例:
1 2 3 0
GLbyte indexs[] = {0,1,2,3,/**< 顶面索引 * 4,5,6,7,/**< 底面索引 0,3,4,7,/**< 右面索引 2,5,4,3,/**< 前面索引 2,1,6,5,/**< 左面索引 0,7,6,1};/**< 后面索引
6 5 4
7
GLfloat vertices[] = { 1.0f,1.0f,-1.0f, -1.0f,1.0f,-1.0f, -1.0f, 1.0f, 1.0f,1.0f, 1.0f, 1.0f, 1.0f,-1.0f, 1.0f,-1.0f,-1.0f, 1.0f, -1.0f,-1.0f,-1.0f,1.0f,-1.0f,-1.0f}; /** 顶点索引数组 */
第4章
OpenGL颜色及3D图形绘制
1
4.1 OpenGL中的颜色

在OpenGL中,一种颜色用红、绿、蓝成分的混 合来表示,每种成分的值范围是0.0到1.0 。 红色成分 绿色成分 0.0 0.0 1.0 蓝色成分 0.0 0.0 0.0
数据类型 黑 红 绿 黄
0.0 1.0

如何使用OpenGL绘制三维坐标系

如何使用OpenGL绘制三维坐标系

如何使⽤OpenGL绘制三维坐标系第⼀,图中圆环所在的指定区域与坐标轴所在的区域是两个相互独⽴的空间,通过使⽤glViewport函数限定。

glViewport(0,0,500,500);//指定圆环绘制空间,从(0,0)位置开始,长宽分别为500glViewport(0,300,200,200);//指定坐标轴的绘制空间,从(0,300)位置开始,长宽分别为200第⼆,设定投影效果、观察坐标及旋转缩放等//设置投影效果//glMatrixMode(GL_PROJECTION);glLoadIdentity();glOrtho(-500, 500, -500, 500, -500, 500); //指定了⼀个正⽅体区域,在这个区域内的图形才能正常显⽰//设置模型视图矩阵,开始画图//glMatrixMode(GL_MODELVIEW);glLoadIdentity();gluLookAt(0, 2, 0, 0, 0, 0, 0, 0, 1); //从(0,2,0)位置看向原点,z轴向上第⼆,考虑到实际应⽤中我们需要对圆环进⾏旋转,那坐标系也应该进⾏旋转,这样才能⼀⼀对应上。

glRotatef(_xAngle, 1, 0, 0);glRotatef(_yAngle, 0, 1, 0);//传⼊的⾓度根据具体需求具体设定第三,绘制坐标轴。

可以将坐标轴画成⼀个上下底⾯同宽,长度较长的⼀个圆柱体;⽽坐标箭头可以看成头部很宽,底部宽度为0的圆柱体。

const int AXES_LEN = 300;const int ARROW_LEN = 100;const int ARROW_RADIUS = 30;GLUquadricObj *objCylinder = gluNewQuadric();//确定坐标系原点glPushMatrix();glColor3f(1.0f, 1.0f, 1.0f);glutSolidSphere(15, 20, 20);glPopMatrix();glPushMatrix();glColor3f(1.0f, 0.0f, 0.0f);glutSolidSphere(0.25, 6, 6);gluCylinder(objCylinder, 10, 10, AXES_LEN, 10, 5); //zglTranslatef(0, 0, AXES_LEN);gluCylinder(objCylinder, ARROW_RADIUS, 0, ARROW_LEN, 10, 5); //z arrowglPopMatrix();glPushMatrix();glColor3f(0.0f, 1.0f, 0.0f);glRotatef(90, 1.0, 0.0, 0.0);gluCylinder(objCylinder, 10, 10, AXES_LEN, 10, 5); //YglTranslatef(0, 0, AXES_LEN);gluCylinder(objCylinder, ARROW_RADIUS, 0, ARROW_LEN, 10, 5); //Y arrowglPopMatrix();glPushMatrix();glColor3f(0.0f, 0.0f, 1.0f);glRotatef(90, 0.0, 1.0, 0.0);gluCylinder(objCylinder, 10, 10, AXES_LEN, 10, 5); //XglTranslatef(0, 0, AXES_LEN);gluCylinder(objCylinder, ARROW_RADIUS, 0, ARROW_LEN, 10, 5); //X arrowglPopMatrix();上述代码中需要注意到的是x轴和y轴的是根据z轴旋转得到的。

三维图形的光照、贴图及阴影处理(OpenGL)

三维图形的光照、贴图及阴影处理(OpenGL)

三维图形的光照、贴图及阴影处理(OpenGL)实验过程:一、在VS6.0中建立新工程。

1、新建一个Win32 Application的工程。

2、向工程项目添加C++源文件。

3、将OpenGL框架复制到文件中。

4、设置OpenGL窗口标题。

二、场景设置。

1、视线处于一具有地板及前、左、右三面墙壁的空间中。

2、空间顶部中央有一光源。

3、空间中央有一地球仪,不断旋转。

三、建立视口结构及视点属性。

1、在坐标系上建立视图结构。

如图。

2、参数设置。

窗口大小:800*600。

视口大小:800*600。

透视深度:0.1~100。

透视角:60°。

视点位置:(0.0, 2.0, 15.0)。

视线方向:z轴负方向。

视点上方向:y轴正方向。

3、调用函数glViewport()、gluPerspective()和gluLookAt()实现。

四、绘制三维图形。

1、开启深度测试模式。

为防止图形重叠时出现层次混乱,必须对绘制图形进行消隐处理。

直接调用函数glEnable(GL_DEPTH_TEST)开启深度测试。

2、绘制地面与墙壁。

调用OpenGL基本几何元素绘制过程glBegin(GL_QUADS)、glBegin(GL_QUAD_STRIP)绘制四个平面,坐标范围为:x: -10~10, y: -2~20, z: -10~10。

坐标系结构如图。

3、绘制地球仪。

设计函数void DrawEarth()实现地球仪的绘制,分别调用OpenGL球面绘制函数gluSphere()绘制地球形状、柱面绘制函数gluCylinder()绘制地轴两头形状。

(1)参数设置。

球面半径:2。

球面细度:水平100,垂直100。

柱面半径:0.05。

柱面高度:1。

柱面细度:水平50,垂直1。

(2)结构如图。

4、绘制模拟光源。

(1)绘制“灯罩”。

调用glBegin(GL_TRIANGLE_STRIP)绘制4个三角形,构成棱椎形灯罩的4个侧面。

(2)绘制“灯泡”。

如何在C++中进行图形绘制操作

如何在C++中进行图形绘制操作

如何在C++中进行图形绘制操作C++是一种强大的编程语言,可以用于进行各种图形绘制操作。

在C++中,可以使用一些图形库来实现图形绘制,其中最常用的是OpenGL 和SFML。

1.使用OpenGL进行图形绘制OpenGL是一种跨平台的图形库,可以用于在不同的操作系统上进行图形绘制。

使用OpenGL进行图形绘制需要安装相应的OpenGL库,并在代码中添加相关的头文件和链接库。

在C++中,可以使用OpenGL进行图形绘制的基本步骤如下:-初始化OpenGL环境:在程序的开始处,需要进行OpenGL的初始化,并设置相关的窗口参数和OpenGL的版本。

-创建窗口:使用OpenGL库中的函数创建一个窗口,用于显示绘制的图形。

可以设置窗口的大小、标题等。

-设置视口:将窗口设置为视口,指定绘制的区域。

-定义图形数据:在程序中定义需要绘制的图形的顶点数据,例如点、线、三角形等。

-编写着色器程序:在OpenGL中,需要使用着色器程序来进行图形的着色和光照等处理。

着色器程序通常由顶点着色器和片段着色器组成,分别用于处理顶点和片段的绘制过程。

-编写绘制函数:编写一个函数,用于将图形数据传递给OpenGL,并进行绘制操作。

在绘制函数中,需要进行相关的操作,例如绑定缓冲区、设置顶点属性、绘制图形等。

-事件循环:使用一个循环,不断地监听用户的输入和系统的事件,并根据事件进行相应的处理。

例如,可以监听键盘输入,根据输入进行相应的图形操作。

-渲染循环:使用一个循环,在每一帧中对图形进行渲染,并更新窗口的显示内容。

使用OpenGL进行图形绘制需要对图形学的基本原理有一定的了解,例如顶点和片段的概念,以及图形变换、投影等操作的原理。

同时,也需要学习OpenGL库中的一些函数和参数的使用方法。

2.使用SFML进行图形绘制SFML(Simple and Fast Multimedia Library)是一个简单易用的多媒体库,可以用于进行图形、声音和输入输出等操作。

OpenGL结合C#进行绘图

OpenGL结合C#进行绘图

OpenGL结合C#进⾏绘图本⼈对OpenGL产⽣了浓厚的兴趣,⼜想学习⼀下C#这个语⾔,就想两个⼀起学习⼀下,就正好发现这篇⽂章,结合起来学习。

路漫漫其修远兮,吾将上下⽽求索!!OpenGL简介OpenGL作为⼀种图形学编程接⼝已经⾮常流⾏,虽然在⼤型游戏⽅⾯DirectX有⼀定的市场占有率,但由于OpenGL的开放性,可移植性等优点,OpenGL已经成了⼀种图形学⽅⾯的标准。

(1)Python的 pyOpenGL;(2)C#的OpenTK(包括OpenAL, OpenGL, OpenCL); tao C#绑定;(3)JavaScript:WebGL等等。

这样我们就可以利⽤⾃⼰熟悉的语⾔来编写OpenGL的图形程序了。

(值得注意的是:每个不同的绑定基本都包括了 gl 库[OpenGL的核⼼函数库], glu库[实⽤函数库], glut库[实⽤⼯具箱] 等等)OpenGL support librariesGLU – Some additional functions for OpenGL programs.GLUT – The OpenGL utility toolkit. Defunct.freeglut – Open source alternative to GLUTGLUI – a GUI toolkit made with GLUTGLFW - A modern alternative to GLUT and FreeGLUT.GLee – The OpenGL Easy Extension library.GLEW – The OpenGL Extension Wrangler Library.GLM – C++ mathematics toolkit for OpenGL based on the GLSL specification.JOGL – Java bindings for OpenGL API.本⼈常⽤的语⾔是C#和Python,最后选了C#的tao作为编程环境。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

VC2005下利用OpenGL实现三维绘图2006-01-09 08:44作者:bz201出处:BLOG责任编辑:方舟在三维绘图蓬勃发展的过程中,计算机公司推出了大量的三维绘图软件包。

其中SGI公司推出的OpenGL,作为一个性能优越的图形应用程序设计界面(API)异军突起,取得了很大的成就。

它以高性能的交互式三维图形建模能力和易于编程开发,得到了Microsoft、IBM、DEC、Sun、HP等大公司的认同。

因此,OpenGL已经成为一种三维图形开发标准,是从事三维图形开发工作的必要工具。

1、初始化OpenGL绘图环境1.1 定义颜色格式和缓冲模式OpenGL提供两种颜色模式:RGB(RGBA)模式和颜色索引模式(调色板)。

在RGBA 模式下所有颜色的定义用RGB三个值来表示,有时也加上Alpha值(表示透明度)。

RGB 三个分量值的范围都在0和1之间,它们在最终颜色中所占的比例与它们的值成正比。

如:(1、1、0)表示黄色,(0、0、1)表示蓝色。

颜色索引模式下每个象素的颜色是用颜色索引表中的某个颜色索引值表示(类似于从调色板中选取颜色)。

由于三维图形处理中要求颜色灵活,而且在阴影,光照,雾化,融合等效果处理中RGBA的效果要比颜色索引模式好,所以,在编程时大多采用RGBA模式。

OpenGL提供了双缓存来绘制图像。

即在显示前台缓存中的图像同时,后台缓存绘制第二幅图像。

当后台绘制完成后,后台缓存中的图像就显示出来,此时原来的前台缓存开始绘制第三幅图像,如此循环往复,以增加图像的输出速度。

设置窗口显示模式函数:void auxInitDisplayMode(AUX_DOUBLE | // 双缓存方式AUX_RGBA// RGBA颜色模式);1.2 设置光源OpenGL的光源大体分为三种:环境光(Ambient light),即来自于周围环境没有固定方向的光。

漫射光(Diffuse light)来自同一个方向,照射到物体表面时在物体的各个方向上均匀发散。

镜面光(Specular light)则是来自于同一方向,也沿同一个方向反射。

全局环境光是一种特殊的环境光,它不来自特于某种定光源,通常做为场景的自然光源。

指定光源函数:void glLightfv(Glenum light,// 光源号Glenum pname,// 指明光源类型:// GL_DIFFUSE 光源为漫射光光源// GL_AMBIENT 光源为环境光光源// GL_SPECULAR 光源为镜面光光源const Glfloat* params// 指向颜色向量的指针);设置全局环境光函数:void glLightModelfv(GL_LIGHT_MODEL_ AMBIENT,const Glfloat* param// param:指向颜色向量的指针);起用光源函数:void glEnable(GL_LIGHTING);void glEnable(GL_enum cap);// cap:指明光源号1.3 设置材质在OpenGL中,用材料对光的三原色(红绿蓝)的反射率大小来定义材料的颜色。

与光源相对应,材料的颜色,也分为环境色,漫反射色和镜面反射色,由此决定该材料对应不同的光呈现出不同的反射率。

由于人所看到物体的颜色是光源发出的光经物体反射后进入眼睛的颜色。

所以,物体的颜色是光源的环境光,漫反射光和镜面反射光与材料的环境色,漫反射色和镜面反射色的综合。

例如:OpenGL的光源色是(LR、LG、LB),材质色为(MR、MG、MB),那么,在忽略其他反射效果的情况下,最终进入眼睛的颜色是(LR*MR、LG*MG、LB*MB)。

材质定义函数:void glMaterialfv(GLenum face,// 指明在设置材质的哪个表面的颜色。

// 可以是GL_FRONT、GL_BACK、GL_FRONT_AND_BACK GLenum pname, // 与光源的pname参数相似const float* params// 指向材质的颜色向量);1.4 定义投影方式也即选择观察物体的角度和范围。

由于我们是三维绘图,所以采用不同的视点和观察范围,就会产生不同的观察效果。

由于计算机只能显示二维图形,所以在表示真实世界中的三维图形时,需将三维视景转换成二维视景。

这是产生三维立体效果的关键。

OpenGL提供了两种将3D图形转换成2D图形的方式。

正投影(Orthographic Projection)和透视投影(Perspective Projection)。

其中,正投影指投影后物体的大小与视点的远近无关,通常用于CAD设计;而透视投影则符合人的心理习惯,离视点近的物体大,离视点远的物体小。

此外,在OpenGL中还要定义投影范围,只有在该范围中的物体才会被投射到计算机屏幕上,投影范围外的物体将被裁减掉。

定义投影范围(不同的投影方式对应不同函数):void glOrtho(GLdouble left, GLdouble right,// (left,bottom,near)及(right,top,far)分别给出正射投GLdouble bottom, GLdouble top,// 影投影范围的左下角和右上角的坐标。

GLdouble near,GLdouble far);2、定义与Windows接口的系统函数2.1 定义绘图窗口的位置// (x,y)给出窗口左上角坐标// width及heigh给出窗口的宽高void auxInitPosition(GLint x,GLint y,GLsizei width, GLsizei heigh);2.2 定义绘图窗口的标题// STR表示窗口标题字串void auxInitWindow(GLbyte* STR);2.3 定义绘图窗口改变时的窗口刷新函数// 当窗口改变形状时调指定的回调函数// NAME表示回调函数名称void auxReshapeFunc(NAME);2.4 定义空闲状态的空闲状态函数以实现动画// 当系统空闲时调用指定的回调函数// NAME表示回调函数名称void auxIdleFunc(NAME);2.5 定义场景绘制函数(当窗口更新或场景改变时调用)// 当窗口需要更新或场景变化时调用// NAME表示回调函数名称void auxMainLoop(NAME);3、在VC下实现程序编译在VC编辑器下键入下述代码后,保存为后缀是.cpp的C++文件。

开始编译,在“The build command requires an active project workspace”。

“Would you like to create a default project workspace”?的提示后,选择“是(Y)”。

进入“Project”菜单,选择“Setting”项,弹出“Project Setting”对话框,选择“Link”项,在“Libaray”栏目中加入OpenGL提供的函数库:“opengl32.lib glu32.lib glaux.lib”。

(注意:在执行程序时,Windows的system目录下要包含opengl32.dll及glu32.dll两个动态连接库)。

附源程序代码:#include "windows.h"#include "gl/gl.h"#include "gl/glaux.h"#include "gl/glu.h"#include "math.h"void myinit(){glClearColor(1,1,0,0);GLfloat ambient[]={.5,.5,.5,0};glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient);GLfloat mat_ambient[]={.8,.8,.8,1.0};GLfloat mat_diffuse[]={.8,.0,.8,1.0};GLfloat mat_specular[]={1.0,.0,1.0,1.0};GLfloat mat_shininess[]={50.0};GLfloat light_diffuse[]={0,0,.5,1};GLfloat light_position[]={0,0,1.0,0};glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,mat_ambient);glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,mat_diffuse);glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular);glMaterialfv(GL_FRONT_AND_BACK,GL_SHININESS,mat_shininess);glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);glLightfv(GL_LIGHT0,GL_POSITION, light_position);glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);glDepthFunc(GL_LESS);glEnable(GL_DEPTH_TEST);}void CALLBACK display(){glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);auxSolidSphere(1.0); // 绘制半径为1.0的实体球glFlush(); // 强制输出图像auxSwapBuffers(); // 交换绘图缓存Sleep(100);}void CALLBACK Idledisplay(){// x,y满足x2+y2=0.01。

这样可以使物体沿该圆轨迹运动。

static float x=-.1,y=0.0;static BOOL mark=TRUE;static float step=.01;x+=step;if(x<=.1&&x>=-.1)if(step>0)y=sqrt(.01-x*x);elsey=-sqrt(.01-x*x);glTranslatef(x,y,0);}else{step=0-step;}display();}void CALLBACK myReshape(GLsizei w,GLsizei h){glViewport(0,0,w,h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if(w<=h)glOrtho(-3.5,3.5,-3.5*(GLfloat)w/(GLfloat)h, 3.5*(GLfloat)w/(GLfloat)h,-10,10);elseglOrtho(-3.5*(GLfloat)w/(GLfloat)h,3.5* (GLfloat)w/(GLfloat)h,-3.5,3.5,-10,10);glMatrixMode(GL_MODELVIEW);glLoadIdentity();}void main(){auxInitDisplayMode(AUX_DOUBLE|AUX_RGBA);auxInitPosition(0,0,400,400);auxInitWindow(" circle ");myinit();auxReshapeFunc(myReshape);auxIdleFunc(Idledisplay);auxMainLoop(display);在Visual C++ 2005下编译cl a.cpp /linkopengl32.lib glu32.lib glaux.lib user32.lib gdi32.lib kernel32.lib advapi32.lib。

相关文档
最新文档