opengl机器人纹理
opengl立方体 36个顶点与纹理坐标

opengl立方体 36个顶点与纹理坐标OpenGL是一个跨平台的图形库,它可以使用三维图形来模拟物体的外观和行为。
本文将讨论如何使用OpenGL绘制一个立方体,同时为每个面分配不同的纹理坐标,使它看起来更逼真。
步骤1:定义顶点在OpenGL中,立方体通常由8个顶点组成。
这些顶点可以通过三个轴上的坐标定义。
通过定义这些坐标,我们可以为立方体创建3D 空间。
步骤2:定义面和法向量为了呈现立方体的表面,我们需要定义立方体的面。
每个面都由四个顶点组成,可以通过将面上的顶点连接起来来定义它们。
为了计算光照的效果,我们还需要为每个面定义一个法向量。
步骤3:定义纹理坐标将纹理贴在立方体表面上,需要为每个面分配纹理坐标。
OpenGL 中,纹理坐标以0到1的范围表示。
面上各个顶点的纹理坐标被映射到整张纹理上,这样就可以使用纹理贴图来呈现立方体了。
例如,我们可以使用土地的纹理来描绘立方体的底面,并使用天空的纹理来描绘立方体的顶面。
步骤4:渲染立方体在OpenGL中,我们使用三角形绘制立方体的每个面。
每个面有两个三角形来呈现,它们都使用以前定义的顶点。
步骤5:使用着色器改进绘制为了让立方体更加逼真,我们可以使用着色器改进绘制。
着色器是OpenGL中的一种编程,它可以处理渲染过程中的颜色、光照和纹理问题。
我们可以使用着色器来为立方体添加光影效果,使其看起来更加真实。
总结在本文中,我们探讨了如何使用OpenGL绘制立方体,并为每个面分配了纹理坐标。
我们还讨论了如何使用着色器来改进绘制。
通过使用OpenGL,我们可以创建出更加逼真的三维物体,这可以应用于游戏开发、模拟和虚拟现实等领域。
opengl surface概念

opengl surface概念OpenGL Surface概念1. 引言(Introduction):概述OpenGL Surface的概念和作用。
OpenGL(Open Graphics Library)是一种用于实时渲染2D和3D图形的跨平台API,广泛用于游戏开发、计算机图形学、虚拟现实等领域。
OpenGL Surface 是其中非常重要的概念,它定义了图形对象的一个特定表面,包括其几何形状、纹理映射、颜色等属性。
本文将逐步介绍OpenGL Surface的概念、创建和渲染过程。
2. OpenGL Surface的概念(Concept of OpenGL Surface):介绍OpenGL Surface的基本概念,包括几何形状、纹理和着色器等要素。
OpenGL Surface 是由几何形状、纹理和着色器组成的。
几何形状指定了表面的形状,可以是点、线、三角形等基本图元,也可以是复杂的网格模型。
纹理是OpenGL中的图像,可以贴在表面上以增加细节和真实感。
着色器是在表面上进行光照和渲染的程序片段。
3. 创建OpenGL Surface(Creating OpenGL Surface):介绍如何创建一个OpenGL Surface。
首先,我们需要定义几何形状。
可以使用顶点数组来指定几何形状的顶点坐标,并使用索引数组来定义顶点的连接关系。
然后,我们需要创建纹理对象,加载相应的图像并设置纹理参数。
接下来,我们需要编写着色器程序,包括顶点着色器和片段着色器,前者处理顶点属性,后者处理像素颜色。
最后,我们需要创建一个顶点缓冲对象(VBO)和一个索引缓冲对象(EBO),分别保存顶点数据和索引数据。
这样,我们就创建了一个OpenGL Surface。
4. 渲染OpenGL Surface(Rendering OpenGL Surface):详细解释如何渲染一个OpenGL Surface。
首先,我们需要创建一个顶点数组对象(VAO),用于绑定VBO和EBO 以及顶点属性指针等。
机械设计制造及自动化毕业设计_基于OpenGL的机器人三维仿真环境设计

