基于OPENGL实现的彩色旋转立方体

合集下载

DWtemplate资料

DWtemplate资料

程序设计挑战式课程设计极限挑战挑战,不是为着征服自然,而是为着突破自我,超越自我生命有极限,思想无极限,高度有极限,境界无极限作业名称: 利用OpenGL 实现彩色立体茶壶的旋转 学 院: 机电学院 班 级: 学 号: 姓 名: 团队组成:西北工业大学 2018年10月18日请填写以下十项内容,将表格按页对齐(插入空行),勿删除任何部分。

1、问题与背景(描述程序所要解决的问题或应用背景)2、开发工具(列出所使用的开发工具和第3方开发库)3、主要功能(详细说明程序的功能)4、设计内容(详细描述解决问题的原理和方法、算法、数据结构等)5、程序文件与工程名称(标出程序中所有文件名、工程名称及其说明)6、函数模块(程序中各个函数的原型声明及其说明)7、使用说明(运行程序的小型说明书)8、程序开发总结(简要叙述编写本作业的收获与思考)9、运行截图(附上程序运行的截图画面,至少有1幅,截图越翔实得分越高)Windows中抓取当前活动窗口:Alt + Print Screen,抓取全屏:Print Screen。

或者使用HyperSnap等软件(百度搜索)。

10、源程序(附上程序源代码,若是多个文件,标出文件名)程序设计挑战式课程设计报告-12-1.应用程序主窗框的源代码//MainFrm.cpp:CMainFrame框架类的实现#include"stdafx.h"#include"OPENGLAct.h"#include"MainFrm.h"#ifdef_DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[]=__FILE__;#endif程序设计挑战式课程设计报告-12-10、源程序(附上程序源代码,若是多个文件,标出文件名)// 1.应用程序主窗框的源代码//MainFrm.cpp:CMainFrame框架类的实现#include"stdafx.h"#include"OPENGLAct.h"#include"MainFrm.h"#ifdef_DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[]=__FILE__;#endif//////////////////////////////////////////////////////////////// ///////////////CMainFrameIMPLEMENT_DYNCREATE(CMainFrame,CFrameWnd)BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)//{{AFX_MSG_MAP(CMainFrame)//注意,ClassWizard将添加和删除映射宏。

openGL利用顶点数组旋转立方体以及程序

openGL利用顶点数组旋转立方体以及程序
• void key(unsigned char k,int x,int y) • { • if(k=='1')glutIdleFunc(spinCube);
• if(k=='2')glutIdleFunc(NULL); • if(k=='q')exit(0); • } • void main(int argc, char **argv)//主函数 • { • glutInit(&argc, argv); • glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);//设置模式 • glutInitWindowSize(500, 500);//窗口大小 • glutCreateWindow("colorcube"); • glutReshapeFunc(myReshape);//注册重画回调 • glutDisplayFunc(display);//三个回调函数(显示回调) • glutIdleFunc(spinCube); • glutMouseFunc(mouse); • glEnable(GL_DEPTH_TEST);//启用隐藏-面-消去



• • • • • •
glEnableClientState(GL_COLOR_ARRAY);// 调用颜色数组 glEnableClientState(GL_VERTEX_ARRAY);// 调用顶点数组 glVertexPointer(3,GL_FLOAT,0,vertices);//定 点数组变量存放格式 //参数意义:三维对象的颜色,顶点浮点数据类 型,数据元素间隔为0连续存放,数组指针 glColorPointer(3,GL_FLOAT,0,colors);//颜色 数组变量存放格式 glClearColor(1.0,1.0,1.0,1.0); glColor3f(1.0,1.0,1.0); glutMainLoop(); }

实现三角体和立方体的旋转

实现三角体和立方体的旋转

实现三角体,正方体的3d效果及自动旋转思路如下:其实要实现三角体,正方体自动旋转效果,只需绘出立方体的三角形与四边形。

在加上gl.glRotatef(angle,x , y, z);就行了。

