计算机图形学实验-实验七 三维立方体的旋转
- 格式:doc
- 大小:617.00 KB
- 文档页数:8
3维移动立方体原理
移动立方体的原理涉及到三维空间中的几何变换和坐标系转换。
当我们谈论立方体的移动时,我们通常是指在三维空间中对立方体
进行平移、旋转或缩放等操作。
这些操作都可以通过数学和物理原
理来解释。
首先,让我们来看平移。
平移是指在三维空间中沿着某个方向
移动物体,这可以通过改变物体的坐标来实现。
假设我们有一个立
方体,它的每个顶点都有一个三维坐标(x, y, z)。
如果我们想将立
方体沿着x、y和z轴分别移动一个距离dx、dy和dz,我们只需将
每个顶点的坐标分别加上这些距离即可实现平移。
其次,旋转是另一种常见的立方体移动操作。
旋转可以围绕某
个轴进行,比如绕x、y或z轴。
在数学上,我们可以使用旋转矩阵
来描述这种变换。
通过乘以旋转矩阵,立方体的每个顶点的坐标都
会发生变化,从而实现旋转操作。
最后,缩放是指改变立方体的尺寸。
这可以通过改变立方体顶
点的坐标,并相应地调整其边长来实现。
缩放操作也可以用矩阵来
表示,通过矩阵乘法将立方体的顶点坐标进行相应的缩放。
需要注意的是,以上所述的操作都是在数学模型层面上进行描述的。
在实际的计算机图形学或游戏开发中,立方体的移动往往是通过矩阵变换来实现的,这涉及到了图形学和线性代数的知识。
总的来说,移动立方体的原理涉及到了数学、物理和计算机图形学等多个领域的知识。
通过合理的数学描述和变换操作,我们可以实现对立方体的平移、旋转和缩放等操作。
贵州大学实验报告
学院:计算机科学与信息学院专业:软件工程班级: 102班姓名学号实验组实验时间指导教师成绩实验项目名称实验七三维立方体的旋转
实
验目的了解并掌握三维立方体的绘制和显示并通过按键控制其旋转,每次旋转150
实
验要求根据本实验的特点、要求和具体条件,了解并掌握三维立方体的绘制和显示,并通过按键控制其旋转,每次旋转150,成功编写测试代码进行实验。
绘制一个三维立方体。
实验原理Java3D
在java3D中坐标轴的显示如下所示:Java3D的编程思想显示如下:。
计算机图形学实验报告计算机图形学课程综合实验题⽬:WebGL实现正⽅体的3D旋转作者分⼯:单独完成签名:时间:2018年1⽉16⽇⼀、实验⽬的掌握WebGL的三维图形绘制⽅法⼆、实验要求结合相关的图形学知识,使⽤WebGL编程实现在浏览器显⽰⼀个3D的正⽅体,并可通过⿏标操作控制此正⽅体的旋转;利⽤纹理知识为正⽅体的各个⾯贴上图⽚。
实验完成后要求根据⾃⼰的成果撰写⼀份实验报告。
三、实现原理实现⿏标控制⽴⽅体的旋转需要监听⿏标的移动时间,在⿏标按下左键时记录⿏标此时的坐作为初始坐标,然后在⿏标移动时⽤当前坐标减去初始坐标,获得⿏标的位移,根据这个位移计算旋转矩阵,从⽽旋转⽴⽅体。
具体实现细节如下:1、⾸先需要设置两个着⾊器:a.顶点着⾊器的作⽤是保存图形的顶点信息(如位置,颜⾊等),具体代码如下,本程序使⽤模型视图投影矩阵变换顶点坐标,并通过v_TexCoord向⽚元着⾊器提供纹理坐标⽤于映射纹理。
绘制⼀个顶点需要调⽤⼀次。
图1 顶点着⾊器程序b.⽚元着⾊器:⽚元相当于像素,此着⾊器通过gl_FragColor指定颜⾊,可以对相应的区域进⾏绘制。
图2 ⽚元着⾊器程序2、设置⼀个缓冲区对象,这是web GL的⼀个存储区。
⽤于保存想要绘制的所有顶点的数据,并且能⼀次性向顶点着⾊器输⼊多个顶点数据。
需要的操作如下,初始化时已经为要绘制的⽴⽅体指定了坐标。
function initVertexBuffers(gl) {// 创建⽴⽅体// v6----- v5// /| /|// v1------v0 |// | | | |// | |v7--- - |v4// |/ |/// v2------v3var vertices = new Float32Array([ // ⽴⽅体顶点坐标1.0, 1.0, 1.0, -1.0, 1.0, 1.0, -1.0,-1.0, 1.0, 1.0,-1.0, 1.0, // v0-v1-v2-v3 前1.0, 1.0, 1.0, 1.0,-1.0, 1.0, 1.0,-1.0,-1.0, 1.0, 1.0,-1.0, // v0-v3-v4-v5 右1.0, 1.0, 1.0, 1.0, 1.0,-1.0, -1.0, 1.0,-1.0, -1.0, 1.0, 1.0, // v0-v5-v6-v1 上-1.0, 1.0, 1.0, -1.0, 1.0,-1.0, -1.0,-1.0,-1.0, -1.0,-1.0, 1.0, // v1-v6-v7-v2左-1.0,-1.0,-1.0, 1.0,-1.0,-1.0, 1.0,-1.0, 1.0, -1.0,-1.0, 1.0, // v7-v4-v3-v2 下1.0,-1.0,-1.0, -1.0,-1.0,-1.0, -1.0, 1.0,-1.0, 1.0, 1.0,-1.0 // v4-v7-v6-v5 后]);var texCoords = new Float32Array([ // 纹理坐标1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, // v0-v1-v2-v3 前0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, // v0-v3-v4-v5右1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, // v0-v5-v6-v1上1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, // v1-v6-v7-v2 左0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, // v7-v4-v3-v2下0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0 // v4-v7-v6-v5 后]);var indices = new Uint8Array([0, 1, 2, 0, 2, 3, // 前4, 5, 6, 4, 6, 7, // 右8, 9,10, 8,10,11, // 上12,13,14, 12,14,15, //左16,17,18, 16,18,19, // 下20,21,22, 20,22,23 //后]);// 创建⼀个缓冲区对象var indexBuffer = gl.createBuffer();if (!indexBuffer) {return -1;}// 将顶点信息写⼊缓冲区对象if (!initArrayBuffer(gl, vertices, 3, gl.FLOAT, 'a_Position')) return -1; // 顶点坐标if (!initArrayBuffer(gl, texCoords, 2, gl.FLOAT, 'a_TexCoord')) return -1;// 纹理坐标// 解绑缓冲区对象gl.bindBuffer(gl.ARRAY_BUFFER, null);// 将顶点坐标和纹理坐标写到缓冲区对象中gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer);gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);return indices.length;}3、设置⿏标响应事件,监视⿏标的左键的按下拖拽动作。
课程设计(论文)任务书软件学院学院桥梁专业 2 班一、课程设计(论文)题目旋转的彩色立方体二、课程设计(论文)工作自 2014 年 6 月 2 日起至2014 年 6 月 6 日止。
三、课程设计(论文) 地点: 软件学院实训中心四、课程设计(论文)内容要求:1.本课程设计的目的计算机图形学课程设计是计算机图形学课程中的知识、技术和技能的一个综合应用,是培养图形软件开发能力的综合训练。
通过课程设计,使学生更深入地理解和掌握计算机图形学理论与相关算法,巩固课内所学的知识、技术和技能,进一步提高图形软件开发的能力。
为毕业设计和毕业后从事计算机绘图、计算机辅助设计、辅助教学、辅助工程、图形处理等打下基础。
2.课程设计的任务及要求1)课程设计任务:1、绘制一个不停转动的立方体,通过键盘的方向控制旋转方向;2、实现立方体的纹理映射,为立方体的六个面分别贴上不同的纹理;3、利用消影技术,实验立方体表面的遮挡关系;4、具有比较好的动画效果,消除闪烁现象。
2)课程设计论文编写要求(1)课程设计任务及要求(2)设计思路--工作原理、功能规划(3)详细设计---数据分析、算法思路、功能实现(含程序流程图、主要代码及注释)、界面等。
(4)运行调试与分析讨论---给出运行屏幕截图,分析运行结果,有何改进想法等。
(5)设计体会与小结---设计遇到的问题及解决办法,通过设计学到了哪些新知识,巩固了哪些知识,有哪些提高。
(6)参考文献(必须按标准格式列出,可参考教材后面的参考文献格式)(7)报告按规定排版打印,要求装订平整,否则要求返工;(8)课设报告的装订顺序如下:封面---任务书---中文摘要---目录----正计算机图形学课程设计文---附录(代码及相关图片)(9)严禁抄袭,如有发现,按不及格处理。
4)课程设计评分标准:(1)学习态度:10分;(2)系统设计:20分;(3)编程调试:20分;(4)回答问题:20分;(5)论文撰写:30分。
实现三角体,正方体的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);} }效果图:。
课程设计(综合实验)报告=实验名称 OpenGL基本图元绘制实验课程名称计算机图形学||专业班级:计算机11K1学生姓名:王粲学号:111909010118成绩:指导教师:姜丽梅实验日期:2014.4.20实验一、OpenGL基本图元绘制实验一、实验目的及要求1.掌握计算机图形学及交互式计算机图形学的定义,了解OpenGL的功能及工作流程,掌握基于OpenGL Glut库的程序框架。
2.掌握基本的二维线画图元的绘制算法及属性,掌握OpenGL基本图元的绘制。
3.理解二维、三维图形的绘制流程,掌握二维图形和三维图形的图形变换。
4.了解形体的真实感表示的内容,包括消隐技术、简单光照明模型、多边形的明暗绘制技术以及纹理映射技术。
5.要求使用OpenGL及GLUT库在Visual C++环境下编写图形绘制程序实现基本图元绘制。
6.要求对绘制的简单场景综合利用几何变换或gluLookAt函数实现交互式三维观察程序。
二、实验内容在两个具有不同属性的窗口中分别显示一个旋转的三角形来演示单缓存和双缓存,在旋转过程中不断改变图形的颜色,利用鼠标或菜单可终止/启动图形旋转。
明确程序包括哪些函数,各个函数的功能以及整个流程,从而为进一步做综合性的图形绘制实验奠定基础。
三、所用仪器、设备Windows XP系统,Visual C++,OpenGL及GLUT库四、实验方法与步骤先配置环境,把相关文件放到相应的文件夹C:\Program Files\Microsoft Visual Studio\VC98\Include\GLC:\WINDOWS\system32C:\Program Files\Microsoft Visual Studio\VC98\Lib再通过VC++进行编译五、程序代码#include <gl/glut.h>#include <stdlib.h>#include < stdio.h >#include <math.h>#define DEG_TO_RAD 0.017453static GLfloat theta = 0.0;GLfloat r = 1.0; //设置正方形的初始颜色GLfloat g = 0.0;GLfloat b = 0.0;int singleb,doubleb;void display(void){ glClear(GL_COLOR_BUFFER_BIT); //正方形颜色渐变glColor3f(r, g,b);r = r - 0.002;g = g + 0.002;b = b + 0.001;if(r < 0.001){ r = 1.0;g = 0.0;b = 0.0; }glBegin(GL_POLYGON);glVertex2f(cos(DEG_TO_RAD*theta), sin(DEG_TO_RAD*theta));glVertex2f(cos(DEG_TO_RAD*(theta+90)),sin(DEG_TO_RAD*(theta+90)));glVertex2f(cos(DEG_TO_RAD*(theta+180)),sin(DEG_TO_RAD*(theta+180)));glVertex2f(cos(DEG_TO_RAD*(theta+270)), sin(DEG_TO_RAD*(theta+270)));glEnd();glutSwapBuffers();}void spinDisplay (void) //正方形转动弧度设置{theta = theta +0.1;if (theta > 360.0)theta = theta - 360.0;glutSetWindow(singleb);glutPostWindowRedisplay(singleb);glutSetWindow(doubleb);glutPostWindowRedisplay(doubleb);}void spinDisplay1(void){glutPostRedisplay();}void myReshape(int w, int h){glViewport(0, 0, w, h); //指定平面上一个矩形裁剪区域,glMatrixMode(GL_PROJECTION);glLoadIdentity();if (w <= h)gluOrtho2D(-1.,1.,-1.*(GLfloat)h/(GLfloat)w,1.*(GLfloat)h/(GLfloat)w);elsegluOrtho2D(-1.*(GLfloat)w/(GLfloat)h, 1.*(GLfloat)w/(GLfloat)h, -1., 1.);}void mouse(int button,int state,int x,int y) //鼠标定义{ switch(button){case GLUT_LEFT_BUTTON:if(state == GLUT_DOWN ){ glutIdleFunc(spinDisplay1);}break;case GLUT_RIGHT_BUTTON:if(state == GLUT_DOWN)glutIdleFunc(spinDisplay);break;default:break;}}void main(int argc, char** argv) //主函数{glutInit(&argc,argv);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);glutInitWindowPosition(100, 100);glutInitWindowSize(500, 500);singleb=glutCreateWindow("spinning square"); glClearColor(1.0, 1.0, 0.0, 0.1);glutDisplayFunc(display);glutReshapeFunc(myReshape);glutIdleFunc(spinDisplay);glutMouseFunc(mouse);glutInit(&argc,argv);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);glutInitWindowPosition(600, 100);glutInitWindowSize(500, 500);doubleb=glutCreateWindow("spinning square"); glClearColor(1.0, 1.0, 0.0, 0.1);glutDisplayFunc(display);glutReshapeFunc(myReshape);glutIdleFunc(spinDisplay);glutMouseFunc(mouse);glutMainLoop();}六、实验结果实验二、OpenGL三维观察综合实验一、目的与要求7.掌握计算机图形学及交互式计算机图形学的定义,了解OpenGL的功能及工作流程,掌握基于OpenGL Glut库的程序框架。
贵州大学实验报告
学院:计算机科学与信息学院专业:软件工程班级: 102班姓名学号实验组实验时间指导教师成绩实验项目名称实验七三维立方体的旋转
实
验目的了解并掌握三维立方体的绘制和显示并通过按键控制其旋转,每次旋转150
实
验要求根据本实验的特点、要求和具体条件,了解并掌握三维立方体的绘制和显示,并通过按键控制其旋转,每次旋转150,成功编写测试代码进行实验。
绘制一个三维立方体。
实验原理Java3D
在java3D中坐标轴的显示如下所示:Java3D的编程思想显示如下:
在实验时,要引入相关的jar包,显示如下所示:
实验环境硬件平台:PC机
软件:Windows7平台,eclipse集成开发环境,java编程语言。
Java 3D
实验步骤1.掌握算法原理;
2.依据算法,编写源程序并进行调试;
3.对运行结果进行保存与分析;
4.把源程序以文件的形式提交;
(2)点击键盘上的“X”键,让正方体在x轴上进行旋转,每次15度截图显示如下所示:
(3)点击键盘上的“Y”键,让正方体在Y轴上进行旋转,每次15度
(4)点击键盘上的“Z”键,让正方体在Z轴上进行旋转,每次15度
实验总结
通过本次实验,让我了解并掌握了三维立方体的旋转,通过编写实验的测试代码进行了原理的验证,在本次试验中,绘制的过程也是遇到了不少的问题,通过查阅相关资料和问同学也得到了解决,收获很大,我觉得实验就是一个检验在课本上所学的知识是否真正掌握的一个很好的方法,通过实验你会发现你原本觉得会做的实验其实真正做起来也不是很容易,本次实验完成的还可以,与此同时也加深了我对于计算机图形学的兴趣,在今后的学习中,还会更加努力,争取学到更多的算法
指
导
教
师
意
见签名:年月日。