SHANGHAI UNIVERSITY毕业设计(论文)UNDERGRADUATE PROJECT (THESIS)题目:基于OpenGL的机器人三维仿真环境设计学院: 机电工程与自动化学院专业: 机械工程及自动化学号:学生姓名:指导教师:起讫日期:目录摘要:-----------------------------------------------------------------------------------------------------1 ABSTRACT-------------------------------------------------------------------------------------------------1 1第一章绪论------------------------------------------------------------------------------------------4 2第二章基于OpenGL的三维仿真图形设计---------------------------------------------------8 3第三章仿人机器人的三维建模-----------------------------------------------------------------19 4第四章仿人机器人运动学仿真-----------------------------------------------------------------29 5第五章总结-----------------------------------------------------------------------------------------466 致谢---------------------------------------------------------------------------------------------------477 参考文献---------------------------------------------------------------------------------------------48基于OpenGL的机器人三维仿真环境设计摘要仿真技术是机器人研究领域中的一个重要部分,随着机器人研究的不断深入,机器人仿真系统作为机器人设计和研究过程中安全可靠灵活方便的工具,发挥着越来越重要的作用。
opengl使用手册 简书

OpenGL(Open Graphics Library)是一种用于渲染2D和3D图形的跨平台图形API。
OpenGL提供了一系列的函数,可以用来配置图形环境、绘制几何图形、处理纹理、执行变换等。
以下是一个简要的OpenGL使用手册的概述:1. 初始化OpenGL环境:-创建OpenGL上下文,配置窗口和视口,初始化OpenGL的各种参数。
2. 设置投影和视图矩阵:-使用OpenGL的矩阵操作函数,设置投影矩阵和视图矩阵,定义场景中物体的可见范围和视图。
3. 创建和加载着色器:-编写顶点着色器和片元着色器,将它们编译成着色器程序,并链接到OpenGL上下文。
4. 创建和绑定缓冲区对象:-创建顶点缓冲对象(VBO)和索引缓冲对象(IBO)来存储顶点数据和索引数据。
5. 定义顶点数据和绘制图形:-定义顶点数据,将数据传递到缓冲区对象中,使用OpenGL函数绘制图形。
6. 处理纹理:-加载纹理图像,创建纹理对象,将纹理数据传递到GPU,使用纹理进行图形渲染。
7. 执行变换:-使用OpenGL的矩阵操作函数,对物体进行平移、旋转、缩放等变换。
8. 设置光照和材质:-配置光源和材质属性,实现光照效果。
9. 深度测试和遮挡剔除:-启用深度测试和遮挡剔除,以处理物体的深度关系和遮挡关系。
10. 处理用户输入:-处理用户输入,例如键盘和鼠标事件,以交互式地改变场景。
11. 错误处理:-添加错误检查,确保OpenGL函数的调用没有错误,方便调试。
12. 清理和释放资源:-在程序结束时清理和释放分配的OpenGL资源,防止内存泄漏。
13. OpenGL扩展:-了解和使用OpenGL的扩展,以获取更先进的图形特性。
14. 学习资源:-利用OpenGL的学习资源,包括在线教程、书籍和社区,以深入了解图形编程。
请注意,上述步骤是一个简要的概述。
OpenGL是一个庞大而灵活的库,涵盖了广泛的图形编程概念。
深入学习OpenGL需要时间和实践。
OpenGL的帧缓冲对象和浮点纹理(转载自Graphixer何咏的博客)

OpenGL的帧缓冲对象和浮点纹理(转载⾃Graphixer何咏的博客)接下来准备实现光照贴图的打包和预计算了。
因为想实现HDR,光照贴图准备存储为RGBE或浮点格式。
为了渲染浮点格式的光照贴图,就需要解决两个问题,⼀是如何让OpenGL能够真正地处理浮点格式的纹理,⽽不是把他们截断到[0,1]区间内;⼆是如何将场景渲染到浮点格式的纹理中,以便对这个纹理进⾏Tone mapping 和Bloom等操作。
今天花了⼀晚上的时间在⽹上搜索资料,学习了Frame Buffer Object的⽤法。
FBO是⽬前实现RTT和GPGPU算法最好的解决⽅案,因为它的接⼝设计相对合理,避免了显存到内存之间的数据交换。
FBO相当于各类帧缓冲,是⼀个渲染对象。
在传统的渲染管线中,渲染后的数据输出到各种帧缓冲中,如颜⾊缓冲,深度缓冲等。
有了FBO之后,就可以把数据渲染到已粘附到FBO的纹理中。
稍后将会给出具体的代码,结合代码和分析你将很容易掌握FBO的⽤法。
现在先讨论⼀下OpenGL的浮点纹理。
我们先来看⼀下OpenGL的glTexImage2D函数原型。
void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border,GLenum format, GLenum type, const GLvoid *pixels );以前,我们向纹理对象提供数据时是这样做的:glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,width,height,0,GL_RGBA,GL_UNSIGNED_BYTE,pixels);我们为Type参数提供的值是GL_UNSIGNED_BYTE表⽰我们的数据在内存中的存储格式为⽆符号字节型整数。
现在我们的纹理格式为浮点型,我们会很⾃然地想到,能不能把上述函数调⽤改为:GL_FLOAT,pixels);glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,width,height,0,GL_RGBA,GL_FLOAT来让OpenGL接收浮点纹理呢?答案是不可以。
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();}}}}。
OpenGL 设置