具体实现如下:Renderer类代码package sim.feel;import java.nio.ByteBuffer;import java.nio.ByteOrder;import java.nio.IntBuffer;import javax.microedition.khronos.egl.EGLConfig;import javax.microedition.khronos.opengles.GL10;import android.opengl.GLSurfaceView.Renderer;public class MyRender implements Renderer {//google画图单位private int one = 0x10000;//三角体旋转角度private float triangleAngle = 0.5f;//正方体旋转角度private float quaterAngle = 0.5f;//三角体、正方体及其颜色缓冲private IntBuffer triangleBuffer;private IntBuffer quaterBuffer;private IntBuffer triangleColorBuffer;private IntBuffer quaterColorBuffer;// 三角体四个面的顶点private int[] triangle = {0, one, 0,-one, -one, one,one, -one, one,0, one, 0,one, -one, one,one, -one, -one,0, one, 0,one, -one,-one,-one, -one, one,0, one, 0,-one, -one, -one,-one, -one, one};// 正方体8个面得顶点private int[] quater = new int[] { one, one, -one,-one, one, -one,one,one, one,-one, one, one,one, -one, one,-one, -one, one,one,-one, -one,-one, -one, -one,one, one, one,-one, one, one,one, -one, one,-one, -one, one,one, -one, -one,-one, -one, -one,one,one, -one,-one, one, -one,-one, one, one,-one, one, -one,-one, -one, one,-one, -one, -one,one, one, -one,one, one, one,one, -one, -one,one, -one, one,};// 三角体各顶点的颜色(r,g,b,a)private int[] triangleColor = new int[] { // tri 4 faceone, 0, 0, one,0, one, 0, one,0, 0, one, one,one, 0, 0, one,0, one, 0, one,0, 0, one, one,one, 0, 0, one,0, one, 0, one,0, 0,one, one,one, 0, 0, one,0, one, 0, one,0, 0, one, one,};// 正方形各顶点颜色private int[] quaterColor = new int[] { 0, one, 0, one,0, one, 0, one,0,one, 0, one,0, one, 0, one,one, one / 2, 0, one,one, one / 2, 0,one,one, one / 2, 0, one,one, one / 2, 0, one,one, 0, 0, one,one, 0, 0, one,one, 0, 0, one,one, 0, 0, one,one, one, 0, one,one, one, 0, one,one, one, 0, one,one, one, 0, one,0, 0, one,one,0, 0, one, one,0,0, one, one,0,0, one, one,one,0, one, one,one,0, one, one,one,0, one, one,one,0, one, one};//初始化Bufferpublic void init() {ByteBuffer byteBuffer = ByteBuffer.allocateDirect(triangle.length * 4);ByteBuffer byteColorBuffer = ByteBuffer.allocateDirect(triangleColor.length * 4);ByteBuffer byteQuaterBuffer = ByteBuffer.allocateDirect(quater.length * 4);ByteBuffer byteQuterColorBuffer = ByteBuffer.allocateDirect(quaterColor.length * 4);byteBuffer.order(ByteOrder.nativeOrder());byteColorBuffer.order(ByteOrder.nativeOrder());byteQuaterBuffer.order(ByteOrder.nativeOrder());byteQuterColorBuffer.order(ByteOrder.nativeOrder());triangleBuffer = byteBuffer.asIntBuffer();triangleColorBuffer = byteColorBuffer.asIntBuffer();quaterBuffer = byteQuaterBuffer.asIntBuffer();quaterColorBuffer = byteQuterColorBuffer.asIntBuffer();triangleBuffer.put(triangle);triangleColorBuffer.put(triangleColor);quaterBuffer.put(quater);quaterColorBuffer.put(quaterColor);triangleBuffer.position(0);triangleColorBuffer.position(0);quaterBuffer.position(0);quaterColorBuffer.position(0);}@Overridepublic void onDrawFrame(GL10 gl) {// 清除屏幕和深度缓存gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); // 重置gl.glLoadIdentity();// 初始化triangleBuffer与triangleColorBufferinit();// 左移1.5f并向里移6.0fgl.glTranslatef(-1.5f, 0.0f, -6.0f);// 旋转gl.glRotatef(triangleAngle, 0.0f, 1.0f, 0.0f);gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);gl.glEnableClientState(GL10.GL_COLOR_ARRAY);// 设置顶点及颜色gl.glVertexPointer(3, GL10.GL_FIXED, 0, triangleBuffer);gl.glColorPointer(4, GL10.GL_FIXED, 0, triangleColorBuffer);// 绘制for (int i = 0; i < 4; i++) {gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, i * 3, 3);}gl.glFinish();// 重置观察模型gl.glLoadIdentity();gl.glTranslatef(1.5f, 0.0f, -6.0f);gl.glRotatef(quaterAngle, 1.0f, 0.0f, 0.0f);gl.glVertexPointer(3, GL10.GL_FIXED, 0, quaterBuffer);gl.glColorPointer(4, GL10.GL_FIXED, 0, quaterColorBuffer);// 绘制for (int i = 0; i < 6; i++) {gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, i * 4, 4);}gl.glDisableClientState(GL10.GL_COLOR_ARRAY);gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);// 旋转角度+0.5ftriangleAngle += 0.5f;quaterAngle += 0.5f;}@Overridepublic void onSurfaceChanged(GL10 gl, int width, int height) {float ratio = (float) width / height;gl.glViewport(0, 0, width, height);gl.glMatrixMode(GL10.GL_PROJECTION);gl.glLoadIdentity();gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);gl.glMatrixMode(GL10.GL_MODELVIEW);gl.glLoadIdentity();}@Overridepublic void onSurfaceCreated(GL10 gl, EGLConfig arg1) {// 告诉系统对透视进行修正gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST); // 黑色背景gl.glClearColor(0, 0, 0, 0);// 启用阴影平滑gl.glShadeModel(GL10.GL_SMOOTH);// 清除深度缓存gl.glClearDepthf(1.0f);// 启用深度测试gl.glEnable(GL10.GL_DEPTH_TEST);// 所做深度测试的类型gl.glDepthFunc(GL10.GL_LEQUAL);} }效果图:。

计算机图形学考试试题及答案

计算机图形学考试试题及答案

计算机图形学考试试题及答案一、选择题1. 下列关于计算机图形学的描述中,错误的是:A. 计算机图形学是研究如何有效地生成、处理和显示图像的学科。

B. 计算机图形学可以应用于游戏开发、虚拟现实、动画制作等领域。

C. 计算机图形学的基础是绘画和几何学。

D. 计算机图形学不涉及数字图像处理和计算机视觉。

2. 下列哪个算法用于绘制三维图形中的曲线和曲面?A. Bresenham算法B. Bezier曲线算法C. DDA直线绘制算法D. Cohen-Sutherland算法3. 下列哪个变换矩阵用于实现平移操作?A. 缩放矩阵B. 旋转矩阵C. 平移矩阵D. 投影矩阵4. 在光栅化过程中,下列哪个步骤不是必需的?A. 三角形剖分B. 顶点着色C. 法向量计算D. 光照模型计算5. 下列哪个算法用于实现隐藏面消除?A. DDA算法B. Bresenham算法C. Z-buffer算法D. Bezier曲线算法二、填空题1. 在计算机图形学中,RGB表示红、绿、蓝三原色,而CMYK表示青、洋红、黄、黑四原色。

其中,RGB颜色模型中的最大亮度为______,而CMYK颜色模型中的最大亮度为______。

2. 给定一个二维平面上的点P,坐标为(x,y),经过平移变换后得到新的点P',平移矩阵表示为T,若T=[1 0 a; 0 1 b; 0 0 1],则点P'的坐标为(x', y') = (______, ______)。

3. 在计算机图形学中,三维物体的旋转变换通常使用欧拉角或四元数表示。

若分别使用ZYZ和XYZ欧拉角顺序进行旋转,最终得到的物体姿态可能会有差异,这被称为______问题。

三、简答题1. 简要描述计算机图形学的基本原理和应用领域。

2. 什么是光线追踪技术?它在哪些领域得到了广泛应用?3. 简要解释什么是纹理映射(Texture Mapping),并举例说明其在计算机图形学中的应用。

OpenGL下三维模型的显示和自由旋转

OpenGL下三维模型的显示和自由旋转

20 世纪 70 年代后期 ,计算机图形工作站的出现推动了基于矢量的 3D 计算机图形学 ( 3D Computer Grap hics) 的迅速发展 . 目前 3D 计算机图形学已经广泛地应用于各个行业和领域 , 如 :3D Max ,Poser 等三维设计软件可以生成复杂的三维模型 . 考虑到软件的通用性 , 本文选 取了图形数据工业标准 — — — DXF 格式的三维模型数据文件作为源文件 , 不仅可以对任意软件 生成的 DXF 格式的三维模型文件进行处理 ,同时还可以处理三维模型和二维模型 . 在三维软件的开发方面 ,目前主要存在 2 种 API : 一个是微软的 Direct 3D ,一个是开放标 准 Open GL . Direct 3D 大量应用于民用产品 ,如游戏领域 ,而 Open GL 作为应用最为广泛的高 性能工业图形标准 ,是开发高质量的二维或三维交互式图形应用程序的首选环境 [ 1 ] . Open GL 提供的应用程序 API 包含了许多现代图形学中的基本功能 , 如 : 图元的绘制 、 颜色指定 、 纹理 映射 、 光照处理 、 双缓存动画和特效等 ; 另外 , 其跨平台的特性也备受用户推崇 ; Open GL 简化 了图形软件的开发过程 ,缩短了产品进入市场的周期 : 因此 ,我们选用 Open GL 作为开发工具 . 在对三维模型的研究中 ,需要对其进行自由旋转 ,以方便从任意角度细致地进行观察 . 本 文提供了一种通过操纵虚拟球实现对模型自由旋转的方法 ,使用户仅通过鼠标的拖动就能从 任何角度观看模型 .
v= b +c , cosβ= c/ v , sinβ= b/ v ;
2 2
1
Rx =
0 0 0
0 β cos sinβ - sinβ cosβ 0 0

openGL+VS2010的例程--旋转立方体(三维)

openGL+VS2010的例程--旋转立方体(三维)

openGL+VS2010的例程--旋转⽴⽅体(三维)效果图如上:步骤:⾸先,设置模型视⾓往后退,再旋转视⾓;然后,⽤默认绘制⽴⽅体函数绘制;最后,利⽤空闲对模型做⾓度微调。

实现代码如下:1 #include <GL\glut.h>23 GLfloat xRotated, yRotated, zRotated;45void Display(void)6 {7 glClear(GL_COLOR_BUFFER_BIT);8 glLoadIdentity();9 glTranslatef(0.0,0.0,-4.0);10 glRotatef(xRotated,1.0,0.0,0.0);11 glRotatef(yRotated,0.0,1.0,0.0);12 glRotatef(zRotated,0.0,0.0,1.0);13//glScalef(2.0,1.0,1.0);14 glutWireCube(1.5);15 glFlush(); //Finish rendering16 glutSwapBuffers();17 }1819void Reshape(int x, int y)20 {21if (y == 0 || x == 0) return; //Nothing is visible then, so return22//Set a new projection matrix23 glMatrixMode(GL_PROJECTION);24 glLoadIdentity();25//Angle of view:40 degrees26//Near clipping plane distance: 0.527//Far clipping plane distance: 20.028 gluPerspective(40.0,(GLdouble)x/(GLdouble)y,0.5,20.0);29 glMatrixMode(GL_MODELVIEW);30 glViewport(0,0,x,y); //Use the whole window for rendering31 }32static int times = 0;33void Idle(void)34 {35 times++;36if(times >30000)37 times = 0;3839if(times %30000 == 0)40 {41 xRotated += 0.3;42 yRotated += 0.1;43 zRotated += -0.4;44 Display();45 }46 }474849int main (int argc, char **argv)50 {51//Initialize GLUT52 glutInit(&argc, argv);53 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); //For animations you should use double buffering54 glutInitWindowSize(300,300);55//Create a window with rendering context and everything else we need56 glutCreateWindow("Cube example");57 glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);58 xRotated = yRotated = zRotated = 0.0;59 glClearColor(0.0,0.0,0.0,0.0);60//Assign the two used Msg-routines61 glutDisplayFunc(Display);62 glutReshapeFunc(Reshape);63 glutIdleFunc(Idle);64//Let GLUT get the msgs65 glutMainLoop();66return0;67 }。

OpenGl绘制一个立方体

OpenGl绘制一个立方体

OpenGl绘制⼀个⽴⽅体OpenGl 绘制⼀个⽴⽅体 为了绘制六个正⽅形,我们为每个正⽅形指定四个顶点,最终我们需要指定6*4=24个顶点。

但是我们知道,⼀个⽴⽅体其实总共只有⼋个顶点,要指定24次,就意味着每个顶点其实重复使⽤了三次,这样可不是好的现象。

最起码,像上⾯这样重复烦琐的代码,是很容易出错的。

稍有不慎,即使相同的顶点也可能被指定成不同的顶点了。

如果我们定义⼀个数组,把⼋个顶点都放到数组⾥,然后每次指定顶点都使⽤指针,⽽不是使⽤直接的数据,这样就避免了在指定顶点时考虑⼤量的数据,于是减少了代码出错的可能性。

// 将⽴⽅体的⼋个顶点保存到⼀个数组⾥⾯ ⽴⽅体的各个顶点的顺序如下图所⽰:1. 定义⽴⽅体的各个顶点数组 将⽴⽅体的⼋个顶点保存到⼀个数组⾥⾯。

这样在指定顶点时,⽤指针,⽽不⽤直接⽤具体的数据。

1// 将⽴⽅体的⼋个顶点保存到⼀个数组⾥⾯2static const GLfloat vertex_list[][3] = {3 -0.5f, -0.5f, -0.5f,40.5f, -0.5f, -0.5f,5 -0.5f, 0.5f, -0.5f,60.5f, 0.5f, -0.5f,7 -0.5f, -0.5f, 0.5f,80.5f, -0.5f, 0.5f,9 -0.5f, 0.5f, 0.5f,100.5f, 0.5f, 0.5f,11 }; 使⽤时可以直接采⽤指针绘制。

1 glBegin(GL_QUADS);2 glVertex3fv(vertex_list[0]);3 glVertex3fv(vertex_list[2]);4 glVertex3fv(vertex_list[3]);5 glVertex3fv(vertex_list[1]);67// ...8 glEnd(); 很容易就看出第0, 2, 3, 1这四个顶点构成⼀个正⽅形。

稍稍观察就可以发现,我们使⽤了⼤量的glVertex3fv函数,其实每⼀句都只有其中的顶点序号不⼀样,因此我们可以再定义⼀个序号数组,把所有的序号也放进去。

基于opengl的3d旋转魔方的实现--终期报告加源码

基于opengl的3d旋转魔方的实现--终期报告加源码

目录1.课程设计介绍 (1)1.1.内容 (1)1.2.目的 (1)1.3.取得的成果 (1)2.程序分析 (2)2.1. 程序原理 (2)2.1. 程序流程 (3)2.3. 数据结构 (8)2.4. 重要函数用法分析 (8)3.结果演示与程序分析 (9)3.1. 成果演示 (9)3.2. 程序分析 (11)4.编程中遇到的问题 (12)5.课程设计小结 (13)参考文献 (14)基于OpenGL的3D旋转魔方实现1.课程设计介绍1.1目的当今计算机技术流行,引领了各行各业。

而程序是计算机的灵魂,因此编程能力对当今的学生而言至关重要。

虽然我们在前期已经学习了C语言,但是还只对程序有一些简单的认识,说实话,是很浅显的认识。

通过本软件课程设计的学习,可以从整体上对软件工程和项目有全面的认识。

通过此次课程设计,可以锻炼编程能力,激发对编程的兴趣,同时也能培养良好的编程习惯。

这对于个人今后的学习,今后的工作乃至今后的生活都会产生重要的影响。

对于国家而言,极大的推动了计算机普及教育,提高了大学生的计算机使用水平,具有重大的意义。

1.2内容(1)通过此次项目掌握软件开发模式,模块化结构分析以及程序设计流程(2)学会使用VC++6.0进行编程(3)掌握有关程序设计的思想,数据结构的知识,掌握C语言算法,掌握OpenGL 编程知识如贴图与键盘控制(4)掌握win32编程知识,了解windows程序内部运行机制(5)初步培养需求分析、软件测试、调试的能力(6)在2X2魔方的基础上,尝试编写3X3的魔方,并实现其旋转1.3取得的成果在理解Magic2D例子程序的基础上,借助了Win32平台进行了一系列调试和学习。

在此次项目中,学习了Visual C++6.0软件开发环境,熟练掌握了Win32 Application开发流程。

同时也学习了OpenGL的基本知识,掌握了一些OpenGL的重要技术与重要函数的使用,编写了一些简单的OpenGL程序。

openGL图形的旋转与平移

openGL图形的旋转与平移
}
void reshape(GLsizei w, GLsizei h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-100.0, 100.0, -100.0, 100.0, 0.0, 100.0);
opengl图形的旋转与平移旋转图形平移图形的平移图形的旋转和平移旋转与平移图形的旋转平移和图的旋转
#include <GL/glut.h>
#include <math.h>
#include <stdlib.h>
#define PI 3.1415926535
GLsizei w=650, h=550;
}
void shrink()
{
fraction-=2.0;
if (fraction<-1பைடு நூலகம்.0)
fraction=-10.0;
glutPostRedisplay();
}
void rotate()
{
angle+=20.0;
if (angle>=360.0)
angle=0.0;
glutPostRedisplay();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void specialKeyFunc( int key, int x, int y)
{
switch(key)
{
case GLUT_KEY_LEFT:
moveleft();
break;

Opengl绘制我们的小屋(一)球体,立方体绘制

Opengl绘制我们的小屋(一)球体,立方体绘制

Opengl绘制我们的⼩屋(⼀)球体,⽴⽅体绘制这个系列我想⽤来运⽤opengl红⽪书的前⼋章节的内容,来打造⼀个室内⼩屋.这⼀章主要是定义⼏个基本的结构.并给出球体与⽴⽅体的画法,先让我们来定义⼀些基本的结构.⼀个是包含点,法向量,纹理贴图向量,⼆是矩形与圆形的⽗类,包含⼀些基本公有的处理. 1type T2N3V3 =2struct3val mutable TexCoord : Vector24val mutable Normal : Vector35val mutable Position : Vector36new(v,n,p) = {TexCoord = v;Normal = n;Position = p}7end8 [<AbstractClass>]9type Shape() =10let mutable bCreate = false11let mutable vi = 012let mutable ei = 013let mutable count = 014member this.vboID with get() = vi and set value = vi <- value15member this.eboID with get() = ei and set value = ei <- value16member this.TriangelCount with get() = count and set value = count <- value17member this.IsCreate with get() = bCreate and set value = bCreate <- value18abstract Draw : unit -> unit19abstract Init : unit -> unit20member this.InitQ : unit -> unit =fun () -> ()View Code然后是球体的画法,相关具体过程如上篇,先贴上代码,我会对其中⼀些做些说明.1type Sphere(radius:float32,level:int) =2inherit Shape()3let mutable rad,lev = radius,level4let RightLevel =5if lev < 0then lev <- 06 elif lev > 6then lev <-67override this.Draw() =8if this.IsCreate<>true then this.Init()9 GL.BindBuffer(BufferTarget.ArrayBuffer,this.vboID)10 GL.BindBuffer(BufferTarget.ElementArrayBuffer,this.eboID)11 GL.InterleavedArrays(InterleavedArrayFormat.T2fN3fV3f,0,IntPtr.Zero)12 GL.DrawElements(BeginMode.Triangles,this.TriangelCount,DrawElementsType.UnsignedInt,IntPtr.Zero)13override this.Init() =14let alls = Array.create 6 (new T2N3V3())15 alls.[0] <- new T2N3V3(new Vector2( 0.0f, 0.0f ), Vector3.UnitX, Vector3.UnitX * rad )16 alls.[1] <- new T2N3V3(new Vector2( 0.0f, 0.0f ), Vector3.UnitY, Vector3.UnitY * rad )17 alls.[2] <- new T2N3V3(new Vector2( 0.0f, 0.0f ), Vector3.UnitZ, Vector3.UnitZ * rad )18 alls.[3] <- new T2N3V3(new Vector2( 0.0f, 0.0f ), -Vector3.UnitX, -Vector3.UnitX * rad )19 alls.[4] <- new T2N3V3(new Vector2( 0.0f, 0.0f ), -Vector3.UnitY, -Vector3.UnitY * rad )20 alls.[5] <- new T2N3V3(new Vector2( 0.0f, 0.0f ), -Vector3.UnitZ, -Vector3.UnitZ * rad )21let is = [|221;2;0230;2;4240;4;5255;1;0261;3;2274;2;3284;3;5291;5;330 |]31let (vvv:T2N3V3 []),(iv: int[]) = this.Sub (alls,is)32let mutable vID,eID = 0,033//let mutable tv,vv,pv = vvv |> Array.map (fun v -> v.TexCoord,v.Normal,v.Position) |> Array.unzip334 GL.GenBuffers(1,&vID)35 GL.BindBuffer(BufferTarget.ArrayBuffer,vID)36 GL.BufferData(BufferTarget.ArrayBuffer,IntPtr (4 * 8 * vvv.Length),vvv,BufferUsageHint.StaticDraw)3738 GL.GenBuffers(1,&eID)39 GL.BindBuffer(BufferTarget.ElementArrayBuffer,eID)40 GL.BufferData(BufferTarget.ElementArrayBuffer,IntPtr (4 * iv.Length),iv,BufferUsageHint.StaticDraw)4142 this.vboID <- vID43 this.eboID <- eID44 this.TriangelCount <- iv.Length45 this.IsCreate <- true46 ()47member v.GetMidValue (first:T2N3V3,second:T2N3V3) =48let midN = Vector3.Lerp(first.Position,second.Position,0.5f) |> Vector3.Normalize49let midP = midN *(float32 rad)50let midT = Vector2.Lerp(first.TexCoord,second.TexCoord,0.5f) |> Vector2.Normalize51let result = new T2N3V3(midT,midN,midP)52 result53member v.Subdivide (v1:T2N3V3,v2:T2N3V3,v3:T2N3V3) =54let vs = Array.create 6 (new T2N3V3())55 vs.[0] <- v156 vs.[1] <- v.GetMidValue(v1,v2)57 vs.[2] <- v.GetMidValue(v3,v1)58 vs.[3] <- v259 vs.[4] <- v.GetMidValue(v2,v3)60 vs.[5] <- v361let is = Array.create 12062 is.[0] <- 063 is.[1] <- 164 is.[2] <- 265 is.[3] <- 266 is.[4] <- 167 is.[5] <- 468 is.[6] <- 469 is.[7] <- 170 is.[8] <- 371 is.[9] <- 272 is.[10] <-473 is.[11] <- 574 (vs,is)75member this.Sub(alls:T2N3V3 [],is:int []) =76//let mutable tv,vv,pv = alls |> Array.map (fun v -> v.TexCoord,v.Normal,v.Position) |> Array.unzip377let mutable allv = alls78let mutable iv = is79let show array = printfn "%A" array80for j in0 .. lev do81let mutable av = Array.create 0 (new T2N3V3())82let mutable ev = Array.create 0083 printfn "%i" allv.Length84 printfn "%i" iv.Length85for i in0 .. 3 .. iv.Length - 1do86let (vvv,iiv) = this.Subdivide(allv.[iv.[i]],allv.[iv.[i+1]],allv.[iv.[i+2]])87let length = av.Length88 av <- Array.append av vvv89let map = iiv |> Array.map (fun p -> p + length)90 ev <- Array.append ev map91 allv <- av92 iv <- ev93 allv |> Array.map (fun p -> p.Position) |> show94 show iv95 allv,ivView Code初始化需要的⼆个参数,分别代表球的⼤⼩(radius),与画的细分程度(level).其中相关如何绘制球体代码在上⽂有讲,相当于有是把⼀个分别位于x,y,z各(+radius,-radius)这六个点,组成的⼀个⼋个三⾓形,索引点的位置如Init⾥GL.InterleavedArrays(InterleavedArrayFormat.T2fN3fV3f,0,IntPtr.Zero)其中的T2fN3fV3f对应于我们的数据结构T2N3V3,这个函数分别相当于指定GL.TexCoordPointer,GL.NormalPointer,GL.VertexPointer(还会打开相应状态),会⾃动给我们处理好,我们也可以只指定顶点,如下GL.VertexPointer(3,VertexPointerType.Float,4*8,IntPtr (4*8-4*5)),这些数据之间的间隔对应与我们前⾯写⼊的GL.BufferData(BufferTarget.ArrayBuffer,IntPtr (4 * 8 * vvv.Length),vvv,BufferUsageHint.StaticDraw)其中vvv是T2N3V3的结构.基本的GL.BindBuffer的对应的三个处理就不细说了,在Draw⾥,BindBuffer是指定我们当前格式数据在存储位置,然后分别调⽤InterleavedArrays设定各顶点的状态,然后是调⽤DrawElements对应上⾯的GL.BindBuffer(BufferTarget.ElementArrayBuffer,this.eboID)处理.然后是⽴⽅体的绘制,其中⽴⽅体的绘制⽤的⽅法看起来会容易理解.如下1type Cube(width:float32,height:float32,length:float32,index:int) =2inherit Shape()3let mutable id = index4let xl,yl,zl =width/2.f,height/2.f,length/2.f5let mutable color = Color.White6let v8 = [|7new Vector3(xl,yl,zl)8new Vector3(-xl,yl,zl)9new Vector3(-xl,-yl,zl)10new Vector3(xl,-yl,zl)11new Vector3(xl,yl,-zl)12new Vector3(-xl,yl,-zl)13new Vector3(-xl,-yl,-zl)14new Vector3(xl,-yl,-zl)15 |]16new(x,y,z) =17let rnd = System.Random().Next()18 printfn "%i" rnd19 Cube(x,y,z,-1)20override this.Draw() =21if this.IsCreate<>true then this.Init()22 GL.EnableClientState(ArrayCap.VertexArray)23 GL.EnableClientState(ArrayCap.NormalArray)24 GL.BindBuffer(BufferTarget.ArrayBuffer,this.vboID)25 GL.VertexPointer(3,VertexPointerType.Float,0,IntPtr.Zero)26 GL.PushMatrix()27if id >= 0 && id < 8then28 GL.Translate(v8.[id])29 GL.Color3(this.Color:Color)30 GL.Normal3(Vector3.UnitZ)31 GL.DrawElements(BeginMode.Triangles,6,DrawElementsType.UnsignedInt,[|0;1;2;0;2;3|])32//GL.Color3(Color.Black)33 GL.Normal3(Vector3.UnitY)34 GL.DrawElements(BeginMode.Triangles,6,DrawElementsType.UnsignedInt,[|4;5;1;4;1;0|])35//GL.Color3(Color.Red)36 GL.Normal3(Vector3.UnitX)37 GL.DrawElements(BeginMode.Triangles,6,DrawElementsType.UnsignedInt,[|4;0;3;4;3;7|])38//GL.Color3(Color.Green)39 GL.Normal3(-Vector3.UnitY)40 GL.DrawElements(BeginMode.Triangles,6,DrawElementsType.UnsignedInt,[|3;2;6;3;6;7|])41//GL.Color3(Color.Blue)42 GL.Normal3(-Vector3.UnitX)43 GL.DrawElements(BeginMode.Triangles,6,DrawElementsType.UnsignedInt,[|1;5;6;1;6;2|])44//GL.Color3(Color.DodgerBlue)45 GL.Normal3(-Vector3.UnitZ)46 GL.DrawElements(BeginMode.Triangles,6,DrawElementsType.UnsignedInt,[|5;4;7;5;7;6|])47 GL.PopMatrix()48override this.Init() =49let mutable vID = 050 GL.GenBuffers(1,&vID)51 GL.BindBuffer(BufferTarget.ArrayBuffer,vID)52 GL.BufferData(BufferTarget.ArrayBuffer,IntPtr (4 * 3 * v8.Length),v8,BufferUsageHint.StaticDraw)53 this.vboID <- vID54 this.IsCreate <- true55let rnd = System.Random(this.GetHashCode())56 this.Color <- Color.FromArgb(rnd.Next(0,255),rnd.Next(0,255),rnd.Next(0,255))57 ()58member this.Index with get() = id and set value = id <-value59member this.Color with get() = color and set value = color <- valueView Code上图中的V8分别对应其中的0-7个顶点,GL.DrawElements后⾯的0;1;2;0;2;3分别是以三⾓形的画法来画⼀个正⽅形.⽴⽅体的画法主要是确定宽,⾼,长,我们这样定义,我们站在原点上,⾯向Z+轴,我们的⼿展开来表⽰X轴(对应宽度),⽽我们的⾝⾼表⽰Y轴(对应⾼度),和我们⾯向距离的长远来表⽰Z轴,(对应长度).绘制也是8个⾯,和上⾯⼀样,也是在缓存中记录顶点,但是不⼀样的是,顶点索引是在绘制时没有⽤到顶点索引缓存,主要考虑后⾯有法向量的处理,还有现在没有加上的纹理贴图的处理.在这⾥,我们要特别注意,顶点顺序问题,在opengl,默认正⾯是逆时针,⽽我们可以看0;1;2;0;2;3对应图上的顺序.然后⼤家可能会发现,画⽴⽅体的后⾯5;4;7;5;7;6,这个顺序好像不对,是顺时针的.⼤家可以想象下,我们在门外看门的逆时针画法与我们在门内看门外顺时针的画法是⼀样的.所以如果我们要画后⾯4,5,6,7我们以为的是逆时针是不对的,我们要想象我们在那边来看,然后再画,应该是5,4,7,6这个⽅向.其中纹理贴图后⾯会说,和这处理也有类似.在上⾯,我们看到我们都没对顶点的颜⾊来定义,这⾥没必要,因为后⾯我们肯定要⽤到灯光,⽤到灯光的话,设置的颜⾊都没⽤,我们会⽤到灯光颜⾊与材质的颜⾊.纹理贴图也有没对应处理,这⾥在后⾯我会根据讲到再来改写相关处理.下⼀节,主要是讲第⼀⼈称漫游的相关处理.。

计算机专业课程设计OPENGL旋转立方体

计算机专业课程设计OPENGL旋转立方体

西安文理学院计算机科学系课程设计报告设计名称:软件课程设计设计题目:旋转立方体的设计学生学号:专业班级:学生姓名:学生成绩:指导教师(职称):课题工作时间:2010.5.31至2010.6.11说明:1、报告中的任务书、进度表由指导教师在课程设计开始前填写并发给每个学生;四、五两项(中英文摘要)由学生在完成综合设计后填写。

2、学生成绩由指导教师根据学生的设计情况给出各项分值及总评成绩。

3、指导教师评语一栏由指导教师就学生在整个设计期间的平时表现、设计完成情况、报告的质量及答辩情况,给出客观、全面的评价。

4、所有学生必须参加课程设计的答辩环节,凡不参加答辩者,其成绩一律按不及格处理。

答辩小组成员应由2人及以上教师组成。

5、报告正文字数一般应不少于3000字,也可由指导教师根据本门综合设计的情况另行规定。

6、平时表现成绩低于6分的学生,取消答辩资格,其本项综合设计成绩按不及格处理。

计算机科学系课程设计任务书1.谭浩强C程序设计(M)(第三版)清华大学出版社20102.严蔚敏.吴伟民数据结构[M] 高等教育20043.钱能C++程序设计教程(M)(第二版)清华大学出版社20094.郑丽Visual Basic程序设计清华大学出版社2009-10-29指导教师:系主任:日期:2010 年 5 月 28 日计算机科学系课程设计进度安排表指导教师签名:2010年5 月 28 日指导教师评语答辩记录表成绩评定表学生姓名:学号:班级:摘要软件工程专业经过两年的课程学习,已经积累了相关高级语言程序设计的基本知识。

画出正方体并使之旋转,这一题目考察了程序设计自顶而下、逐步细化的相关基本思想。

题目难点在于实现可视化界面的交互、以及图像的旋转过程。

分析题目可以得出程序可以大致分为两个方面的内容:1.画出一个正方体。

2.使正方体旋转起来。

经过查找相关资料,本程序采用功能强大的图形库OPENGL并调用一系列WINDOWS API采用C/C++语言在Microsoft Visual C++6.0环境下编写。

OpenGL核心技术之立方体贴图

OpenGL核心技术之立方体贴图

OpenGL 核心技术之立方体贴图OpenGL 核心技术之立方体贴图在这里介绍立方体贴图主要是告诉读者,利用立方体贴图原理,我们可以做很多事情:比如天空盒,环境映射中的反射和折射效果等等。

当然环境映射也可以使用一张纹理贴图实现,这个会在博文的最后给读者介绍,下面开始介绍立方体贴图实现原理。

我们在游戏开发中通常的做法是将2D纹理映射到物体的一个面上,本篇博文介绍的是将多个纹理组合起来映射到一个单一纹理,这就称为立方体贴图。

在介绍立方体贴图前,先解释一下纹理采样,假设我们有一个单位立方体,有个以原点为起点的方向向量在它的中心。

从立方体贴图上使用橘黄色向量采样一个纹理值看起来下图:注意,方向向量的大小无关紧要,一旦提供了方向,OpenGL就会获取方向向量碰触到立方体表面上的相应的纹理像素,这样就返回了正确的纹理采样值。

方向向量触碰到立方体表面的一点也就是立方体贴图的纹理位置,这意味着只要立方体的中心位于原点上,我们就可以使用立方体的位置向量来对立方体贴图进行采样。

然后我们就可以获取所有顶点的纹理坐标,就和立方体上的顶点位置一样。

所获得的结果是一个纹理坐标,通过这个纹理坐标就能获取到立方体贴图上正确的纹理。

下面开始介绍创建立方体贴图,立方体贴图和其他纹理一样,所以要创建一个立方体贴图,在进行任何纹理操作之前,需要生成一个纹理,激活相应纹理单元然后绑定到合适的纹理目标上。

这次要绑定到 GL_TEXTURE_CUBE_MAP纹理类型: [cpp] view plain copyGLuint textureID;glGenTextures(1, &textureID); glBindTexture(GL_TEXTURE_CUBE_MAP, textureID);由于立方体贴图包含6个纹理,立方体的每个面一个纹理,我们必须调用glTexImage2D函数6次,函数的参数和前面教程讲的相似。

然而这次我们必须把纹理目标(target)参数设置为立方体贴图特定的面,这是告诉OpenGL我们创建的纹理是对应立方体哪个面的。

OpenGL 3D魔方游戏的设计与实现 3D魔方设计与实现 毕业论文[实用论文]

OpenGL 3D魔方游戏的设计与实现 3D魔方设计与实现 毕业论文[实用论文]

摘要三维动画又称3D动画,是近年来随着计算机软硬件技术的发展而产生的一新兴技术,其技术是模拟真实物体的方式使其成为一个有用的工具。

由于其精确性、真实性和无限的可操作性,目前被广泛应用于医学、教育、军事、娱乐等诸多领域。

本设计是在Visual C++6.0开发环境下,使用OpenGL(Open Graphics Library)函数库,绘制魔方并实现魔方的旋转、随机生成、回拧、透明处理和放大缩小等功能。

采用基本图形的绘图函数及定位函数,添加相应的颜色、纹理来实现魔方模型的绘制。

通过读取载入BMP文件,应用纹理贴图技术来完成对魔方旋转面的处理。

利用随机数来随机产生一个打乱顺序的魔方,并使用C++标准模板库(STL)中的容器来记录魔方的旋转动作,为魔方的回拧提供依据。

关键词:魔方,动画,三维模型,纹理贴图Abstract3-D animation is also called 3D animation, in recent years as computer hardware and software technology and the development of a new and emerging technologies, its technical simulate the real object is the way to become a useful tool. Because of its accuracy, authenticity and unlimited operable, is now widely used in medicine, education, military, entertainment and many other areas.This is designed to Visual C + +6.0 development environment, the use of OpenGL (Open Graphics Library) functions, drawing Rubik's Cube and Rubik's Cube to achieve the rotation, randomly generated, to twist, transparent processing and zoom functions. Drawing a basic function of the graphics and positioning function, add the corresponding color, texture Rubik's Cube model to achieve the draw. By reading load BMP files, applications texture mapping technology to complete the Rubik's Cube rotation of the handle. Using randomly generated random numbers to disrupt the order of a Rubik's Cube, and the use of C + + Standard Template Library (STL) of containers to record the rotating Rubik's Cube action for the Rubik's Cube to provide the basis for fastening.Key words: Rubik's Cube, animation, model, rendering, texture mapping目录1引言 (1)1.1课题研究的目的与意义 (1)1.2 国内外发展现状 (2)1.3 论文的主要内容 (3)2 开发环境及开发工具 (5)2.1 课题需要的知识 (5)2.2 OpenGL概述 (6)3 3D魔方生成的技术实现 (12)3.1 设计思路和需要解决的问题 (12)3.2 初始化 (13)3.3 魔方模型的设计 (17)3.4 纹理及灯光的设计 (20)3.5 程序功能效果 (32)4 总结 (34)参考文献 (35)致谢辞 (36)附录1 外文原文 (37)附录2 中文译文 (46)1引言1.1课题研究的目的与意义一、目的随着计算机技术的发展和三维图形理论与算法的日益成熟,结合三维建模技术进行创建三维电子游戏已经成为可能,对于游戏的三维模拟,除了具有真实感,符合人们平时所看的物体,更可以增添游戏的乐趣。

openGL+VS2010的例程--旋转变色立方体(三维)

openGL+VS2010的例程--旋转变色立方体(三维)

openGL+VS2010的例程--旋转变⾊⽴⽅体(三维)效果图如上。

步骤:⾸先,变换模型视⾓;然后,改变颜⾊;最后,利⽤顶点数组绘制⽴⽅体。

源代码如下:#include <GL/glut.h>// 绘制⽴⽅体// 将⽴⽅体的⼋个顶点保存到⼀个数组⾥⾯static const float vertex_list[][3] ={-0.5f, -0.5f, -0.5f,0.5f, -0.5f, -0.5f,-0.5f, 0.5f, -0.5f,0.5f, 0.5f, -0.5f,-0.5f, -0.5f, 0.5f,0.5f, -0.5f, 0.5f,-0.5f, 0.5f, 0.5f,0.5f, 0.5f, 0.5f,};// 将要使⽤的顶点的序号保存到⼀个数组⾥⾯static const GLint index_list[][2] ={{0, 1},{2, 3},{4, 5},{6, 7},{0, 2},{1, 3},{4, 6},{5, 7},{0, 4},{1, 5},{7, 3},{2, 6}};// 绘制⽴⽅体void DrawCube(void){int i,j;glBegin(GL_LINES);for(i=0; i<12; ++i) // 12 条线段{for(j=0; j<2; ++j) // 每条线段 2个顶点{glVertex3fv(vertex_list[index_list[i][j]]);}}glEnd();}static float rotate = 0;static int times = 0;void renderScene(void){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清理颜⾊缓冲和深度缓冲glMatrixMode(GL_MODELVIEW); // 对模型视景的操作glLoadIdentity(); // 重置当前指定的矩阵为单位矩阵glPushMatrix(); // 压栈//glTranslatef(-0.2, 0, 0); // 平移//glScalef(1, 1, 1); // 缩放times++;if(times > 100){times = 0;}if(times % 100 == 0) // [0, 100){rotate += 0.5; // [0, 20)}glRotatef(rotate, 0, 1, 0); // 旋转glRotatef(rotate, 1, 0, 0);// 动态颜⾊变换--红->绿->蓝->红if(rotate == 0)glColor3f(1, 0, 0);if(rotate ==90)glColor3f(0, 1, 0);if(rotate ==180)glColor3f(0, 0, 1);if(rotate ==270)glColor3f(1, 1, 0);if(rotate ==360)rotate = 0;DrawCube(); // 绘制⽴⽅体glPopMatrix();// 出栈glutSwapBuffers();}int main(int argc, char* argv[]){glutInit(&argc, argv); // 初始化GLUTglutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA); glutInitWindowPosition(100, 100); // 显⽰窗⼝在屏幕的相对位置glutInitWindowSize(500, 500); // 设置显⽰窗⼝⼤⼩glutCreateWindow(argv[0]); // 创建窗⼝,附带标题glutDisplayFunc(renderScene); // 注册显⽰⽤的函数glutIdleFunc(renderScene); // 注册空闲⽤的函数glutMainLoop(); // GLUT 状态机return0;}。

openGL三维图形xyz轴旋转与平移

openGL三维图形xyz轴旋转与平移

#include <GL/glut.h>static GLfloat angle = 0.0;static GLfloat movex = 0.0;static GLfloat movey = 0.0;static GLfloat len = 1.0;static GLint x=0.0,y=0.0,z=0.0;static void init(){glClearColor(1.0, 1.0, 1.0, 0.0);}void display(){glClear(GL_COLOR_BUFFER_BIT);glColor3f(0.0, 1.0, 1.0);glPushMatrix();glTranslatef(movex, movey, 0.0);glScalef( len, len, len );glRotatef(angle, x,y, z);glutWireSphere(40, 16, 16);glPopMatrix();glFlush();}void moveright(){movex+=10.0;if (movex>100.0)movex=0.0;glutPostRedisplay();}void moveleft(){movex-=10.0;if (movex<-100.0)movex=0.0;glutPostRedisplay();}void moveup(){movey+=10.0;if (movey>100.0)movey=0.0;glutPostRedisplay(); }void movedown(){movey-=10.0;if (movey<-100.0)movey=0.0;glutPostRedisplay(); }void zoom(){len+=0.1;if (len>10.0)len=10.0;glutPostRedisplay(); }void shrink(){len-=0.1;if (len<-10.0)len=-10.0;glutPostRedisplay(); }void rotatez(){z=1.0;x=0.0;y=0.0;angle+=20.0;if (angle>=360.0)angle=0.0;glutPostRedisplay(); }void rotatey(){z=0.0;y=1.0;x=0.0;angle+=20.0;if (angle>=360.0)angle=0.0;glutPostRedisplay();}void rotatex(){z=0.0;x=1.0;y=0.0;angle+=20.0;if (angle>=360.0)angle=0.0;glutPostRedisplay();}void reshape(GLsizei w, GLsizei h){glViewport(0, 0, w, h);glMatrixMode(GL_PROJECTION);glLoadIdentity();glOrtho(-100.0, 100.0, -100.0, 100.0, 0.0, 100.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();}void specialKeyFunc( int key, int x, int y){switch(key){case GLUT_KEY_LEFT:moveleft();break;case GLUT_KEY_RIGHT:moveright();break;case GLUT_KEY_UP:moveup();break;case GLUT_KEY_DOWN:movedown();break;case GLUT_KEY_F1:zoom();break;case GLUT_KEY_F2:shrink();break;case GLUT_KEY_F7:rotatez();break;case GLUT_KEY_F6:rotatey();break;case GLUT_KEY_F5:rotatex();break;default:break;}}void main(){glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowPosition(50, 100);glutInitWindowSize(550, 600);glutCreateWindow("三维图形的旋转与平移");glutSpecialFunc(specialKeyFunc);init();glutDisplayFunc(display);glutReshapeFunc(reshape);glutMainLoop();}。

旋转式正方体和正四面体

旋转式正方体和正四面体
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glVertex3f(-1.0f,-1.0f,-1.0f);
glColor3f(0.0f,1.0f,0.0f);
glVertex3f(-1.0f,-1.0f, 1.0f);
glEnd();
glLoadIdentity();
glTranslatef(1.5f,0.0f,-7.0f);
glRotatef(rquad,1.0f,1.0f,1.0f);
wc.hCursor= LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground= NULL;
wc.lpszMenuName= NULL;
wc.lpszClassName= "OpenGL";
if (!RegisterClass(&wc))
{
MessageBox(NULL,"Failed To Register The Window Class.","ERROR",MB_OK|MB_ICONEXCLAMATION);
wc.style= CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
wc.lpfnWndProc= (WNDPROC) WndProc;
wc.cbClsExtra= 0;
wc.cbWndExtra= 0;

opengl 立方体 纹理 顶点 索引 定义 -回复

opengl 立方体 纹理 顶点 索引 定义 -回复

opengl 立方体纹理顶点索引定义-回复OpenGL立方体纹理顶点索引定义OpenGL是一种图形编程接口,用于渲染2D和3D图形。

在OpenGL中,我们可以使用纹理贴图来给图形对象添加更多的细节和逼真感。

本文将重点讨论如何使用顶点和索引来定义一个带有纹理的立方体。

第一步:顶点定义在OpenGL中,一个3D对象的顶点通常使用(x, y, z)坐标来表示。

对于立方体而言,我们可以使用8个顶点来定义。

一个立方体的八个顶点可以如下定义:顶点1: (-1.0, 1.0, 1.0)顶点2: (1.0, 1.0, 1.0)顶点3: (-1.0, -1.0, 1.0)顶点4: (1.0, -1.0, 1.0)顶点5: (-1.0, 1.0, -1.0)顶点6: (1.0, 1.0, -1.0)顶点7: (-1.0, -1.0, -1.0)顶点8: (1.0, -1.0, -1.0)这些坐标定义了立方体的8个顶点,每个顶点都具有一个唯一的坐标。

第二步:纹理坐标定义在OpenGL中,我们可以为每个顶点定义一个纹理坐标。

纹理坐标用来确定在纹理贴图中的哪个位置采样颜色。

纹理坐标通常使用(u, v)坐标表示,并且取值范围从0到1。

对于立方体来说,我们可以为每个顶点定义一个纹理坐标。

纹理坐标可以如下定义:顶点1: (0.0, 1.0)顶点2: (1.0, 1.0)顶点3: (0.0, 0.0)顶点4: (1.0, 0.0)顶点5: (0.0, 1.0)顶点6: (1.0, 1.0)顶点7: (0.0, 0.0)顶点8: (1.0, 0.0)这些纹理坐标定义了立方体的每个顶点在纹理贴图中的采样位置。

第三步:索引定义在OpenGL中,我们通常使用索引数组来确定如何连接顶点以形成图形对象。

对于立方体而言,我们可以使用索引来确定每个顶点的连接关系。

编写一个索引数组可以减少顶点的重复定义,从而节省内存。

立方体的索引定义如下所示:索引1: 0索引2: 1索引3: 2索引4: 3索引5: 4索引6: 5索引7: 6索引8: 7索引9: 0索引10: 4索引11: 1索引12: 5索引13: 2索引14: 6索引15: 3索引16: 7索引17: 0索引18: 2索引19: 1索引20: 3索引21: 4索引22: 6索引23: 5索引24: 7这些索引定义了顶点之间的连接关系,从而构建了立方体的形状。

3-绘制旋转的彩色3D物体

3-绘制旋转的彩色3D物体
5
• 在第一课代码的基础上,只需用下面的代码覆盖 原来的DrawGLScene()就可以了。 • int DrawGLScene(GLvoid) { //此过程包括所有绘制代码 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除屏幕及深度缓存 glLoadIdentity();
3
• OpenGL基本库提供了大量绘制各种类型图元的 方法,辅助库也提供了不少描述复杂三维图形的 函数。其主要的图元:点、线、多边形的构造, 是构建复杂模型的基础。 • 点(Point) 浮点值表示的点称为顶点(Vertex)。 所有顶点在OpenGL内部计算时都作为三维点处 理,二维点默认z值为0。所有顶点坐标用齐次坐 标(x, y, z, w) 表示,如果w不为0.0,这些顶点即 为三维空间点(x/w, y/w, z/w)。编程者可以自己 指定w值,一般w缺省为1.0。 • 线(Line) 在OpenGL中,线代表线段(Line Segment),不是数学意义上的那种沿轴两个方向 无限延伸的线。这里的线由一系列顶点顺次连结 而成,有闭合和不闭合两种。
–glTranslatef(x, y, z)沿着 X, Y 和 Z 轴移动。沿X轴 左移1.5个单位,Y轴不动(0.0f),最后移入屏幕 6.0f个单位。注意glTranslatef(x, y, z)移动时,并 不是相对屏幕中心移动,而是相对当前屏幕位臵
• 现在已经移到了屏幕的左半部分,并且将视图推 入屏幕背后足够距离以便可以看见全部场景。 • glBegin(GL_TRIANGLES); //绘制三角形 glVertex3f( 0.0f, 1.0f, 0.0f); //上顶点 glVertex3f(-1.0f,-1.0f, 0.0f); //左下顶点 glVertex3f( 1.0f,-1.0f, 0.0f); //右下顶点 glEnd(); //三角形绘制结束
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于OPENGL实现的彩色旋转立方体,插入了背景音乐,将背景音乐放到指定路径中#include<stdio.h>#include<GL\glut.h>#include<stdlib.h>#include"windows.h"#include<mmsystem.h>#include<iostream>#pragma comment(lib, "WINMM.LIB")GLfloat xrot = 0.0;GLfloat yrot = 0.0;GLfloat zrot = 0.0;GLint Mode = 0; //控制旋转的模式void cube() //绘制一个立方体{glBegin(GL_QUADS);glColor3f(1.0, 1.0, 0.0);glVertex3f(1.0, 1.0, -1.0);glColor3f(0.0, 1.0, 0.0);glVertex3f(-1.0, 1.0, -1.0);glColor3f(0.0, 1.0, 1.0);glVertex3f(-1.0, 1.0, 1.0);glColor3f(1.0, 1.0, 1.0);glVertex3f(1.0, 1.0, 1.0);glColor3f(1.0, 0.0, 1.0);glVertex3f(1.0, -1.0, 1.0);glColor3f(0.0, 0.0, 1.0);glVertex3f(-1.0, -1.0, 1.0);glColor3f(0.0, 0.0, 0.0);glVertex3f(-1.0, -1.0, -1.0);glColor3f(1.0, 0.0, 0.0);glVertex3f(1.0, -1.0, -1.0);glColor3f(1.0, 1.0, 1.0);glVertex3f(1.0, 1.0, 1.0);glColor3f(0.0, 1.0, 1.0);glVertex3f(-1.0, 1.0, 1.0);glColor3f(0.0, 0.0, 1.0);glVertex3f(-1.0, -1.0, 1.0);glColor3f(1.0, 0.0, 1.0);glVertex3f(1.0, -1.0, 1.0);glColor3f(1.0, 0.0, 0.0);glVertex3f(1.0, -1.0, -1.0);glColor3f(0.0, 0.0, 0.0);glVertex3f(-1.0, -1.0, -1.0);glColor3f(0.0, 1.0, 0.0);glVertex3f(-1.0, 1.0, -1.0);glColor3f(1.0, 1.0, 0.0);glVertex3f(1.0, 1.0, -1.0);glColor3f(0.0, 1.0, 1.0);glVertex3f(-1.0, 1.0, 1.0);glColor3f(0.0, 1.0, 0.0);glVertex3f(-1.0, 1.0, -1.0);glColor3f(0.0, 0.0, 0.0);glVertex3f(-1.0, -1.0, -1.0);glColor3f(0.0, 0.0, 1.0);glVertex3f(-1.0, -1.0, 1.0);glColor3f(1.0, 1.0, 0.0);glVertex3f(1.0, 1.0, -1.0);glColor3f(1.0, 1.0, 1.0);glVertex3f(1.0, 1.0, 1.0);glColor3f(1.0, 0.0, 1.0);glVertex3f(1.0, -1.0, 1.0);glColor3f(1.0, 0.0, 0.0);glVertex3f(1.0, -1.0, -1.0);glEnd();}void display(void){if (Mode == 0){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glLoadIdentity();glTranslatef(0, 0, -5);glRotatef(xrot, 1, 0, 0);glRotatef(yrot, 0, 1, 0);glRotatef(zrot, 0, 0, 1);cube();}if (Mode == 1){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glLoadIdentity();glTranslatef(0, 0, -5);glRotatef(xrot, 1, 0, 0);glRotatef(yrot, 0, 1, 0);glRotatef(zrot, 0, 0, 1);cube();xrot = xrot + 1;yrot = yrot + 1;zrot = zrot + 1;Sleep(10);}glutSwapBuffers();}void reshape(int w, int h){if (h == 0) h = 1;glViewport(0, 0, (GLsizei)w, (GLsizei)h);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(45.0, (GLfloat)w / (GLfloat)h, 0.1, 100.0);glMatrixMode(GL_MODELVIEW);}void init(int width, int height){if (height == 0) height = 1;glClearColor(0.0, 0.0, 0.0, 0.0);glClearDepth(1.0);glDepthFunc(GL_LESS);glEnable(GL_DEPTH_TEST);glShadeModel(GL_SMOOTH);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(45.0, (GLfloat)width / (GLfloat)height, 1, 100.0);glMatrixMode(GL_MODELVIEW);}void keyboard(unsigned char key, int w, int h){if (key == 'f' || key == 'F') // 进入全屏glutFullScreen();if (key == 27) // ESC退出全屏{glutReshapeWindow(640, 480); // 设置窗口大小(不能用初始化的函数)glutPositionWindow(400, 100); // 设置窗口位置(不能用初始化的函数)}if (key == 'c' || key=='C') // 退出程序exit(0);if (key == 'x' || key=='X') //绕x轴旋转xrot += 5;if (key == 'y' || key == 'Y') //绕y轴旋转yrot += 5;if (key == 'z' || key == 'Z') //绕z轴旋转zrot += 5;if (key == 's' || key == 'S') //进入自由旋转模式{Mode = 1;}if (key == 'd' || key == 'D') //进入键盘控制旋转模式,使立方体复原到原来的大小{Mode = 0;}}int main(int argc, char** argv){glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);glutInitWindowPosition(400, 100);glutInitWindowSize(640, 480);glutCreateWindow("彩色旋转立方体");glutDisplayFunc(display);glutIdleFunc(display);glutReshapeFunc(reshape);glutKeyboardFunc(keyboard);init(640, 480);PlaySound(TEXT("E:\\hello3\\图形学实验\\旋转立方体\\旋转立方体\\music\\background music.wav"), NULL, SND_FILENAME | SND_ASYNC | SND_NOSTOP | SND_LOOP);glutMainLoop();return 0;}。

相关文档
最新文档