OpenGL编程实例
实验一 OPENGL中的二维编程
实验一OPENGL中的二维编程姓名叶传军学号 E11414103 得分一.实验题目1练习基本的openGL编程方法。
(1)配置openGL,能在VC下通过编译。
(2)阅读并运行simple.c,熟悉最简单的openGL程序结构。
(3)阅读并运行改进的simple2.c,掌握openGL程序的通用结构。
给simple2.c中的函数加注释。
可尝试做如下修改:(a)改变窗口的位置,尺寸,标题;(b)改变窗口背景色和矩形颜色;(c)改变矩形的尺寸和其在窗口中的位置,还可以只显示矩形的一部分(通过设置正投影参数和矩形四个顶点的坐标来完成);2发挥想象,编程实现在窗口中绘制若干图形及设置它们的属性,并回答问题:(1)绘制若干个点,分别设置每个点的颜色和大小。
思考题1:glPointSize()可以放在glBegin()和glEnd()函数对之间吗?(2)绘制若干条直线段。
设置线段的颜色,线型和线宽。
思考题1:以下命令会显示什么样的线段?glEnable(GL_LINE_STIPPLE);glColor3f(0.0, 1.0, 0.0);glLineWidth(2.0);glLineStipple(3, 0xcccc);glDisable(GL_LINE_STIPPLE);思考题2:以下命令会显示什么样的线段?glShadeModel(GL_SMOOTH);glBegin(GL_LINES);glColor3f(1.0, 0.0, 0.0);glVertex2f(0.0, 0.5);glColor3f(0.0, 0.0, 1.0);glVertex2f(0.5, -0.5);glEnd();将glShadeModel(GL_SMOOTH)改为glShadeModel(GL_FLAT),其余命令不变,结果又会如何?(3)绘制若干个多边形。
设置多边形的颜色,显示模式,隐藏某些边。
思考题1:以下命令会显示什么样的多边形?glShadeModel(GL_SMOOTH);glBegin(GL_POLYGON);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.5, 0.5);glColor3f(1.0, 1.0, 0.0);glVertex2f(0.5, -0.5);glEnd();将glShadeModel(GL_SMOOTH)改为glShadeModel(GL_FLAT),其余命令不变,结果又会如何?将glBegin(GL_POLYGON)改为glBegin(GL_QUADS),分别尝试在SMOOTH和FLAT模式下的结果。
opengl实现任意两点间画圆柱体
opengl实现任意两点间画圆柱体本⽂实例为⼤家分享了opengl实现任意两点间画圆柱体的具体代码,供⼤家参考,具体内容如下1、问题提出两点间画线简单:glBegin(GL_LINES); //注意是LINES不是LINE,这个错误⼀定要注意。
glVertexf(x1, y1, z1);glVertexf(x2, y2, z2);glEnd();画线函数不会影响opengl的矩阵堆栈。
但是很多时候线条效果会⽐较差,⽐如我要做⼀个⾻骼动画,关节点间的⾻头⽤线条太难看,即使使⽤glLineWidth设置线宽,视觉效果还是⼀塌糊涂。
还有利⽤分形绘制3D树的时候,树⼲⽤线条(宽线条)绘制效果也不佳。
所以此时需要实现⼀个函数,3D空间中任意两点间⽤⼏何体绘制,我下⾯介绍⼀种思路。
2、原理介绍要在A(x1,y1,z1), B(x2,y2,z2)之间绘制圆柱体,⾸先在原点处,沿着Y轴⽅向完成⼏何体绘制,然后旋转到AB向量⽅向,最后平移到A点处。
关键在旋转矩阵的计算,使⽤向量叉乘:AB向量和Y轴单位向量叉乘计算出右⼿side向量,然后side单位化,side和AB叉乘计算出最终的up⽅向。
代码如下:void RenderBone(float x0, float y0, float z0, float x1, float y1, float z1 ){GLdouble dir_x = x1 - x0;GLdouble dir_y = y1 - y0;GLdouble dir_z = z1 - z0;GLdouble bone_length = sqrt( dir_x*dir_x + dir_y*dir_y + dir_z*dir_z );static GLUquadricObj * quad_obj = NULL;if ( quad_obj == NULL )quad_obj = gluNewQuadric();gluQuadricDrawStyle( quad_obj, GLU_FILL );gluQuadricNormals( quad_obj, GLU_SMOOTH );glPushMatrix();// 平移到起始点glTranslated( x0, y0, z0 );// 计算长度double length;length = sqrt( dir_x*dir_x + dir_y*dir_y + dir_z*dir_z );if ( length < 0.0001 ) {dir_x = 0.0; dir_y = 0.0; dir_z = 1.0; length = 1.0;}dir_x /= length; dir_y /= length; dir_z /= length;GLdouble up_x, up_y, up_z;up_x = 0.0;up_y = 1.0;up_z = 0.0;double side_x, side_y, side_z;side_x = up_y * dir_z - up_z * dir_y;side_y = up_z * dir_x - up_x * dir_z;side_z = up_x * dir_y - up_y * dir_x;length = sqrt( side_x*side_x + side_y*side_y + side_z*side_z );if ( length < 0.0001 ) {side_x = 1.0; side_y = 0.0; side_z = 0.0; length = 1.0;}side_x /= length; side_y /= length; side_z /= length;up_x = dir_y * side_z - dir_z * side_y;up_y = dir_z * side_x - dir_x * side_z;up_z = dir_x * side_y - dir_y * side_x;// 计算变换矩阵GLdouble m[16] = { side_x, side_y, side_z, 0.0,up_x, up_y, up_z, 0.0,dir_x, dir_y, dir_z, 0.0,0.0, 0.0, 0.0, 1.0 };glMultMatrixd( m );// 圆柱体参数GLdouble radius= 20; // 半径GLdouble slices = 8.0; // 段数GLdouble stack = 3.0; // 递归次数gluCylinder( quad_obj, radius, radius, bone_length, slices, stack );glPopMatrix();}上⾯的代码绘制圆柱体使⽤了glu⼏何库,如果绘制其他⼏何体:⽐如四棱锥,或其它⼏何体,只需要修改下⾯的框架:void RenderBone(float x0, float y0, float z0, float x1, float y1, float z1 ){GLdouble dir_x = x1 - x0;GLdouble dir_y = y1 - y0;GLdouble dir_z = z1 - z0;GLdouble bone_length = sqrt( dir_x*dir_x + dir_y*dir_y + dir_z*dir_z );glPushMatrix();// 平移到起始点glTranslated( x0, y0, z0 );// 计算长度double length;length = sqrt( dir_x*dir_x + dir_y*dir_y + dir_z*dir_z );if ( length < 0.0001 ) {dir_x = 0.0; dir_y = 0.0; dir_z = 1.0; length = 1.0;}dir_x /= length; dir_y /= length; dir_z /= length;GLdouble up_x, up_y, up_z;up_x = 0.0;up_y = 1.0;up_z = 0.0;double side_x, side_y, side_z;side_x = up_y * dir_z - up_z * dir_y;side_y = up_z * dir_x - up_x * dir_z;side_z = up_x * dir_y - up_y * dir_x;length = sqrt( side_x*side_x + side_y*side_y + side_z*side_z );if ( length < 0.0001 ) {side_x = 1.0; side_y = 0.0; side_z = 0.0; length = 1.0;}side_x /= length; side_y /= length; side_z /= length;up_x = dir_y * side_z - dir_z * side_y;up_y = dir_z * side_x - dir_x * side_z;up_z = dir_x * side_y - dir_y * side_x;// 计算变换矩阵GLdouble m[16] = { side_x, side_y, side_z, 0.0,up_x, up_y, up_z, 0.0,dir_x, dir_y, dir_z, 0.0,0.0, 0.0, 0.0, 1.0 };glMultMatrixd( m );// 原点处向Y轴⽅向绘制⼏何体renderGeometryInYAxis();glPopMatrix();}注意上⾯的renderGeometryInYAxis();必须是在Y轴上绘制⼏何体。
opencl编程实例
opencl编程实例OpenCL编程实例引言:OpenCL(Open Computing Language)是一种开放的跨平台并行计算框架,可以用于编写高性能的并行应用程序。
本文将介绍几个使用OpenCL进行编程的实例,展示OpenCL在不同领域的应用。
1.图像处理实例:图像处理是OpenCL广泛应用的领域之一。
以图像的高斯模糊为例,我们可以使用OpenCL加速该过程。
首先,将图像数据存储在OpenCL的缓冲区中,然后通过设置内核函数,使用OpenCL并行地对每个像素进行处理。
通过调整内核函数的工作项大小和工作组大小,可以充分利用GPU的并行计算能力,提高图像处理的速度。
2.矩阵乘法实例:矩阵乘法是计算密集型的任务,适合使用OpenCL进行加速。
通过将矩阵数据存储在OpenCL的缓冲区中,并设置适当的内核函数,可以同时在多个计算单元上并行地执行乘法操作。
通过OpenCL的向量化指令和并行计算能力,可以显著提高矩阵乘法的计算速度。
3.物理模拟实例:物理模拟是另一个适合使用OpenCL的应用领域。
以粒子模拟为例,我们可以使用OpenCL模拟粒子之间的相互作用和运动。
通过将粒子数据存储在OpenCL的缓冲区中,并设置适当的内核函数,可以并行地计算每个粒子的受力和位移。
通过充分利用GPU的并行计算能力,可以实现高效的物理模拟。
4.机器学习实例:机器学习是近年来备受关注的领域,而OpenCL可以为机器学习算法提供高性能的计算支持。
以神经网络为例,我们可以使用OpenCL加速神经网络的训练和推断过程。
通过将神经网络的权重和输入数据存储在OpenCL的缓冲区中,并设置适当的内核函数,可以并行地执行神经网络的计算。
通过使用OpenCL的并行计算能力,可以加快神经网络的训练和推断速度。
5.声音合成实例:声音合成是OpenCL在音频处理领域的应用之一。
以音频信号的混响为例,我们可以使用OpenCL加速混响算法的计算过程。
OpenGL编程轻松入门之一个简单的例子
OpenGL编程轻松入门之一个简单的例子先编译运行一个简单的例子,这样我们可以有一个直观的印象。
从这个例子我们可以看到OpenGL可以做什么,当然这个例子只做了很简单的一件事--绘制一个彩色的三角形。
除此以外,我们还可以看到典型的OpenGL程序结构及openGL 的运行顺序。
例1:本例在黑色的背景下绘制一个彩色的三角形,如图一所示。
#include <stdlib.h>#include <GL/glut.h>void background(void){glClearColor(0.0,0.0,0.0,0.0);//设置背景颜色为黑色}void myDisplay(void){glClear(GL_COLOR_BUFFER_BIT);//buffer设置为颜色可写glBegin(GL_TRIANGLES);//开始画三角形glShadeModel(GL_SMOOTH);//设置为光滑明暗模式glColor3f(1.0,0.0,0.0);//设置第一个顶点为红色glV ertex2f(-1.0,-1.0);//设置第一个顶点的坐标为(-1.0,-1.0)glColor3f(0.0,1.0,0.0);//设置第二个顶点为绿色glV ertex2f(0.0,-1.0);//设置第二个顶点的坐标为(0.0,-1.0)glColor3f(0.0,0.0,1.0);//设置第三个顶点为蓝色glV ertex2f(-0.5,1.0);//设置第三个顶点的坐标为(-0.5,1.0)glEnd();//三角形结束glFlush();//强制OpenGL函数在有限时间内运行}void myReshape(GLsizei w,GLsizei h){glViewport(0,0,w,h);//设置视口glMatrixMode(GL_PROJECTION);//指明当前矩阵为GL_PROJECTION glLoadIdentity();//将当前矩阵置换为单位阵if(w <= h)gluOrtho2D(-1.0,1.5,-1.5,1.5*(GLfloat)h/(GLfloat)w);//定义二维正视投影矩阵elsegluOrtho2D(-1.0,1.5*(GLfloat)w/(GLfloat)h,-1.5,1.5);glMatrixMode(GL_MODELVIEW);//指明当前矩阵为GL_MODELVIEW }int main(int argc,char ** argv){/*初始化*/glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowSize(400,400);glutInitWindowPosition(200,200);/*创建窗口*/glutCreateWindow("Triangle");/*绘制与显示*/background();glutReshapeFunc(myReshape);glutDisplayFunc(myDisplay);glutMainLoop();return(0);}图一:一个彩色的三角形首先创建工程,其步骤如下:1)创建一个Win32 Console Application。
OpenGL编程轻松入门之特殊效果操作Read
OpenGL编程轻松入门之特殊效果操作-Read————————————————————————————————作者:————————————————————————————————日期:OpenGL编程轻松入门之特殊效果操作每个物体在不同的环境在会有不同的视觉效果。
为了使效果更加真实需要增加特殊效果。
例8:绘制三个互相重叠的矩形,这三个矩形从左到右分别为绿、红、蓝。
其中红色、蓝色矩形的透明度分别为50%的透明度,即alpha值为0.5,如图九所示。
#include <stdlib.h>#include <GL/glut.h>void myInit(void){glClearColor(0.2,0.8,0.8,0.0);//将背景设置为湖蓝色glEnable(GL_BLEND);//激活GL_BLENDglBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);//指定像素的数学算法glEnable(GL_FLAT);}void myDisplay(void){glClear(GL_COLOR_BUFFER_BIT);/*绘制一个绿色的矩形alpha = 1.0*/glColor4f(0.0,1.0,0.0,1.0);glBegin(GL_POL YGON);glVertex3f(-0.75,0.5,0.0);glVertex3f(-0.75,-0.75,0.0);glVertex3f(0.5,-0.75,0.0);glVertex3f(0.5,0.5,0.0);glEnd();/*绘制一个红色的矩形alpha = 0.5*/glColor4f(1.0,0.0,0.0,0.5);glBegin(GL_POL YGON);glVertex3f(-0.25,1.0,0.0);glVertex3f(-0.25,-0.25,0.0);glVertex3f(1.0,-0.25,0.0);glVertex3f(1.0,1.0,0.0);glEnd();/*绘制一个蓝色的矩形alpha = 0.5*/glColor4f(0.0,0.0,1.0,0.5);glBegin(GL_POL YGON);glVertex3f(0.25,1.5,0.0);glVertex3f(0.25,0.25,0.0);glVertex3f(1.5,0.25,0.0);glVertex3f(1.5,1.5,0.0);glEnd();glFlush();}void myReshape(int w,int h){glViewport(0,0,w,h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if(w<h)glOrtho(-1.5,1.5,-1.5*(GLfloat)h/(GLfloat)w,1.5*(GLfloat)h/(GLfloat)w,-1.5,1.5);elseglOrtho(-1.5*(GLfloat)w/(GLfloat)h,1.5*(GLfloat)w/(GLfloat)h,-1.5,1.5,-1.5,1.5);glMatrixMode(GL_MODELVIEW);glLoadIdentity();glTranslatef(-0.4,0.0,0.0);}int main(int argc,char ** argv){/*初始化*/glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowSize(300,400);glutInitWindowPosition(200,200);/*创建窗口*/glutCreateWindow("BLEND POL YGON");/*绘制与显示*/myInit();glutReshapeFunc(myReshape);glutDisplayFunc(myDisplay);/*进入GLUT事件处理循环*/glutMainLoop();return(0);}图九:三个互相重叠的矩形·glBlendFunc(GLenum sfactor,GLenum dfactor)指定像素算法。
第16讲Opengl真实感绘制编程实例
实例一 光照 实例二 加载3D世界
电子与信息工程学院 计算机科学与技术系
实例一 光照编程实例
加入光照
电子与信息工程学院 计算机科学与技术系
光照编程实例
使用键盘移动场景中的对象
电子与信息工程学院 计算机科学与技术系
光照编程实例
#include <windows.h> // Windows的头文件 #include <stdio.h> // 标准输入/输出的头文件 #include <gl\gl.h> // OpenGL32库的头文件 #include <gl\glu.h> // GLu32库的头文件 #include <gl\glaux.h> // GLaux库的头文件 HDC hDC=NULL; // 私有GDI设备描述表 HGLRC hRC=NULL; // 永久着色描述表 HWND hWnd=NULL; // 保存我们的窗口句柄 HINSTANCE hInstance; // 保存程序的实例 bool keys[256]; // 用于键盘例程的数组 bool active=TRUE; // 窗口的活动标志,缺省为TRUE bool fullscreen=TRUE; // 全屏标志缺省设定成全屏模式
(1,1,-1)
(1,-1,-1)
(-1,-1,1)
(1,-1,1)
电子与信息工程学院 计算机科学与技术系
// 前侧面 glNormal3f( 0.0f, 0.0f, 1.0f); // 法线指向观察者 glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
实验一OpenGL图形编程入门
实验⼀OpenGL图形编程⼊门实验⼀ OpenGL图形编程⼊门三、实验内容1、建⽴⼀个⼯程⽂件,并运⾏样本程序my first program.cpp,观看结果。
(6)在⼯程⽂件中输⼊样本程序,单击启动调试按钮,观察运⾏结果。
样本程序:my first program.cpp#includevoid display(void){glClear(GL_COLOR_BUFFER_BIT); //刷新颜⾊缓冲区glFlush(); //⽤于刷新命令队列和缓冲区,使所有尚未被执⾏的OpenGL命令得到执⾏}void main(int argc, char** argv){glutInit(&argc, argv); //初始化GLUT库glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); //设置显⽰模式 glutCreateWindow("hello"); //创建窗⼝,标题为“hello”glutDisplayFunc(display); //⽤于绘制当前窗⼝glutMainLoop(); //表⽰开始运⾏程序,⽤于程序的结尾}运⾏结果:创建⼀个名称是“hello”的窗⼝。
如图1-7所⽰。
2、认真阅读样本程序,理解每个函数的作⽤,并修改窗⼝标题,显⽰为“我的第⼀个OpenGL程序”。
3、窗⼝的设置。
在默认情况下,窗⼝的位置出现在屏幕的左上⾓,默认⼤⼩为300*300。
要求:修改窗⼝⼤⼩为其他尺⼨。
参考函数:glutInitWindowPosition(int x, int y);//为窗⼝指定初始位置,窗⼝左上⾓在屏幕上的位置为(x,y) glutInitWindowSize(int width, int height); //设置窗⼝⼤⼩4、背景⾊的设置。
在默认情况下背景⾊是⿊⾊。
要求:(1)将窗⼝背景设置为⽩⾊(2)将窗⼝背景设置为其他颜⾊参考函数:glClearColor(r,g,b,alpha);//设置背景颜⾊,此函数放在display()中,并且放在glClear(GL_COLOR_BUFFER_BIT);语句的前⾯。
计算机图形学OpenGL版实验1-4
实验1 OpenGL初识一、实验目的:熟悉编程环境;了解光栅图形显示器的特点;了解计算机绘图的特点;利用VC+OpenGL作为开发平台设计程序,以能够在屏幕上生成任意一个像素点为本实验的结束。
二、实验内容:(1)了解和使用VC的开发环境,理解简单的OpenGL程序结构。
(2)掌握OpenGL提供的基本图形函数,尤其是生成点的函数。
三、该程序的作用是在一个黑色的窗口中央画一个矩形、三角形和三个点,如图所示。
下面对各行语句进行说明:首先,需要包含头文件#include <GL/glut.h>,这是GLUT的头文件。
然后看main函数。
int main(int argc, char *argv[]),这个是带命令行参数的main函数。
这种以glut开头的函数都是GLUT工具包所提供的函数,下面对用到的几个函数进行介绍;1)glutInit,对GLUT进行初始化,这个函数必须在其它的GLUT使用之前调用一次。
其格式比较固定,一般都是glutInit(&argc, argv)就行;2) glutInitDisplayMode,设置显示方式,其中GLUT_RGB表示使用RGB颜色,与之对应的还有GLUT_INDEX(表示使用索引颜色)。
GLUT_SINGLE表示使用单缓冲,与之对应的还有GLUT_DOUBLE(使用双缓冲)。
更多信息,以后的实验教程会有讲解介绍;3) glutInitWindowPosition,设置窗口在屏幕中的位置;4) glutInitWindowSize,设置窗口的大小;5) glutCreateWindow,根据前述设置的信息创建窗口。
参数将被作为窗口的标题。
注意:窗口被创建后,并不立即显示到屏幕上。
需要调用glutMainLoop才能看到窗口;6) glutDisplayFunc,设置一个函数,当需要进行画图时,这个函数就会被调用。
(暂且这样理解);7) glutMainLoop,进行一个消息循环。
opengl简单入门实例
opengl简单⼊门实例实现任务⽬标:使⽤纹理贴图,增强可视效果应⽤坐标变换,实现场景中不同物体重建采⽤双缓冲技术,实现场景实时绘制具有⼀定的⿏标、键盘交互功能先放效果⿏标的交互功能有:右键暂停转动,左键继续转动,滚轮向前放⼤,向后缩⼩IDE:opengl实现需要库函数。
⽤的编译环境是visual studio。
附上⼀个很好的教程【1】:。
(vs2019也可以⽤)⼀个很好的⼊门教程【2】:。
讲得很仔细,通俗易懂。
前⼏课⽤到的库都没有超过glut的范围。
事实上,对于opengl的实现主要是对于各种库函数的调⽤,所以对于各种库函数的认知很重要。
这⾥也给出⼀个很好的教程【3】:。
ok,在看了上⾯的教程以后肯定对于opengl有了⼀定认识,尤其是第⼆个教程中讲解得⾮常仔细。
所以本⽂接下来的内容是建⽴在对那个教程的学习基础之上,对⼀些我在实践中遇到的问题作出补充。
下⾯就进⼊正⽂。
所包含的头⽂件⽬录1 #include <GL/glut.h>2 #include <stdlib.h>3 #include <stdio.h>最基本的功能是当然是创建⾃⼰的图形并显⽰出来,如上图我创建的是⽇地⽉系统。
需要的函数为display()和main()。
这其中很重要的⼀个知识点就是图像的视图变换/模型变换、投影变换和视⼝变换。
有关这块的内容个⼈觉得教程【2】中讲得不够清楚,可以参考⼀些别的教程。
⽐如:;。
这⾥要介绍⼀下opengl中的坐标轴。
x轴⽔平向右为正,y轴竖直向上为正,z轴垂直屏幕向外为正。
符合右⼿定则。
2020/5/15 13:06:37 对于图像的各种变换做⼀个⼩的补充视图变换即设置/改变观察点的位置,可以这么理解,相当于选择⼀个位置和⽅向设置⼀台照相机。
针对glLookAt()函数⽽⾔,它⼀共有九个参数,3对坐标值。
第⼀对三维坐标是观察点(照相机)在世界坐标中的位置,第⼆对三维坐标是被观察点(物体)的位置。
OpenGL进行简单的通用计算实例
OpenGL进⾏简单的通⽤计算实例博主作为OpenGL新⼿,最近要⽤OpenGL进⾏并⾏的数据计算,突然发现这样的资料还是很少的,⼤部分资料和参考书都是讲⽤OpenGL进⾏渲染的。
好不容易找到⼀本书《GPGPU编程技术,从OpenGL、CUDA到OpenCL》,⾥⾯对并⾏处理的发展进⾏了系统性的介绍,还是很不错的。
⼩⽩博主很兴奋,看完书中第三章后恍然⼤悟了很多,就贴出书中代码3-3的例⼦,实现⼀番,并⽤⼀副图⽚数据做了实现。
实现环境:Window7 32bit, VS2013+OpenGL3.3+GLEW+GLFW。
OpenGL⽤来进⾏通⽤数据计算的流程如下图,数据从CPU(应⽤程序)中通过“⽤绘制来调⽤”发送到纹理缓存,以纹理映射的⽅式给到着⾊器,最后经过⽚段着⾊器的计算(GLSL语⾔)后,再将结果输出到纹理缓存,最后CPU(应⽤程序)再从纹理缓存中读取结果数据,⾄此计算完成。
1.书中代码3-3,输⼊⼀组数据到纹理缓存,然后再从纹理缓存中读取这组数据,代码以及实验结果如下:数据类型就设置为float,将数据发送⾄纹理缓存要⽤这个函数glTexSubImage2D( );#include <iostream>#include <stdlib.h>#include <stdio.h>#define GLEW_STATIC#include <GL/glew.h>#include <GLFW/glfw3.h>using namespace std;#define WIDTH 2#define HEIGHT 3int main(int argc, char** argv){int nWidth=(int)WIDTH;int nHeight=(int)HEIGHT;int nSize=(int)nWidth*nHeight;//创建输⼊数据float* pfInput=new float[4*nSize];float* pfOutput=new float[4*nSize];for (int i=0; i<nSize*4; i++){pfInput[i]= (float)(i + 1.2345);}//初始化并设置GLFWglfwInit();glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);//创建GLFW窗⼝GLFWwindow* window = glfwCreateWindow(3, 2, "LearnOpenGL", nullptr, nullptr);glfwMakeContextCurrent(window);//初始化GLEW//glewExperimental = GL_TRUE;glewInit();//创建FBO并绑定GLuint fb;glGenFramebuffersEXT(1, &fb);glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fb);//创建纹理对象并绑定GLuint tex;glGenTextures(1, &tex);glBindTexture(GL_TEXTURE_2D, tex);//设置纹理参数glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);//将纹理关联到FBOglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, tex, 0); //将纹理数据设置为单精度浮点数glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA_FLOAT32_ATI, nWidth, nHeight,0, GL_RGBA, GL_FLOAT, NULL);//将数据传⾄输⼊纹理缓存//glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, nWidth, nHeight, 0, GL_RGBA, GL_FLOAT, pfInput);glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, nWidth, nHeight, GL_RGBA, GL_FLOAT, pfInput);//从输出纹理缓存中读出数据glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);glReadPixels(0,0, nWidth, nHeight, GL_RGBA, GL_FLOAT, pfOutput);//打印并检查结果bool bCap=true;for (int i=0; i<nSize*4; i++){cout<<i<<":\t"<<pfInput[i]<<'\t'<<pfOutput[i]<<endl;if (pfInput[i]!=pfOutput[i]) bCap=false;}if (bCap) cout<<"Round trip complete!"<<endl;else cout<<"Round trip failed!" <<endl;delete pfInput;delete pfOutput;glDeleteFramebuffers(1, &fb);glDeleteTextures(1, &tex);system("pause");return0;}View Code2.读取⼀幅图像,写⼊纹理缓存并从纹理缓存读出,配合OpenCV使⽤。
OpenGL项目:绘制简单场景
计算机图形学报告(项目一)专业:计算机科学与技术姓名:学号:班级:目录1.引言 (3)1.1编写目的 (3)1.2项目背景 (3)2.开发结果 (3)2.1开发环境 (3)2.2主要功能及性能 (3)2.3场景介绍 (3)2.4操作介绍 (4)2.5灯光介绍 (6)3.总结 ............................................................................................................. 错误!未定义书签。
4.参考文献 ..................................................................................................... 错误!未定义书签。
5.代码 ............................................................................................................. 错误!未定义书签。
1.引言1.1编写目的利用OpenGL绘制一个简单的场景–包含球、正方形、网格数据–交互操作:平移、缩放、旋转–可以使用不同的灯光1.2项目背景openGL编程在计算机图形学中具有非常重要的作用,是实现计算机图形的一个重要工具,通过openGL编程,我们能更好的学习计算机图形学,同时也能提高我们自己的实际动手能力。
2.开发结果2.1开发环境Windows7旗舰版Vs20122.2主要功能及性能利用OpenGL绘制一个简单的场景–包含球、正方形、网格数据–交互操作:平移、缩放、旋转–可以使用不同的灯光2.3场景介绍绘制一个简单的场景,包含球、正方形、网格数据。
如图:2.4操作介绍利用上下左右方向键进行上下左右移动,如图:利用home,end,pgup,insertj进行上下左右的旋转,如图:2.5灯光介绍包括三中灯光:环境光,漫射光,平面光利用鼠标右键进行灯光选择:漫射光如图:3.总结4.参考文献1、OpenGL超级宝典2、博客:vs2012中OpenGL配置3、计算机图像学基础5.代码// DiffuseLight.cpp// OpenGL SuperBible// Demonstrates simple diffuse lighting // Program by Richard S. Wright Jr.#include<GLTools.h>// OpenGL toolkit #include<GLMatrixStack.h>#include<GLFrame.h>#include<GLFrustum.h>#include<GLGeometryTransform.h>#include<StopWatch.h>#include<math.h>#ifdef __APPLE__#include<glut/glut.h>#else#define FREEGLUT_STATIC#include<GL/glut.h>#endifGLFrame viewFrame; GLFrustum viewFrustum; GLTriangleBatch sphereBatch;//GLBatch sphereBatch; GLMatrixStack modelViewMatrix; GLMatrixStack projectionMatrix; GLGeometryTransform transformPipeline; GLShaderManager shaderManager;GLuint ADSLightShader;GLint locAmbient;GLint locDiffuse;GLint locSpecular;GLint locLight;GLint locMVP;GLint locMV;GLint locNM;GLint lightOnOff = 0;//pointsstatic const float vertex_list[][3] = {-0.5f, -1.5f, -0.5f,0.5f, -1.5f, -0.5f,0.5f, -0.5f, -0.5f,-0.5f, -0.5f, -0.5f,-0.5f, -1.5f, 0.5f,0.5f, -1.5f, 0.5f,0.5f, -0.5f, 0.5f,-0.5f, -0.5f, 0.5f,};//points connectstatic const GLint index_list[][4] = {{0, 1, 2, 3},{3, 2, 6, 7},{4, 5, 6, 7},{0, 1, 5, 4},{1, 5, 6, 2},{0, 4, 7, 3}};// draw cubevoid DrawCube(void){int i,j;glColor3f(1.0, 0.0, 0.0);glBegin(GL_QUADS);for(i=0; i<6; ++i){for(j=0; j<4; ++j){glVertex3fv(vertex_list[index_list[i][j]]);}}glEnd();}void SetupRC(void){// BackgroundglClearColor(0.0f, 1.0f, 0.0f, 1.0f );glEnable(GL_DEPTH_TEST);glEnable(GL_CULL_FACE);shaderManager.InitializeStockShaders();//viewFrame.MoveForward(4.0f);// Make the spheregltMakeSphere(sphereBatch, 0.5f, 26, 13);ADSLightShader = shaderManager.LoadShaderPairWithAttributes("ADSGouraud.vp", "ADSGouraud.fp", 2, GLT_ATTRIBUTE_VERTEX, "vVertex",GLT_ATTRIBUTE_NORMAL, "vNormal");locAmbient = glGetUniformLocation(ADSLightShader, "ambientColor");locDiffuse = glGetUniformLocation(ADSLightShader, "diffuseColor");locSpecular = glGetUniformLocation(ADSLightShader, "specularColor");locLight = glGetUniformLocation(ADSLightShader, "vLightPosition");locMVP = glGetUniformLocation(ADSLightShader, "mvpMatrix");locMV = glGetUniformLocation(ADSLightShader, "mvMatrix");locNM = glGetUniformLocation(ADSLightShader, "normalMatrix");}// Cleanupvoid ShutdownRC(void){}。
OpenGL自行车
GIS专业实验报告(计算机图形学)实验4 使用opengl进行层次模型的编程设计------以简单自行车模型为例用c++调用opengl图形函数库,通过显示列表的嵌套实现复杂物体的层次建模。
设计一个包含框架和两个轮子的自行车。
二.理论基础1.显示列表:2.显示列表的调用:3.OpenGL划线函数:4.OpenGL画圆函数:5.OpenGL绘制闭合画线函数:三.算法设计与分析程序源码如下:#include <windows.h>#include <gl/glut.h>GLuint Wheel;GLuint Frame;void Initial(void){glClearColor(1.0f, 1.0f, 1.0f, 1.0f);Wheel = glGenLists(1);glNewList(Wheel, GL_COMPILE);glColor3f(1.0, 0.0, 1.0);glTranslatef(-42.0, -30.0, 0.0);glutSolidTorus(0.3, 20.0, 15, 1000); //线条粗细,半径,/***********前轮**********/glColor3f(1.0, 0.0, 1.0);glTranslatef(84.0, 0.0, 0.0);glutSolidTorus(0.3, 20.0, 15, 50);/********后轮*********/glColor3f(1.0, 0.0, 1.0);glTranslatef(-84.0, 0.0, 0.0);glutSolidTorus(0.2, 5.0, 15, 50);/********前齿轮*********/glColor3f(0.0, 1.0, 0.0);glTranslatef(40.0, 0.0, 0.0);glutSolidTorus(0.2, 7.0, 15, 50);/********中间齿轮*********/glColor3f(0.0, 1.0, 0.0);glTranslatef(44.0, 0.0, 0.0);glutSolidTorus(0.2, 5.0, 15, 50);/********后齿轮*********/glEndList();Frame = glGenLists(1);glNewList(Frame, GL_COMPILE);glColor3f(0.0, 0.0, 1.0);glLineWidth(3);glTranslatef(-20.0, 20.0, 0.0);glBegin(GL_LINES); //三角形支架glVertex2i(-10,5);glVertex2i(50,5);glEnd();glBegin(GL_LINES);glVertex2i(-10,5);glVertex2i(20,-35);glEnd();glBegin(GL_LINES);glVertex2i(20,-35);glVertex2i(50,5);glEnd();/***********三角形支架*************/glBegin(GL_LINES); //前轮连杆glVertex2i(-6,20);glVertex2i(-20,-35);glEnd();/**********前轮连杆****************/glBegin(GL_LINES); //车把glVertex2i(-15,21);glVertex2i(3,19);glEnd();glBegin(GL_LINES);glVertex2i(-15,21);glVertex2i(-8,25);glEnd();glBegin(GL_LINES);glVertex2i(3,19);glVertex2i(9,23);glEnd();/*********车把*************/glBegin(GL_LINES); //后轮连杆glVertex2i(50,5);glVertex2i(64,-35);glEnd();glBegin(GL_LINES);glVertex2i(50,5);glVertex2i(50,6 );glEnd();glBegin(GL_LINES);glVertex2i(20,-35);glVertex2i(25,-45);glEnd();glBegin(GL_LINES);glVertex2i(25,-45);glVertex2i(22,-48);glEnd();/***********后轮连杆*************/glColor3f(0.5, 1, 0.5);glLineWidth(2);glBegin(GL_LINES); //链条(上)glVertex2i(20,-28);glVertex2i(64,-30);glEnd();/***********链条(上)****************/glBegin(GL_LINES); //链条(下)glVertex2i(20,-42);glVertex2i(64,-40);glEnd();/************链条(下)********************//****************车座**************/glColor3f(1.0, 0.5, 0.0);glLineWidth(3);glBegin(GL_LINE_LOOP); //车座glVertex2i(45,10);glVertex2i(44,9);glVertex2i(44,8);glVertex2i(55,5);glVertex2i(55,6);glVertex2i(55,7);glVertex2i(54,12);glVertex2i(53,13);glEnd();glEndList();}void ChangeSize(int w, int h){glViewport(0, 0, w, h);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D (-70.0f, 70.0f, -70.0f, 70.0f);}void Display(void){glClear(GL_COLOR_BUFFER_BIT);glMatrixMode(GL_MODELVIEW);glLoadIdentity();glTranslatef(0.0, 0.0, 0.0);glCallList(Frame); //调用支架显示列表glTranslatef(22.0, -5.0, 0.0);glCallList(Wheel); //调用轮子显示列表glFlush();}int main(int argc, char* argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);glutInitWindowSize(800,600);glutInitWindowPosition(200,200);glutCreateWindow("OpenGL二维自行车——姓名:殷悦——学号:2010203482");glutDisplayFunc(Display);glutReshapeFunc(ChangeSize);Initial();glutMainLoop();return 0;}四.程序调试及运行结果的自我分析与自我评价大家根据自己能力调试自行车。
写给 python 程序员的 opengl 教程
一、介绍1.1 什么是OpenGL在计算机图形学中,OpenGL是一种应用编程接口(API),用于渲染二维和三维矢量图形。
它提供了一组函数,用于处理复杂的图形任务,如三维建模、渲染和动画制作。
1.2 为何学习OpenGL如果你是一名Python程序员,对图形编程感兴趣,那么学习OpenGL将为你打开全新的视野。
OpenGL具有强大的功能和广泛的应用领域,掌握它可以让你在图形编程领域更加游刃有余。
二、基础知识2.1 安装OpenGL在Python中,你可以使用PyOpenGL库来使用OpenGL。
你可以通过pip安装PyOpenGL库:```pythonpip install PyOpenGL```2.2 准备环境在开始编写OpenGL程序之前,你需要安装Python和OpenGL的开发环境。
确保你的计算机上已经安装了OpenGL的驱动程序,以及Python的开发环境。
2.3 理解OpenGL的基本结构OpenGL程序的基本结构包括初始化、设置视口、加载顶点和片段着色器、渲染和清理缓冲区等步骤。
在编写OpenGL程序之前,你需要了解这些基本结构。
三、绘制图形3.1 绘制三角形在OpenGL中,绘制一个三角形是最基本的图形绘制操作。
你可以通过设置顶点的坐标、颜色等信息,来绘制一个三角形。
3.2 绘制正方形类似地,你可以通过设置顶点的坐标,来绘制一个正方形。
3.3 绘制其他图形除了三角形和正方形,OpenGL还支持绘制更多种类的图形,如圆形、多边形等。
四、使用着色器4.1 顶点着色器在OpenGL中,着色器是一种用来处理图形数据的程序,它可以控制顶点的位置、颜色等属性。
你可以编写自定义的顶点着色器,来实现更加复杂的图形效果。
4.2 片段着色器片段着色器用来处理像素的颜色、光照等属性。
你可以编写自定义的片段着色器,来实现更加真实的图形效果。
五、渲染5.1 渲染到窗口通过设置OpenGL视口,你可以将绘制的图形渲染到窗口中,以实现图形的显示。
OpenGL图形编程2基本图形绘制(陈永强)只是分享
31
2.4多边形面的绘制
多边形面的属性 颜色
glShadeModel(GL_FLAT) 指定多边形最后一个顶点 时的当前颜色作为填充多边形的纯色,唯一例外 是GL_POLYGON图元,它采用的是第一个顶点的 颜色。
glGetFloatv(GL_LINE_WIDTH_GRANULARITY,&step);
数组 sizes中保存了glLineWidth的最小有效值和最大有效值,而变量step将 保存线宽之间允许的最小增量。OpenGL规范只要求支持一种线宽:1.0。
Microsoft的OpenGL实现允许线宽从0.5到10.0,最小增量为 0.125。
点的坐标(x,y,z,w)实际上构成了一个齐次坐标。在OpenGL中 ,仍然使用规范化齐次坐标以保证点的齐次坐标与三维坐标的一一对应关 系,最后指定的空间点的坐标为(x/w,y/w,z/w,1),w成了坐
标值的一个缩放因子。
5
2.2点的绘制
点的绘制 glBegin(GL_POINTS); glVertex3f(0.0f, 0.0f, 0.0f); glVertex3f(10.0f, 0.0f, 0.0f); glEnd();
与点的大小类似,glLineWidth函数采用一个参数 来指定要画的线以象素计的近似宽度 。
15
2.3直线的绘制
直线的属性
线宽
可以用下面的代码来获取线宽范围和它们之间的最小间隔:
GLfloat sizes[2]; //保存线宽的尺寸范围
GLfloat step;
//保存线宽尺寸的最小间隔
Байду номын сангаас
glGetFloarv(GL_LINE_WIDTH_RANGE,sizes);
一个OPENGL台球实例
//一个OPENGL台球实例――――#include <gl/glut.h>#include <stdio.h>#include <stdlib.h>#include <math.h>#include <string.h>#include <time.h>#include <windows.h>#include <mmsystem.h>#pragma comment(lib, "OPENGL32.LIB")#pragma comment(lib, "glu32.lib")#pragma comment(lib, "glaux.lib")#pragma comment(lib, "winmm.lib")#define WIDTH 1024#define HEIGHT 768#define BMP_Header_Length 54#define PI 3.1415926#define L0 GL_LIGHT0#define L1 GL_LIGHT1//变量申明GLint font=(int)GLUT_BITMAP_HELVETICA_12,width=1024,height=768; GLuint texGround,texWall,thb,texzb,texqz,thb1,texqg,texgt,texhe;int mx=0,my=0,i=0,j=0,k=0,bcnt=16,jds=0,hqg=0,jiqiu=0;int leftm=0,rightm=0;GLfloat rx,ry,rz,speed=0;static GLfloat kx=0,ky=0,kz=0,zoom=300;static GLfloat anglex=0,angley=90,nowanglex=0,nowangley=0,nowatx=0,nowaty=0; static GLfloat at[6]={0.0,300.0,500.0,0.0,80.0,0.0};static GLfloat M=1,U=0.2,T=0.1,QR=5.715,G=-4;GLfloat m[16];//定义球及位置矢量结构体struct p3{GLfloat x;GLfloat y;GLfloat z;};struct myb{ struct p3 p;struct p3 v;struct p3 a;GLfloat mv;GLfloat ma;int jd;GLuint wl;} B[16];//函数申明int power_of_two(int n);GLuint load_texture(const char* file_name);void mydball(GLfloat mybr,GLuint BALL);void myinitball();void mycolide(int j,int k);void mybianyuan(int j);void myjindai(int j);void mylight(GLint lh,GLfloat lx,GLfloat ly,GLfloat lz,GLfloat lm);void renderoom(void);void renderqz(void);void myinitload();void myIdle(void);void myDisplay(void);static void key(unsigned char key,int x,int y);static void mymouse(int mbutton,int mstate,int x,int y);static void mymotion(int x,int y);void myhqg(GLfloat mspeed);void mystring(float x, float y, void *font, char* c);void myto2d();void myto3d();int main(int argc, char* argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_STENCIL);glutInitWindowPosition(200, 100);glutInitWindowSize(WIDTH, HEIGHT);glutCreateWindow("OpenGL光照演示");glutFullScreen();myinitball();glutDisplayFunc(&myDisplay);glutKeyboardFunc(key); //设置键盘回调函数glutIdleFunc(&myIdle); //设置窗口刷新的回调函数glutMouseFunc(mymouse); //设置鼠标器按键回调函数glutMotionFunc(mymotion); //设置鼠标器移动回调函数mylight(L1,0,390,0,1); //光照模型glutMainLoop();return 0;}void myDisplay(void){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glMatrixMode(GL_PROJECTION);// 创建透视效果视图glLoadIdentity();gluPerspective(60.0f, 16.0/9, 1, 10000.0f);glTranslatef(kx,ky,kz);glMatrixMode(GL_TEXTURE);glLoadIdentity();glMatrixMode(GL_MODELVIEW);glLoadIdentity();gluLookAt(at[0],at[1],at[2],at[3],at[4],at[5], 0.0, 1.0, 0.0);renderoom();renderqz();for(i=0;i<bcnt;i++){if(B[i].jd==0){for (j=0; j < 15; j++) m[j] = 0.0;m[0] = m[5] = m[10] = 1.0;m[7] = (-1.0)/405;glPushMatrix();glTranslatef(B[i].p.x,B[i].p.y,B[i].p.z);glPushMatrix();glTranslatef(0, 400, 0);glMultMatrixf(m);glTranslatef(0, -400, 0);glDepthMask(GL_FALSE);glEnable (GL_BLEND);glColor4f(0.3,0.3,0.3,0.5);glBlendFunc(GL_SRC_ALPHA, GL_DST_COLOR);mydball(QR, texhe);glDisable (GL_BLEND);glDepthMask(GL_TRUE);glPopMatrix();glRotatef(B[i].ma, B[i].a.x, B[i].a.y, B[i].a.z);mydball(QR,B[i].wl);glPopMatrix();}else{glPushMatrix();glTranslatef(B[i].p.x,B[i].p.y,B[i].p.z);mydball(QR,B[i].wl);glPopMatrix();}}if(hqg==1) myhqg(speed);glutSwapBuffers();}void myIdle(void){GLfloat vx=0,vz=0;at[0]=zoom*(cos(anglex))+at[3];at[1]=zoom*(sin(angley))+at[4];at[2]=zoom*(sin(anglex))+at[5];for(i=0;i<bcnt;i++){if(B[i].jd==0){for(k=i+1;k<bcnt;k++) mycolide(i,k);//碰撞检测mybianyuan(i);myjindai(i);B[i].mv=pow(B[i].v.x,2)+pow(B[i].v.z,2);if(B[i].mv>0.1){B[i].mv=sqrt(B[i].mv);vx=B[i].v.x/B[i].mv;vz=B[i].v.z/B[i].mv;B[i].mv+=G*T;B[i].v.x=B[i].mv*vx;B[i].v.z=B[i].mv*vz;B[i].p.x+=B[i].v.x*T;B[i].p.z+=B[i].v.z*T;B[i].a.x=(-1)*vz;B[i].a.z=vx;B[i].ma+=-180*B[i].mv*T/(QR*PI);}else B[i].mv=0;}}if(hqg==1){if(speed>200) speed-=200;else speed+=2;}if(jiqiu==1){GLfloat atxy=0;atxy=sqrt(pow(at[3]-at[0],2)+pow(at[5]-at[2],2));B[0].v.x=speed*(at[3]-at[0])/atxy;B[0].v.z=speed*(at[5]-at[2])/atxy;jiqiu=0;speed=0;}if(leftm){B[0].v.x=0;B[0].v.z=0;speed=0;}myDisplay();}void myinitball(){GLfloat hhh;hhh=2*QR*sin(PI/3);B[0].p.x=0; B[0].p.y=80; B[0].p.z=-70;B[1].p.x=0; B[1].p.y=80; B[1].p.z=70;B[2].p.x=-3*QR; B[2].p.y=80; B[2].p.z=70.0+3.0*hhh;B[3].p.x=-1*QR; B[3].p.y=80; B[3].p.z=70+hhh;B[4].p.x=4*QR; B[4].p.y=80; B[4].p.z=70+4.0*hhh;B[5].p.x=2*QR; B[5].p.y=80; B[5].p.z=70+2.0*hhh;B[6].p.x=-2*QR; B[6].p.y=80; B[6].p.z=70+4.0*hhh;B[7].p.x=QR; B[7].p.y=80; B[7].p.z=70+3.0*hhh;B[8].p.x=0; B[8].p.y=80; B[8].p.z=70+2.0*hhh;B[9].p.x=2*QR; B[9].p.y=80; B[9].p.z=70+4.0*hhh;B[10].p.x=QR; B[10].p.y=80; B[10].p.z=70+hhh;B[11].p.x=-1*QR; B[11].p.y=80; B[11].p.z=70+3.0*hhh;B[12].p.x=0; B[12].p.y=80; B[12].p.z=70+4.0*hhh;B[13].p.x=-4*QR; B[13].p.y=80; B[13].p.z=70+4.0*hhh;B[14].p.x=-2*QR; B[14].p.y=80; B[14].p.z=70.0+2.0*hhh;B[15].p.x=3*QR; B[15].p.y=80; B[15].p.z=70+3.0*hhh;for(i=0;i<bcnt;i++){B[i].v.x=0; B[i].v.y=0; B[i].v.z=0;B[i].a.x=0; B[i].a.y=0; B[i].a.z=0;B[i].jd=0;B[i].mv=0;B[i].ma=0;}myinitload();}void mycolide(int j,int k){GLfloat rr,cx,cy,ccx,ccy,v1c,v1cc,v2c,v2cc;rr=sqrt(pow(B[k].p.x-B[j].p.x,2)+pow(B[k].p.z-B[j].p.z,2));if(rr<2*QR-1){PlaySound("audio/hit.wav", NULL, SND_FILENAME | SND_ASYNC);cx=(B[k].p.x-B[j].p.x)/rr;cy=(B[k].p.z-B[j].p.z)/rr;ccx=cy*(-1);ccy=cx;v1c=B[j].v.x*cx+B[j].v.z*cy;v1cc=B[j].v.x*ccx+B[j].v.z*ccy;v2c=B[k].v.x*cx+B[k].v.z*cy;v2cc=B[k].v.x*ccx+B[k].v.z*ccy;B[j].v.x=v1cc*ccx+v2c*cx;B[j].v.z=v1cc*ccy+v2c*cy;B[k].v.x=v1c*cx+v2cc*ccx;B[k].v.z=v1c*cy+v2cc*ccy;B[k].p.x=B[j].p.x+2*QR*cx;B[k].p.z=B[j].p.z+2*QR*cy;}}void mybianyuan(int j){if(abs(B[j].p.x)>72-2*QR ){if(B[j].p.x>0) B[j].p.x=72-2*QR;if(B[j].p.x<0) B[j].p.x=-72+2*QR;B[j].v.x*=(-1);}if(abs(B[j].p.z)>137-2*QR ){if(B[j].p.z>0) B[j].p.z=137-2*QR;if(B[j].p.z<0) B[j].p.z=-137+2*QR;B[j].v.z*=(-1);}}void myjindai(int j){GLfloat hhh;hhh=2*QR*sin(PI/3);if(sqrt(pow(B[j].p.x-(-65),2)+pow(B[j].p.z-(-135),2))<15 ||sqrt(pow(B[j].p.x-65,2)+pow(B[j].p.z-(-135),2))<15 ||sqrt(pow(B[j].p.x-(-65),2)+pow(B[j].p.z-135,2))<15 ||sqrt(pow(B[j].p.x-65,2)+pow(B[j].p.z-135,2))<15 ||sqrt(pow(B[j].p.x-(-70),2)+pow(B[j].p.z,2))<12 ||sqrt(pow(B[j].p.x-70,2)+pow(B[j].p.z,2))<12 ){if(j==0) {B[0].p.x=0; B[0].p.y=80; B[0].p.z=-70;}else if(j==8) {B[8].p.x=0; B[8].p.y=80; B[8].p.z=70+2.0*hhh;}else{B[j].jd=1;jds+=1;B[j].p.z=-100+jds*20;B[j].p.y=80;if(j>8) B[j].p.x=100;else B[j].p.x=-100;}B[j].v.x=0;B[j].v.y=0;B[j].v.z=0;}}static void key(unsigned char key,int x,int y){switch (key){case 27 :exit(0);case 'd' :case 'D' :if(kx>-490) kx-=10;break;case 'a':case 'A':if(kx<490) kx+=10;break;case 'w':case 'W':zoom-=10;if(zoom<10) zoom=10;break;case 's':case 'S':zoom+=10;if(zoom>500) zoom=500;break;}}static void mymouse(int mbutton,int mstate,int x,int y){mx=x;my=y;if(mbutton==GLUT_LEFT_BUTTON && mstate==GLUT_DOWN){ nowatx=kx;nowaty=ky;leftm=1;rightm=0;}else {leftm=0;}if(mbutton==GLUT_MIDDLE_BUTTON && mstate==GLUT_DOWN){at[3]=B[0].p.x; at[4]=B[0].p.y; at[5]=B[0].p.z; }if(mbutton==GLUT_RIGHT_BUTTON && mstate==GLUT_DOWN){nowanglex=anglex;nowangley=angley;leftm=0;rightm=1;hqg=1; }else {rightm=0;hqg=0;}if(mbutton==GLUT_RIGHT_BUTTON && mstate==GLUT_UP) jiqiu=1;else jiqiu=0;}static void mymotion(int x,int y){if(leftm) { kx=nowatx+x-mx; ky=nowaty+y-my; }if(rightm) {anglex=nowanglex+(x-mx)*0.01; angley=nowangley+(y-my)*0.01;} }void myinitload(){B[1].wl=load_texture("tex/B1.bmp");B[2].wl=load_texture("tex/B2.bmp");B[3].wl=load_texture("tex/B3.bmp");B[4].wl=load_texture("tex/B4.bmp");B[5].wl=load_texture("tex/B5.bmp");B[6].wl=load_texture("tex/B6.bmp");B[7].wl=load_texture("tex/B7.bmp");B[8].wl=load_texture("tex/B8.bmp");B[9].wl=load_texture("tex/B9.bmp");B[10].wl=load_texture("tex/B10.bmp");B[11].wl=load_texture("tex/B11.bmp");B[12].wl=load_texture("tex/B12.bmp");B[13].wl=load_texture("tex/B13.bmp");B[14].wl=load_texture("tex/B14.bmp");B[15].wl=load_texture("tex/B15.bmp");B[0].wl=load_texture("tex/B16.bmp");texGround=load_texture("tex/DB.bmp");texWall=load_texture("tex/wood.bmp");thb=load_texture("tex/thb2.bmp");thb1=load_texture("tex/thb1.bmp");texzb=load_texture("tex/zb.bmp");texqz=load_texture("tex/qz.bmp");texqg=load_texture("tex/QG.bmp");texgt=load_texture("tex/GT.bmp");texhe=load_texture("tex/black.bmp");}int power_of_two(int n){if( n <= 0 )return 0;return (n & (n-1)) == 0;}GLuint load_texture(const char* file_name){GLint width, height, total_bytes;GLubyte* pixels = 0;GLuint last_texture_ID, texture_ID = 0;FILE* pFile = fopen(file_name, "rb");if( pFile == 0 )return 0;fseek(pFile, 0x0012, SEEK_SET);fread(&width, 4, 1, pFile);fread(&height, 4, 1, pFile);fseek(pFile, BMP_Header_Length, SEEK_SET);{GLint line_bytes = width * 3;while( line_bytes % 4 != 0 ) ++line_bytes;total_bytes = line_bytes * height;}pixels = (GLubyte*)malloc(total_bytes);if( pixels == 0 ) {fclose(pFile); return 0;}if( fread(pixels, total_bytes, 1, pFile) <= 0 ) { free(pixels); fclose(pFile); return 0; } {GLint max;glGetIntegerv(GL_MAX_TEXTURE_SIZE, &max);if( !power_of_two(width) || !power_of_two(height) || width > max || height > max ){const GLint new_width = 256;const GLint new_height = 256; // 规定缩放后新的大小为边长的正方形GLint new_line_bytes, new_total_bytes;GLubyte* new_pixels = 0;new_line_bytes = new_width * 3;while( new_line_bytes % 4 != 0 )++new_line_bytes;new_total_bytes = new_line_bytes * new_height;new_pixels = (GLubyte*)malloc(new_total_bytes);if( new_pixels == 0 ) { free(pixels); fclose(pFile); return 0; }gluScaleImage(GL_RGB,width, height, GL_UNSIGNED_BYTE, pixels,new_width, new_height, GL_UNSIGNED_BYTE, new_pixels);free(pixels);pixels = new_pixels;width = new_width;height = new_height;}}glGenTextures(1, &texture_ID);if( texture_ID == 0 ) { free(pixels); fclose(pFile); return 0; }glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture_ID);glBindTexture(GL_TEXTURE_2D, texture_ID);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEA T);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_BGR_EXT, GL_UNSIGNED_BYTE, pixels);glBindTexture(GL_TEXTURE_2D, last_texture_ID);free(pixels);return texture_ID;}void mylight(GLint lh,GLfloat lx,GLfloat ly,GLfloat lz,GLfloat lm){glPushMatrix();{/********* 光照处理**********/GLfloat light_ambient[] = { 0.5, 0.5, 0.5, 1 };GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1 };GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };GLfloat light_position0[] = { lx, ly, lz ,lm }; //定义光位置得齐次坐标(x,y,z,w),如果w=1.0,为定位光源(也叫点光源),如果w=0,为定向光源(无限光源),定向光源为无穷远点,因而产生光为平行光。
使用PyOpenGL绘制三维坐标系实例
使⽤PyOpenGL绘制三维坐标系实例我就废话不多说了,直接上代码吧!def drawCoordinate():'''绘制三维的坐标系,并绘制由坐标轴构成的平⾯的⽹格,各个坐标轴的颜⾊以及由坐标轴所引出的⽹格线的颜⾊为:x: (1.0, 0.0, 0.0)y: (0.0, 1.0, 0.0)z: (0.0, 0.0, 1.0):return:'''#设置⽹格线间的步长step = 0.2#设置⽹格线的数量、长度line_num = 15line_len = 4grid_color = [(1.0, 0.0, 0.0), (0.0, 1.0, 0.0), (0.0, 0.0, 1.0)]glLineWidth(3)origin = [0.0, 0.0, 0.0]#画出xyz轴for i in range(3):tmp = [0.0, 0.0, 0.0]tmp[i] = line_len*1.02glColor3f(*grid_color[i])glBegin(GL_LINES)glVertex3f(*origin)glVertex3f(*tmp)glEnd()# 画出由坐标轴构成的平⾯的⽹格glLineWidth(1)for i in range(3):#每次把⼀个坐标轴上引出的⽹格线都画出来,所以起点都是⼀致的start = [0.0, 0.0, 0.0]glColor3f(*grid_color[i])for j in range(line_num):end = [0.0, 0.0, 0.0]glBegin(GL_LINES)start[i] = start[i] + stepend[i] = start[i]for k in {0,1,2} - {i,}:end[k] = line_lenglVertex3f(*start)glVertex3f(*end)end[k] = 0.0glEnd()以上这篇使⽤PyOpenGL绘制三维坐标系实例就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
实验三_基于OpenGL的图形编程
实验三 基于OpenGL 的图形编程一、OpenGL简介众所周知,OpenGL 原先是Silicon Graphics Incorporated (SGI 公司)在他们的图形工作站上开发高质量图像的接口。
但最近几年它成为一个非常优秀的开放式三维图形接口。
实际上它是图形软件和硬件的接口,它包括有120多个图形函数,"GL"是 "GRAPHIC LIBRARY"的缩写,意思是“图形库”。
OpenGL 的出现使大多数的程序员能够在PC 机上用C 语言开发复杂的三维图形。
微软在Visual C++ 5中已提供了三个OpenGL 的函数库(glu32.lib, glau.lib,OpenGL32.lib),可以使我们方便地编程,简单、快速地生成美观、漂亮的图形。
二、生成OpenGL程序的基本步骤和条件本文将给出一个例子,这个例子是一个用OpenGL 显示图像的Windows 程序,通过这个程序我们也可以知道用OpenGL编程的基本要求。
我们知道,GDI 是通过设备句柄(Device Context 以下简称"DC")来绘图,而OpenGL 则需要绘制环境(Rendering Context ,以下简称"RC")。
每一个GDI 命令需要传给它一个DC ,与GDI 不同,OpenGL 使用当前绘制环境(RC)。
一旦在一个线程中指定了一个当前RC ,所有在此线程中的OpenGL 命令都使用相同的当前RC 。
虽然在单一窗口中可以使用多个RC ,但在单一线程中只有一个当前RC 。
本例将首先产生一个OpenGL RC 并使之成为当前RC ,分为三个步骤:设置窗口像素格式;产生RC ;设置为当前RC 。
1. 建立工程2.将此工程所需的OpenGL 文件和库加入到工程中A)在工程菜单中,选择"Project"(“工程”)下的"Settings"项。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
OpenGL程序实例——窗口管理
• 指定窗口的显示内容时,这个函数就会被调用
• 运行框架( glutMainLoop)
进行一个消息循环 .这个函数可以显示窗口,并且等待窗口
关闭后才会返回
OpenGL程序实例——绘制图形
• 指定窗口背景色( glClearColor)
• 设定窗口的显示模式( glutInitDisplayMode)
设置显示方式,其中GLUT_RGB表示使用RGB颜色,与之对
应的还有GLUT_INDEX(表示使用索引颜色)。 GLUT_SINGLE表示使用单缓冲,与之对应的还有 GLUT_DOUBLE(使用双缓冲)
11
OpenGL程序实例——窗口管理
• glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
• 颜色管理,使用RGB颜色模型。一种颜
色用红、绿、蓝三种颜色成分混合而成, 每种颜色成分使用0.0到1.0之间的任意 有效浮点数来表示颜色值。
14
OpenGL程序实例——绘制图形
表2.2 OpenGL的一些常用混合色
混合色 黑 红 绿 黄 蓝 紫 青 深灰 浅灰 棕 南瓜橙 粉红 紫红 白 红色成分(R) 0.0 1.0 0.0 1.0 0.0 1.0 0.0 0.25 0.75 0.60 0.98 0.98 0.60 1.0 绿色成分(G) 0.0 0.0 1.0 1.0 0.0 0.0 1.0 0.25 0.75 0.40 0.625 0.04 0.40 1.0 蓝色成分(B) 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.25 0.75 0.12 0.12 0.70 0.70 1.0
6
OpenGL的基本语法——相关库
• OpenGL核心库:gl
• OpenGL实用程序库: glu • OpenGL编程辅助库:aux • OpenGL实用程序工具包(OpenGL utility toolkit,GLUT):glut
• Windows专用库:wgl
7
OpenGL的基本语法——命名规则
目前,OpenGL标准由1992年成立的独立
财团OpenGL Architecture Review Board
(ARB)以投票方式产生,并制成规范文
档公布。
2
OpenGL的主要功能
• 模型绘制
• 模型观察
• 颜色模式 • 光照应用
• 图像效果增强
• 位图和图像处理
3
OpenGL的主要功能
• 纹理映射
5
OpenGL的绘制流程——流水线
• OpenGL命令将被放在一个命令缓冲区中,这 样命令缓冲区中包含了大量的命令、顶点数据 和纹理数据。当缓冲区被清空时,缓冲区中的 命令和数据都将传递给流水线的下一个阶段。
调用OpenGL API函数 OpenGL命 令缓冲区 变换、光照 光栅化 帧缓存
图一条简化的OpenGL绘制流水线
OpenGL程序实例1——绘制矩形
int main(int argc, char* argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); //初始化窗口的显示模式 glutInitWindowSize(400,300); //设置窗口的尺寸 glutInitWindowPosition(100,120); //设置窗口的位置 glutCreateWindow("矩形"); //创建一个名为矩形的窗口 glutDisplayFunc(Display); //设置当前窗口的显示回调函数 Initial(); //完成窗口初始化 glutMainLoop(); //启动主GLUT事件处理循环 return 0; }
//绘制黑色环
//绘制蓝色环
//绘制红色环
}
OpenGL程序实例2——绘制奥运五环
void ChangeSize(int w, int h) { glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D (-70.0f, 70.0f, -70.0f, 70.0f); }
15
OpenGL程序实例——绘制图形
• 刷新窗口的缓冲区( glClear)
• 设定投影参数
glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0,200.0,0.0,150.0);
• 绘制图形
glRectf(50.0f, 100.0f, 150.0f, 50.0f);
• 实时动画 • 交互技术
4
OpenGL的绘制流程——工作方式
• 一个完整的窗口系统的
应用软件
OpenGL图形处理系统的 结构为:最底层为图形硬 件,第二层为操作系统, 第三层为窗口系统,第四
OpenGL 窗口系统
操作系统
层为OpenGL,最上面的
层为应用软件。
图形硬件
图 OpenGL图形处理系统在 计算机系统中的层次结构
OpenGL程序实例2——绘制奥运五环
void Display(void) { glClear(GL_COLOR_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glCallList(OlympicRings); //调用显示列表 glFlush(); }
16
OpenGL程序实例1——绘制矩形
#include <gl/glut.h> void Initial(void) { glClearColor(1.0f, 1.0f, 1.0f, 1.0f); //设置窗口背景颜色为白色 glMatrixMode(GL_PROJECTION); //设置投影参数 gluOrtho2D(0.0,200.0,0.0,150.0); } void Display(void) { glClear(GL_COLOR_BUFFER_BIT); //用当前背景色填充窗口 glColor3f(1.0f, 0.0f, 0.0f); //设置当前的绘图颜色为红色 glRectf(50.0f, 100.0f, 150.0f, 50.0f); //绘制一个矩形 glFlush(); //处理所有的OpenGL程序 }
GLubyte,GLboolean GLshort GLuint,GLenum, GLbitfield
64位浮点数
double
D
Ub Us Ui
9
8位无符号整数 unsigned char 16位无符号整 unsigned short 数 32位无符号整 unsigned long 数
OpenGL程序实例——头文件包含
• 利用OpenGL实现图形绘制,首先要引
入OpenGL核心库以及其他需要使用的
库的头文件。
• GLUT保证了gl.h和glu.h被正确包含。
#include <gl/glut.h> #include <windows.h>
10
OpenGL程序实例——窗口管理
• 初始化( glutInit )
对GLUT进行初始化,这个函数必须在其它的GLUT使用之前 调用一次 glutInit(&argc, argv);
OpenGL程序实例2——绘制奥运五环
#include <gl/glut.h> GLuint OlympicRings; void Initial(void) { glClearColor(1.0f, 1.0f, 1.0f, 1.0f); OlympicRings = glGenLists(1); glNewList(OlympicRings, GL_COMPILE); glColor3f(1.0, 1.0, 0.0); glTranslatef(-22.0, 0.0, 0.0); glutSolidTorus(0.5, 20.0, 15, 50); //绘制黄色环
OpenGL程序实例2——绘制奥运五环
int main(int argc, char* argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(400,400); glutInitWindowPosition(100,100); glutCreateWindow("OpenGL模型绘制函数示例"); glutDisplayFunc(Display); glutReshapeFunc(ChangeSize); Initial(); glutMainLoop(); return 0; }
OpenGL数据类型 GLbyte GLshort GLint,GLsizei GLfloat,GLclampf 内部表示法 8位整数 16位整数 32位整数 32位浮点数 定义为C类型 signed char short long float C字面值后 缀 B S L F
GLdouble,GLclampd
25
直线的绘制
• 直线的绘制模式
– GL_LINES – GL_LINE_STRIP – GL_LINE_LOOP
P5 P5 P3 P2 P3 P2 P3
P5 P2
P4 (a)GL_LINES画线模式
P1
P4 (b)GL_LINE_LOOP画线模式 图5-57 OpenGL画线模式
P1
P4 (c)GL_LINE_STRIP画线模式
OpenGL程序实例2——绘制奥运五环
glColor3f(0.0, 1.0, 0.0); glTranslatef(44.0, 0.0, 0.0); glutSolidTorus(0.5, 20.0, 15, 50); glColor3f(0.0, 0.0, 0.0); glTranslatef(-22.0, 30.0, 0.0); glutSolidTorus(0.5, 20.0, 15, 50); glColor3f(0.0, 0.0, 1.0); glTranslatef(-42.0, 0.0, 0.0); glutSolidTorus(0.5, 20.0, 15, 50); glColor3f(1.0, 0.0, 0.0); glTranslatef(84.0, 0.0, 0.0); glutSolidTorus(0.5, 20.0, 15, 50); glEndList(); //绘制绿色环