OpenGL 设置单击opengl设置选项卡,您将可以对显示卡的opengl 性能进行设置。
1、性能和兼容性选项可以让您设定opengl 程序的相关性能和兼容性设置。
启用缓冲区扩展:该选项允许驱动程序使用opengl 扩展gl_ktx_buffer_region。
使双面扩展可以使用本机视频内存:当gl_ktx_buffer_region 功能被允许时,该选项允许使用本地显示内存。
使用快速线性mip映射线性过滤:使用该功能会以损失图象质量为代价提高应用程序的性能,通常情况下,这些损失并不太为人们所注意。
启用各向异性过滤:该功能允许opengl 使用各向异性过滤来提高图形质量。
启用其他深度缓冲:该功能让硬件为16 位应用使用不同的机制进行深度缓冲。
使用该功能会很大程度地提高3d 图形质量。
禁用对cpu增强指令集的支持:该功能会禁止某些cpu 的增强3d 指令功能支持。
2、用于纹理的默认颜色深度:决定opengl 应用采用哪种默认的色彩深度,可选项有:使用桌面颜色深度(默认值),始终使用16位颜色深度,始终使用32位颜色深度。
3、缓冲翻转模式:用来决定全屏幕opengl 应用采用哪种缓冲模式,可选项有:自动选择(默认),使用位块传输,使用页面翻转。
4、垂直同步:可以让您指定opengl 应用中垂直同步的处理模式,可选项有:默认设置为打开(默认值),默认设置位关闭,始终关闭。
5、全景平滑处理方法:该选项可以让您选择全景平滑处理方法,可选项有:未平滑处理,1.5×1.5,2×2【lod偏移】,2×2。
6、用于pci模式下纹理的系统内存容量:该选项可以让您决定使用多大的系统内存来进行纹理存储。
该选项仅适用于pci 显示卡或者agp 显示卡工作在pci兼容模式。
7、自定义opengl 设置:该选项可以让您按照自己的喜好或者不同的游戏定义多种opengl 设置方案,并保存和随时更改这些设置。
基于OpenGL的纹理映射的实现与应用

在 最简单情 况下 , 纹理 是单个 图像 ; 在通常情 况下 , 纹理 是二维 的,即纹 理数据是 一个矩 形数组 . O eGL 在 pn
中定义二维纹理使用的函数是gTxm g2 0其函数原型可参考相关书籍, leI aeD , 在我们的应用实例( 柳编工艺品的三 维真实感模拟 I) 也可以采用别的方法实现纹理的定义. 2 中,
模 拟 中的应 用.
关键 词 :O eGL p n ;纹 理 映射 ;柳 编 工 艺品 :真 实 感 图形
中图分类号 : P 0 . T 31 6
文献标识码 :A
1 引言
在利用计算机对现实物体进行真实感绘制 时, ¨ 如果加入了光照, 物体将会具有立体感, 如果又给出了物
体表面的材质 、 颜色等, 物体将会变得丰富多彩并且还会具有一定的质感, 从而使绘制出的图形具有了一定的真 实感. 但在有些情况下, 仅仅使用材质属性等是不能获得更为真实的图形的, 这时就需要使用纹理映射技术来 绘制物体表面的每一个三维细节.
23 纹理的 映射方式 _
在一般情况下, 纹 图像是直接作为颜色画到多边形上的. 实际上, pn L 还可以用纹理 中的值来 在O eG 中, 调整多边形甚至曲面原本的颜色, 或者用纹理图像中的颜色与多边形甚至曲面原本的颜色进行融合, 这就是纹 理 的映射方 式 . O eGL 在 pn @控 制纹理 映射方 式 的函数是 g eE v (共有 三种模式 :()L M OD U LATE, 纹 l x n ) T , 1G 理图像 以透明方式贴在物体表面上 ; 2G L N , () L B E D 使用一个R B 常量来融合物体原色和纹理图像的颜色; G A () L D C ,即贴纸 纹理 映射方式 . 3G E AL
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
opengl 机器人纹理#include <glut.h>#include <stdio.h>#include <string.h>#include <stdlib.h>#include <math.h>static GLfloat xRot = 0.0f;static GLfloat yRot = 0.0f;//是否停止转动bool IsStop=false;//光照使用光源GLfloat lightPos[] = { 1.0f, 0.0f, -1.0f, 0.0f };GLfloat specular[] = { 1.0f, 1.0f, 1.0f, -1.0f};//反射光GLfloat specref[] = { 1.0f, 1.0f, 1.0f, 1.0f };//aGLfloat ambientLight[] = { 0.5f, 0.5f, 0.5f, 1.0f};//环绕光GLfloat spotDir[] = { 0.0f, 0.0f, -1.0f };GLboolean bEdgeFlag = TRUE;void showText(void);void resetPerspectiveProjection() ;void setOrthographicProjection() ;void Something();void renderBitmapString(float x, float y, void *font,char *string); //设置背景void SetupRC(void){glEnable(GL_CULL_FACE);glEnable(GL_LIGHTING);glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientLight); glLightfv(GL_LIGHT0,GL_DIFFUSE,ambientLight);glLightfv(GL_LIGHT0,GL_SPECULAR,specular);glLightfv(GL_LIGHT0,GL_POSITION,lightPos);glLightf(GL_LIGHT0,GL_SPOT_CUTOFF,30.0f);glLightf(GL_LIGHT0,GL_SPOT_EXPONENT,20.0f);glEnable(GL_LIGHT0);glEnable(GL_COLOR_MATERIAL);glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); glMaterialfv(GL_FRONT, GL_SPECULAR,specref); glMateriali(GL_FRONT, GL_SHININESS,8);glClearColor(0.0f, 0.0f, 0.0f, 1.0f );}void display(void){glClear (GL_COLOR_BUFFER_BIT);glShadeModel(GL_SMOOTH);if (IsStop==false){turn = (turn - 5) % 360;if (forward<2){turn1=turn;forward = forward -0.04*sin((GLfloat)turn1/360*3.14*2); z=z-0.05*cos((GLfloat)turn1/360*3.14*2);if(tag==0){shoulder1 = (shoulder1 + 1);shoulder2 = (shoulder2 - 1);if(shoulder1>=0){elbow=elbow-1.2;}else{elbow=elbow+1.2;}}else{shoulder1 = (shoulder1 - 1);shoulder2 = (shoulder2 + 1);if(shoulder1>=0){elbow=elbow+1.25;}else{elbow=elbow-1.2;}}if(shoulder1>30){tag=1;}if(shoulder1<-30){tag=0;}}else{turn1=turn;forward = forward +0.04*sin((GLfloat)turn1/360*3.14*2); z=z+0.05*cos((GLfloat)turn1/360*3.14*2);if(tag==0){shoulder1 = (shoulder1 - 1);shoulder2 = (shoulder2 + 1);}else{shoulder1 = (shoulder1 + 1);shoulder2 = (shoulder2 - 1);}if(shoulder1>30){tag=0;}if(shoulder1<-30){tag=1;}}}//glBegin(GL_QUADS);glColor3ub(0,32,0);glVertex3f(8.0f, -3.0f, -4.0f);glVertex3f(-8.0f, -3.0f, -4.0f);glColor3ub(0,255,0);glVertex3f(-8.0f, -3.0f, 4.0f);glVertex3f(8.0f, -3.0f, 4.0f);glEnd();//机器人运动glPushMatrix();glTranslatef (forward,0.0,z); //前进glRotatef ((GLfloat) turn, 0.0, 1.0, 0.0);Something();glTranslatef (0.375,0.0, 0.0);//提起右大腿glRotatef ((GLfloat) shoulder2, 1.0, 0.0, 0.0); glPushMatrix();glRotatef(yRot, 0.0f, 1.0f, 0.0f);glRotatef(xRot, 1.0f, 0.0f, 0.0f);glLightfv(GL_LIGHT0,GL_POSITION,lightPos); glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,spotDir); //画一个光源glColor3ub(255,0,0);glTranslatef(lightPos[0],lightPos[1],lightPos[2]); glutSolidCone(0.3f,0.3f,10,10);glPushAttrib(GL_LIGHTING_BIT);glDisable(GL_LIGHTING);glColor3ub(255,255,0);glutSolidSphere(0.1f,10.0f,10);glPopAttrib();glPopMatrix();glTranslatef (0.0, -0.5, 0.0);glColor3f(0.8,1.0,0.2);glPushMatrix();glScalef (0.5, 1.0, 0.5);glutSolidCube(1.0);glPopMatrix();glTranslatef (0.0, -0.5, 0.0);//提起右小腿glRotatef ((GLfloat) elbow, 1.0, 0.0, 0.0); glTranslatef (0.0, -0.5, 0.0);glColor3f(0.5,0.1,0.8);glPushMatrix();glScalef (0.5, 1.0, 0.5);glutSolidCube(1.0);glPopMatrix();glTranslatef (0.0, -0.5, -0.1);//右脚glColor3f(0.5,0.2,1.0);glPushMatrix();glScalef (0.5, 0.1, 0.7);glutSolidCube(1.0);glPopMatrix();glPopMatrix ();glPushMatrix();glTranslatef (forward,0.0,z);glRotatef ((GLfloat) turn, 0.0, 1.0, 0.0);glTranslatef (-0.375, 0.0, 0.0);//左大腿glRotatef ((GLfloat) shoulder1, 1.0, 0.0, 0.0); glTranslatef (0.0, -0.5, 0.0);glColor3f(0.8,1.0,0.2);glPushMatrix();glScalef (0.5, 1.0, 0.5);glutSolidCube(1.0);glPopMatrix();glTranslatef (0.0, -0.5, 0.0);//左小腿glRotatef ((GLfloat) elbow, 1.0, 0.0, 0.0); glTranslatef (0.0, -0.5, 0.0);glColor3f(0.5,0.1,0.8);glPushMatrix();glScalef (0.5, 1.0, 0.5);//缩放四方体glutSolidCube(1.0);//画四方体glPopMatrix();glTranslatef (0.0, -0.5, -0.1);//左脚glColor3f(0.5,0.2,1.0);glPushMatrix();glScalef (0.5, 0.1, 0.7);glutSolidCube(1.0);glPopMatrix();glPopMatrix();glPushMatrix();glTranslatef (forward,0.0,z);glRotatef ((GLfloat) turn, 0.0, 1.0, 0.0);glTranslatef (0.0, 1.0, 0.0);//躯干glColor3f(0.5,0.5,1.0);glScalef (1.4, 2.0, 0.5);glutSolidCube(1.0);glPopMatrix();glTranslatef (0.0, 1.25, 0.0);//头glColor3f(1.0,0.3,0.2);glPushMatrix();glScalef (0.5, 0.5, 0.5);glutSolidCube(1.0);glPopMatrix();glPopMatrix();glPushMatrix();glTranslatef (forward,0.0,z); glRotatef ((GLfloat) turn, 0.0, 1.0, 0.0); glTranslatef (0.85, 1.75, 0.0);//右臂glRotatef ((GLfloat) shoulder1, 1.0, 0.0, 0.0); glTranslatef (0.0, -0.5, 0.0);glColor3f(1.0,0.0,1.0);glPushMatrix();glScalef (0.3, 1.3, 0.4);glutSolidCube(1.0);glPopMatrix();glPopMatrix();glPushMatrix();glTranslatef (forward,0.0,z);glRotatef ((GLfloat) turn, 0.0, 1.0, 0.0); glTranslatef (-0.85, 1.75, 0.0);//左臂glRotatef ((GLfloat) shoulder2, 1.0, 0.0, 0.0); glTranslatef (0.0, -0.5, 0.0);glColor3f(1.0,0.0,1.0);glScalef (0.3, 1.3, 0.4);glutSolidCube(1.0);glPopMatrix();glPopMatrix();glutSwapBuffers();}//随便画一些小东西void Something(){glPushMatrix();glRotatef(xRot, 1.0f, 0.0f, 0.0f);glRotatef(yRot, 0.0f, 1.0f, 0.0f);glTranslatef(0,-3.5f,0);glutWireSphere(2.0f,50,50);glutWireTorus(0.3f, 1.0f,50,50);glutWireCone(0.30f, 1.1f, 20, 20);glPopMatrix();}void renderBitmapString(float x, float y, void *font,char *string) {char *c;glRasterPos2f(x, y);for (c=string; *c != '\0'; c++) { glutBitmapCharacter(font, *c);}}void reshape (int w1, int h1){w=w1;h=h1;glViewport (0, 0, (GLsizei) w1, (GLsizei) h1);glMatrixMode (GL_PROJECTION);glLoadIdentity ();gluPerspective(65.0, (GLfloat) w1/(GLfloat) h1, 1.0, 20.0); glMatrixMode(GL_MODELVIEW);glLoadIdentity();glTranslatef (0.0, 0.0, -8.0);}void keyboard (unsigned char key, int x, int y){switch (key) {case 'w': //向后走turn1=turn;forward = forward -0.04*sin((GLfloat)turn1/360*3.14*2); z=z-0.05*cos((GLfloat)turn1/360*3.14*2);if(tag==0){shoulder1 = (shoulder1 + 1);shoulder2 = (shoulder2 - 1);if(shoulder1>=0){elbow=elbow-1.2;}else{elbow=elbow+1.2;}}else{shoulder1 = (shoulder1 - 1);shoulder2 = (shoulder2 + 1);if(shoulder1>=0){elbow=elbow+1.25;}else{elbow=elbow-1.2;}}if(shoulder1>30){tag=1;}if(shoulder1<-30){tag=0;}IsStop=true;glutPostRedisplay();break;case 's': //向前走turn1=turn;forward = forward +0.04*sin((GLfloat)turn1/360*3.14*2); z=z+0.05*cos((GLfloat)turn1/360*3.14*2);if(tag==0){shoulder1 = (shoulder1 - 1);shoulder2 = (shoulder2+ 1);}else{shoulder1 = (shoulder1 + 1); shoulder2 = (shoulder2 - 1);}if(shoulder1>30){tag=0;}if(shoulder1<-30){tag=1;}IsStop=true; glutPostRedisplay();break;case 'd'://右转turn = (turn - 5) % 360; glutPostRedisplay();IsStop=true;break;case 'a'://左转turn = (turn + 5) % 360; glutPostRedisplay();IsStop=true;break;case 'l':shoulder1 = (shoulder1 + 2) % 360; shoulder2 = (shoulder2 - 4) % 360; glutPostRedisplay();IsStop=true;break;case 'L':shoulder1 = (shoulder1 - 5) % 360; shoulder2 = (shoulder2 + 10) % 360; glutPostRedisplay();IsStop=true;break;case 'P':IsStop=false;break;case 'p':IsStop=false;break;case 27:exit(0);break;default:break;}}//设置视觉角度void setOrthographicProjection(){glMatrixMode(GL_PROJECTION); glPushMatrix();glLoadIdentity();gluOrtho2D(0, w, 0, h);glScalef(1, -1, 1);glTranslatef(0, -h, 0);glMatrixMode(GL_MODELVIEW);}void resetPerspectiveProjection(){glMatrixMode(GL_PROJECTION); glPopMatrix();glMatrixMode(GL_MODELVIEW);}//光源的坐标变化void SpecialKeys(int key, int x, int y){if(key == GLUT_KEY_UP)xRot-= 5.0f;if(key == GLUT_KEY_DOWN)xRot += 5.0f;if(key == GLUT_KEY_LEFT)yRot -= 5.0f;if(key == GLUT_KEY_RIGHT)yRot += 5.0f;if(key > 356.0f)xRot = 0.0f;if(key < -1.0f)xRot = 355.0f;if(key > 356.0f)yRot = 0.0f;if(key < -1.0f)yRot = 355.0f;glutPostRedisplay();}//鼠标事件void Mouse(int button,int state, int x, int y){if (state == GLUT_DOWN)//鼠标按下{if (x<0){//向左旋转yRot -= 5.0f;}else if (x>=0){//向右旋转yRot += 5.0f;}else if (y>=0){//向上旋转xRot-= 5.0f;}else if (y<0){//向下旋转xRot += 5.0f;}if(xRot> 356.0f)xRot = 0.0f;if(xRot < -1.0f)xRot = 355.0f;if(yRot > 356.0f)yRot = 0.0f;if(yRot < -1.0f)yRot = 355.0f;glutPostRedisplay();}}//时间函数,定时刷新void TimerFunction(int value){display();glutPostRedisplay();glutTimerFunc(33,TimerFunction, 1);}//主函数int main(int argc, char** argv){glutInit(&argc, argv); glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); glutInitWindowSize (800, 600);glutInitWindowPosition (100, 100);glutCreateWindow("机器人按W向前走按s向后走按a向左转按d 向右转按p可以自行转动");SetupRC();glutDisplayFunc(display);glutReshapeFunc(reshape);glutKeyboardFunc(keyboard);glutSpecialFunc(SpecialKeys);glutMouseFunc(Mouse);glutTimerFunc(33, TimerFunction, 1);// glutIdleFunc(display);glutMainLoop();return 0;}。