图形学实验报告三维图形

合集下载

图形学实验一 三维分形(附源代码)

图形学实验一 三维分形(附源代码)

实验报告实验名称:三维分形算法姓名:陈怡东学号:09008406程序使用说明:程序打开后会呈现出3次分形后的四面体,因为考虑到观察效果的清晰所以就用了3次分形作为演示。

与用户的交互:1键盘交互:分别按下键盘上的数字键1,2,3,4可以分别改变四面体的4个面的颜色。

按下字母c(不区别大小写)可以改变视图函数,这里循环切换3种视图函数:glOrtho,glFrustum,gluPerspective,但是改变视图函数后要窗口形状变化后才能显现出来按下字母键q(不区别大小写)可以退出程序2鼠标交互:打开后在绘图的区域按下鼠标左键不放便可以拖动图形的视角,这里为了展现图形的3D效果因此固定了其中一点不放,这样就可以看到3D的效果。

鼠标右击则有弹出菜单显示,其中改变颜色则是同时改变4个面的颜色,本程序中运用了8组配色方案。

改变视图函数也是上述的3种函数,这里的效果立刻显现,但是还有很多问题达不到所要的效果,希望老师能帮忙解决一下。

设计思路:分形算法:把四面体细分成更小的四面体,先找出其6个棱的中点并连接起来,这样就在4个顶点处各有一个小的四面体,原来四面体中剩下的部分应当去掉。

仿效二维的生成方法,我们对保留的四个小四面体进行迭代细分。

这样细分结束后通过绘制4个三角形来绘制每一个剩下的四面体。

交互的实现:键盘交互,即通过对按键的响应写上响应函数实现对视图和颜色的改变。

鼠标交互:通过对鼠标左右按键的实现:该部分只做了必要的介绍,具体实现见代码(附注释)分形算法:void tetra(GLfloat *a,GLfloat *b,GLfloat *c,GLfloat *d)函数实现的是绘制四面体并且给四个面绘上不同的颜色。

以区别开来,函数的实现细节见代码,有注释介绍。

void triangle3(GLfloat *a,GLfloat *b,GLfloat *c)函数用来绘制每个平面细分后的三角形。

其中顶点设置为3维坐标glVertex3fv(a);void divide_tetra(GLfloat *a,GLfloat *b,GLfloat *c,GLfloat *d,int m)细分四面体的函数实现。

计算机图形学实验报告

计算机图形学实验报告

实验一 3D模型的加载、渲染与三维操作学院:专业班级:指导老师:学号:姓名:完成日期:目录一、实验目的 (3)二、使用的工具软件及环境 (3)三、实验内容 (3)四、实验步骤 (3)五、思考 (12)一、实验目的1、掌握在Microsoft Visual Studio环境中使用OpenGL、GLUT和GLUI;2、了解计算机图形学固定流水线;3、了解OpenGL编程基础;4、掌握三维观察的数学表达和程序实现;5、掌握多边形网格的绘制;二、使用的工具软件及环境Microsoft Visual Studio 2010、OpenGL、Glut、Glui三、实验内容1、在VS 2010中配置OpenGL环境;2、编译简单的GLUT程序;3、编译GLUI源代码,并在调试模式下执行6个示例程序;4、在给定的工程中添加绘制简单几何体的代码;5、在给定的工程中添加读取、绘制三维模型的代码;6、在给定的工程中添加旋转、平移和缩放的控制代码;四、实验步骤1、安装Microsoft Visual Studio软件版本选择:Microsoft Visual Studio 2010以上版本2、VS2010中配置GLUT1)下载GLUT。

Windows环境下的GLUT下载地址:/resources/libraries/glut/glutdlls37beta.zip2)将下载的压缩包解开,将得到5个文件:glut.h、glut.lib、glut32.lib、glut.dll、glut32.dll。

3)将glut.h放到"%WinDir%\ProgramFiles(x86)\Microsoft SDKs\Windows\v7.0A\Include\gl\"文件夹中。

4)将glut.lib和glut32.lib放到"%WinDir%\ProgramFiles(x86)\Microsoft Visual Studio 10.0\VC\lib\"文件夹中。

图形学实验报告三维图形

图形学实验报告三维图形

图形学课程设计题目:三维真实感图形设计与绘制专业:计算机科学与技术学号姓名:一.一)课程设计目的与要求图形学课程设计的主要目的是让同学们通过图形学的实际问题应用,进一步增强计算机图形学理论的理解、算法应用、图形数据结构设计与图形程序设计等,从而提高图形学实际应用与软件开发能力。

二)课程设计题目三维真实感图形设计与绘制三)问题的提出与需求分析(1)题目内容说明:本题目要求应用OpenGL的光照技术和纹理技术实现一个简单的三维真实感图形的程序设计。

具体要求实现功能:1)通过对话方式实现交互式设计光照模型功能。

2)实现三维模型纹理映射功能。

3)用鼠标跟踪球方法实现三维模型的空间旋转。

(2)技术要点说明1)三维模型显示场景树:将三维可视化模型场景内容分解用一种树或表数据结构描述。

2)实现一个读Targa文件的程序:Targa是一种常见的图像格式文件,该文件通常以未压缩的格式存储图像。

3)实现鼠标跟踪球方法程序。

二.设计思路要设计一个良好的场景和优秀的交互方式,现在虚拟现实场景十分繁多,各种交互方式也五花八门,我们要选择特定的场景,场景要保证两点:一是其新鲜性,让人耳目一新,否则会让人有过于老套的感觉;另外就是其真实度,这是本次课题的着重关注点;在选取选定的场景后,我们要定义各交互方式,在从现有可得到的交互方式案例中提取和创新,以保证开发出来的交互方式可以最大程度的提高人机交互的效率。

场景的规模是必须考虑的,因为设计的时间和人员有限,必须限制场景规模,没有时间和人力去开发过大的场景规模,但是如果场景规模过小,演示系统就无法给人带来非常强烈的真实感冲击,而且过小规模的场景也会限制交互方式的设计和开发;所以定义适当的场景规模,对于课题的成败十分重要。

通过对计算机图形学和三维人机交互方式等相关书籍和文献的阅读和学习,了解和掌握建立真实图形显示系统的过程和三维虚拟场景中人机交互的方式。

三维图形及动画场景的显示,就是把所建立的三维空间模型,经过计算机的复杂处理,最终在计算机二维屏幕上显示的过程,并且在显示的过程要保证其真实感。

计算机图形学与三维建模实验报告

计算机图形学与三维建模实验报告

计算机图形学与三维建模实验报告计算机图形学实验报告openGL的基本使用1.项目代码:// 2321321.cpp : 定义控制台应用程序的入口点。

#include"stdafx.h"#include<iostream>#include<stdio.h>#include<gl/glut.h>#include<gl/glu.h>#include<gl/gl.h>using namespace std;//#include"vgl.h" opengl4.3 编程宝典第8版库函数//#include"loadshaders.h"GLfloat x=0.0,y=0.0,z=0.0;//用于平移的变量GLfloat i=1.0,j=1.0,k=1.0;//用于缩放的变量int d=1;//用于是否判断旋转的开关GLfloat angle=0.0f;//旋转角度的变量void myDisplay(void){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// 创建透视效果视图glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(90.0f, 1.0f, 1.0f, 20.0f);glMatrixMode(GL_MODELVIEW);glLoadIdentity();gluLookAt(0.0, 0.0, 10.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// 定义4光源,从4个方向入射,第一个是白光,其他为红绿蓝{GLfloat sun_light_position[] = { -5.0f, 5.0f, 0.0f, 1.0f };GLfloat sun_light_position1[] = { 5.0f, 5.0f, 0.0f, 1.0f };GLfloat sun_light_position2[] = { -5.0f, -5.0f, 0.0f, 1.0f };GLfloat sun_light_position3[] = { 5.0f, -5.0f, 0.0f, 1.0f };GLfloat sun_light_ambient[] = { 0.0f, 0.0f, 0.0f,1.0f };GLfloat sun_light_diffuse[] = { 1.0f, 1.0f, 1.0f,1.0f };GLfloat sun_light_diffuse1[] = { 1.0f, 0.0f, 0.0f, 1.0f };GLfloat sun_light_diffuse2[] = { 0.0f, 1.0f, 0.0f, 1.0f };GLfloat sun_light_diffuse3[] = { 0.0f, 0.0f, 1.0f, 1.0f };GLfloat sun_light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };glLightfv(GL_LIGHT0, GL_POSITION,sun_light_position);glLightfv(GL_LIGHT0, GL_AMBIENT, sun_light_ambient);glLightfv(GL_LIGHT0, GL_DIFFUSE, sun_light_diffuse);glLightfv(GL_LIGHT0, GL_SPECULAR,sun_light_specular);glLightfv(GL_LIGHT1, GL_POSITION,sun_light_position1);glLightfv(GL_LIGHT1, GL_AMBIENT, sun_light_ambient);glLightfv(GL_LIGHT1, GL_DIFFUSE, sun_light_diffuse1);glLightfv(GL_LIGHT1, GL_SPECULAR,sun_light_specular);glLightfv(GL_LIGHT2, GL_POSITION, sun_light_position2);glLightfv(GL_LIGHT2, GL_AMBIENT, sun_light_ambient);glLightfv(GL_LIGHT2, GL_DIFFUSE, sun_light_diffuse2);glLightfv(GL_LIGHT2, GL_SPECULAR,sun_light_specular);glLightfv(GL_LIGHT3, GL_POSITION, sun_light_position3);glLightfv(GL_LIGHT3, GL_AMBIENT, sun_light_ambient);glLightfv(GL_LIGHT3, GL_DIFFUSE, sun_light_diffuse3);glLightfv(GL_LIGHT3, GL_SPECULAR,sun_light_specular);glEnable(GL_LIGHT0);glEnable(GL_LIGHT1);glEnable(GL_LIGHT2);glEnable(GL_LIGHT3);glEnable(GL_LIGHTING);glEnable(GL_DEPTH_TEST);}//绘制坐标轴{glBegin(GL_LINE);//x轴红色glColor3f(1,0,0);glVertex3f(10,0,0);glVertex3f(-10,0,0);//y轴绿色glColor3f(0,1,0);glVertex3f(0,10,0);glVertex3f(0,-10,0);//z轴蓝色glColor3f(0,0,1);glVertex3f(0,0,10);glVertex3f(0,0,-10);glEnd();}// 定义球体的材质并绘制{GLfloat ambient[] = { 0.2f, 0.2f, 0.2f, 1.0f };//环境颜色GLfloat diffuse[] = { 0.7f, 0.7f, 0.7f, 1.0f };//散射GLfloat specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };//镜面反射GLfloat emission[] = { 0.0f, 0.0f, 0.0f, 0.5f };//发射光颜色GLfloat hininess = 50.0f; //反射指数glMaterialfv(GL_FRONT, GL_AMBIENT, ambient);glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuse);glMaterialfv(GL_FRONT, GL_SPECULAR, specular);glMaterialfv(GL_FRONT, GL_EMISSION, emission);glMaterialf(GL_FRONT, GL_SHININESS, shininess);glTranslatef(x,y,z);glScalef(i,j,k);if(d==1){glRotatef(angle,0.0f,0.0f,4.0f);glTranslatef(2.5f,2.5f,0.0f);}glutSolidSphere(2.0, 60.0, 60.0);}glutSwapBuffers();}void ChangeSize(GLsizei W,GLsizei H)//当视口改变时改变裁剪部分保证图形观察时不形变{GLfloat aspectRatio;if(H==0)H=1;glViewport(0,0,W,H);//视口设置glMatrixMode(GL_PROJECTION);//重置坐标系统glLoadIdentity();aspectRatio=(GLfloat)W/(GLfloat)H;if(aspectRatio<=1)//裁剪部分设置glOrtho(-2.5,2.5,-2.5/aspectRatio,2.5/aspectRatio,2.5,-2.5);elseglOrtho(-2.5*aspectRatio,2.5*aspectRatio,-2.5,2.5,2.5,-2.5);glMatrixMode(GL_MODELVIEW);glLoadIdentity();}void ProcessKeys(unsigned char ch,int a,int b){if(ch==119)//w{y+=0.1;glutPostRedisplay();}else if(ch==115)//s{y-=0.1;glutPostRedisplay();}else if(ch==97)//a{x-=0.1;glutPostRedisplay();}else if(ch==100)//d{x+=0.1;glutPostRedisplay();}else if(ch==120)//x{z-=0.1;}else if(ch==122)//z{z+=0.1;glutPostRedisplay();}else if(ch==43)//+{i+=0.1;j+=0.1;k+=0.1;glutPostRedisplay(); }else if(ch==45)//-{i-=0.1;j-=0.1;k-=0.1;}else if(ch==32)//空格键{if(d==0)d=1;else d=0;cout<<d<<endl;}//按空格开关旋转}void IdleFunc(){if(d==1){angle+=1.0f;if(angle==360.0f){angle=0.0f;}cout<<angle<<endl;myDisplay();}}int _tmain(int argc, char* argv[]){glutInit(&argc, (char**) argv);glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA); glutInitWindowPosition(100,100);glutInitWindowSize(500,500);glutCreateWindow("Hello OpenGL");glutDisplayFunc(myDisplay);glutReshapeFunc(ChangeSize);glutIdleFunc(IdleFunc);glutKeyboardFunc(ProcessKeys);glutReshapeFunc(ChangeSize);glutMainLoop();return 0;}二.系统总体布局系统流程图:本系统是常规的openGL系统,初始化后先设置视角、投影、光照、材质等因素,绘制基本的图形,再通过函数判断键盘输入进行重复绘制,完成基本的平移,缩放,旋转等操作三.系统设计思路在系统设计最初,本来想直接使用默认视角后直接设置光照和平移旋转等功能,但是发现在默认视角下对物体,特别是正方体的三维效果无法很好地观察,因此采用侧视视角然后在对材质的定义上,由于立方体设置比较麻烦,最后决定画一个球体,然后在平移旋转缩放等功能的演示上,直接演示过于简单,就是一个函数的执行,因此决定采取利用键盘控制移动和缩放及旋转的方式。

图形学实验报告三维几何变换

图形学实验报告三维几何变换

实验三三维几何变换
班级学号:102055208 姓名:牛慧敏
一、实验目的
(1)掌握三维平移、比例、旋转、对称、和错切5种变换矩阵
(2)掌握三维坐标向屏幕二维坐标变换的公式
二、实验环境
基于windows平台下的计算机一台,Microsoft VC++6.0
三、实验内容
在屏幕中心绘制三维右手坐标系,y轴向右,z轴向上,x轴向前并与z轴逆时针方向的夹角135度,绘制原始立方体,痛过按钮实现平移、比例、旋转、对称、和错切五种变换。

功能说明:
(1)设置原始图形为立方体
(2)实现上、下、左、右、前、后、平移变换
(3)实现放大、缩小比例变换
(4)实现绕x轴,y轴和z轴正向的旋转变换
(5)实现关于xoy平面、yoz
四、实验结果(窗口)。

南邮计算机图形学实验报告一绘制立方体

南邮计算机图形学实验报告一绘制立方体

《计算机图形学程序设计》题目:绘制立方体学生姓名班级学号学生学院学生专业联系电话电子邮件指导教师黄睿指导单位计算机学院日期成绩批阅人日期一、课题名称使用OpenGL3.3以上的版本绘制一个立方体。

二、课题内容和要求内容:初步学习计算机图形学的基础知识,初步学会使用OpenGL,学会编写顶点着色器和片段着色器以及编译和链接,熟悉在三维空间下绘制图形的流程。

要求:使用OpenGL3.3以上的版本绘制图形。

三、课题分析本课题要求绘制一个立方体,本人绘制了一个不同的面呈现红、绿、蓝三色的正方体,绘制的步骤如下。

首先,在主函数开始前,以字符串的形式编写顶点着色器和片段着色器的代码。

其次,在主函数中,设置OpenGL的版本号为3.3,创建一个窗口对象,获取实际像素,并将该窗口对象设置为当前窗口,调用glViewport函数来设置窗口的维度,调用glEnable(GL_DEPTH_TEST)函数开启深度测试。

接着,调用glShaderSource函数获取编写的两个着色器的代码,调用glCompileShader 函数编译两个着色器,并调用glGetShaderiv函数检验是否成功编译,两个着色器编译完毕后调用glAttachShader函数和glLinkProgram函数实现链接,同时也要检验是否连接成功,最后把这两个着色器对象删除。

然后,定义顶点数组和颜色数组(本人将其放在一个数组中),创建并绑定VAO和VBO,调用glBufferData函数,把定义的数组中的数据复制到缓冲的内存中,调用glVertexAttribPointer函数设置顶点属性指针和颜色属性指针。

最后,在while循环中,设置模型矩阵Model、观察矩阵View和投影矩阵Projection,调用glDrawArrays函数画12个三角形。

四、详细设计1、流程图图1 OpenGL绘制立方体流程图2、详细代码#include <iostream>#define GLEW_STATIC#include <GL/glew.h>#include <GLFW/glfw3.h>#include <glm/glm.hpp>#include <glm/gtc/matrix_transform.hpp>#include <glm/gtc/type_ptr.hpp>#define STB_IMAGE_IMPLEMENTATION#include "stb_image.h"using namespace glm;void framebuffer_size_callback(GLFWwindow* window, int width, int height){// make sure the viewport matches the new window dimensions; note that width and // height will be significantly larger than specified on retina displays.glViewport(0, 0, width, height);}void processInput(GLFWwindow *window){if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) glfwSetWindowShouldClose(window, true);}const GLint WIDTH = 800, HEIGHT = 600;//顶点着色器代码const GLchar *vertexShaderSource ="#version 330 core\n""layout (location = 0) in vec3 position;\n""layout (location = 1) in vec3 color;\n""out vec3 Color;\n""uniform mat4 MVP;\n""void main(){""gl_Position = MVP * vec4(position, 1.0f);\n""Color = color;""}";//片段着色器代码const GLchar *fragmentShaderSource ="#version 330 core\n""out vec4 FragmentColor;\n""in vec3 Color;\n"//"uniform sampler2D texture1;\n""void main(){""FragmentColor = vec4(Color,1.0f);\n""}";int main(){glfwInit();//设置版本glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);//glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);//创建一个窗口对象GLFWwindow *window = glfwCreateWindow(WIDTH, HEIGHT, "openglTest1", nullptr, nullptr);if (window == nullptr){std::cout << "Failed to create GLFW window" << std::endl;glfwTerminate();return -1;}//获取实际像素int screenWidth, screenHeight;glfwGetFramebufferSize(window, &screenWidth, &screenHeight);// 设为当前glfwMakeContextCurrent(window);glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);// Initialize GLEWglewExperimental = GL_TRUE;if (glewInit() != GLEW_OK){std::cout << "Failed to initialize GLEW" << std::endl;return -1;}//调用glViewport函数来设置窗口的维度glViewport(0, 0, screenWidth, screenHeight);//开启深度测试glEnable(GL_DEPTH_TEST);//编译连接两个着色器GLint success;GLchar infoLog[512];GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);glShaderSource(vertexShader, 1, &vertexShaderSource, nullptr);glCompileShader(vertexShader);glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);if (!success){glGetShaderInfoLog(vertexShader, 512, nullptr, infoLog);std::cerr << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl;}GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);glShaderSource(fragmentShader, 1, &fragmentShaderSource, nullptr);glCompileShader(fragmentShader);glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);if (!success){glGetShaderInfoLog(fragmentShader, 512, nullptr, infoLog);std::cerr << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl;}GLuint shaderProgram = glCreateProgram();glAttachShader(shaderProgram, vertexShader);glAttachShader(shaderProgram, fragmentShader);glLinkProgram(shaderProgram);glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);if (!success){glGetProgramInfoLog(fragmentShader, 512, nullptr, infoLog);std::cerr << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << std::endl;}glDetachShader(shaderProgram, vertexShader);glDetachShader(shaderProgram, fragmentShader);glDeleteShader(vertexShader);glDeleteShader(fragmentShader);// 定义一个数组存储顶点信息和颜色信息float vertices[] = {-0.5f, -0.5f, -0.5f, 0.0f, 1.0f,0.0f,0.5f, -0.5f, -0.5f, 0.0f, 1.0f,0.0f,0.5f, 0.5f, -0.5f, 0.0f, 1.0f,0.0f,0.5f, 0.5f, -0.5f, 0.0f, 1.0f,0.0f,-0.5f, 0.5f, -0.5f, 0.0f, 1.0f,0.0f,-0.5f, -0.5f, -0.5f, 0.0f, 1.0f,0.0f,-0.5f, -0.5f, 0.5f, 0.0f, 1.0f,0.0f,0.5f, -0.5f, 0.5f, 0.0f, 1.0f,0.0f,0.5f, 0.5f, 0.5f, 0.0f, 1.0f,0.0f,0.5f, 0.5f, 0.5f, 0.0f, 1.0f,0.0f,-0.5f, 0.5f, 0.5f, 0.0f, 1.0f,0.0f,-0.5f, -0.5f, 0.5f, 0.0f, 1.0f,0.0f,-0.5f, 0.5f, 0.5f, 1.0f, 0.0f,0.0f,-0.5f, 0.5f, -0.5f, 1.0f, 0.0f,0.0f,-0.5f, -0.5f, -0.5f, 1.0f, 0.0f,0.0f,-0.5f, -0.5f, -0.5f, 1.0f, 0.0f,0.0f,-0.5f, -0.5f, 0.5f, 1.0f, 0.0f,0.0f,-0.5f, 0.5f, 0.5f, 1.0f, 0.0f,0.0f,0.5f, 0.5f, 0.5f, 1.0f, 0.0f,0.0f,0.5f, 0.5f, -0.5f, 1.0f, 0.0f,0.0f,0.5f, -0.5f, -0.5f, 1.0f, 0.0f,0.0f,0.5f, -0.5f, -0.5f, 1.0f, 0.0f,0.0f,0.5f, -0.5f, 0.5f, 1.0f, 0.0f,0.0f,0.5f, 0.5f, 0.5f, 1.0f, 0.0f,0.0f,-0.5f, -0.5f, -0.5f, 0.0f, 0.0f,1.0f,0.5f, -0.5f, -0.5f, 0.0f, 0.0f,1.0f,0.5f, -0.5f, 0.5f, 0.0f, 0.0f,1.0f,0.5f, -0.5f, 0.5f, 0.0f, 0.0f,1.0f,-0.5f, -0.5f, 0.5f, 0.0f, 0.0f,1.0f,-0.5f, -0.5f, -0.5f, 0.0f, 0.0f,1.0f,-0.5f, 0.5f, -0.5f, 0.0f, 0.0f,1.0f,0.5f, 0.5f, -0.5f, 0.0f, 0.0f,1.0f,0.5f, 0.5f, 0.5f, 0.0f, 0.0f,1.0f,0.5f, 0.5f, 0.5f, 0.0f, 0.0f,1.0f,-0.5f, 0.5f, 0.5f, 0.0f, 0.0f,1.0f,-0.5f, 0.5f, -0.5f, 0.0f, 0.0f,1.0f, };//画Vertex需要VAO(索引表)//创建顶点缓冲对象VBOGLuint VAO, VBO;glGenBuffers(1, &VBO);//绑定VAOglBindVertexArray(VAO);//使用glBindBuffer函数把新创建的缓冲绑定到GL_ARRAY_BUFFER目标上glBindBuffer(GL_ARRAY_BUFFER, VBO);//调用glBufferData函数,它会把之前定义的顶点数据复制到缓冲的内存中glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);//设置顶点属性指针glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), nullptr);glEnableVertexAttribArray(0);////设置颜色属性指针glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (void*)(3 * sizeof(float)));glEnableVertexAttribArray(1);while (glfwGetKey(window, GLFW_KEY_ESCAPE) != GLFW_PRESS && !glfwWindowShouldClose(window)){processInput(window);glClearColor(0.2f, 0.2f, 0.2f, 1.0f);glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glUseProgram(shaderProgram);glm::mat4 View = glm::lookAt(glm::vec3(2, 2, 2),glm::vec3(0, 0, 0),glm::vec3(0, 1, 0));glm::mat4 Projection = glm::perspective(glm::radians(45.0f), (float)screenWidth /(float)screenHeight,0.1f, 100.0f);glm::mat4 Model = glm::mat4(1.0);glm::mat4 MVP = Projection * View * Model;GLint MVPID = glGetUniformLocation(shaderProgram, "MVP");glUniformMatrix4fv(MVPID, 1, GL_FALSE, glm::value_ptr(MVP));glBindVertexArray(VAO);glDrawArrays(GL_TRIANGLES, 0, 12 * 3);glfwSwapBuffers(window);glfwPollEvents();}glDisableVertexAttribArray(0);glDeleteVertexArrays(1, &VAO);glDeleteBuffers(1, &VBO);glDeleteProgram(shaderProgram);glfwTerminate();return 0;}五、测试数据及其结果分析运行结果如下图所示。

《计算机图形学》实验报告

《计算机图形学》实验报告

实验报告模板《计算机图形学》实验报告一、实验目的及要求1.实习三维图形的坐标系之间的变换;2.三维图形几何变换;3.掌握三维图形的坐标系之间的变换算法及三维图形几何变换的原理和实现;4.实现二维图形的基本变换(平移、旋转、缩放、错切、对称、复合等);5.实现三维图形的基本变换(平移、旋转、缩放、复合等);二、理论基础在齐次坐标理论下,二维图形几何变换矩阵可用下式表示:⎪⎪⎪⎭⎫⎝⎛===ifchebgdaTnkxx kk2,1,0,)(ϕ平移变换:[x* y* 1] =[x y 1] *0000001ts⎛⎫⎪⎪⎪⎝⎭=[t*x s*y 1]比例变换:[x* y* 1]=[x y 1] *1000101m n⎛⎫⎪⎪⎪⎝⎭=[m+x n+y 1]旋转变换:在平面上的二维图形饶原点逆时针旋转Ө角,变换矩阵为[x* y* 1]=[x y 1] *cos sin0sin cos0001θθθθ⎛⎫⎪- ⎪⎪⎝⎭= [x*cosө-y*sinө]复合变换:以上各种变换矩阵都是以原点为参照点,当以任意参照点进行变换的时候,我们就要用到复合变换矩阵。

三维变换类似于二维,在画图时,把三维坐标转换为二维即可。

三、算法设计与分析二维变换:#define dx 50#define dy 100void CCGWithVCView::OnTransScale() //平移(50,100){// TODO: Add your command handler code here// AfxMessageBox(_T("Please Insert The Move Change Code!")) ;int m[4][2]={{100,50},{50,100},{150,100},{100,50}};int i;int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<3;i++){a[0]=m[i][0];a[1]=m[i][1];b[0]=m[i+1][0];b[1]=m[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for(i=0;i<3;i++){a[0]=m[i][0]+dx;a[1]=m[i][1]+dy;b[0]=m[i+1][0]+dx;b[1]=m[i+1][1]+dy;DDALine(a,b, RGB(0, 200, 255), pDC);}}#define h 0.1745#include<math.h>void CCGWithVCView::OnTransRotate() //旋转{// TODO: Add your command handler code here// AfxMessageBox(_T("Please Insert The Rotate Change Code!")) ;int m[4][2]={{100,50},{50,100},{150,100},{100,50}};int i;int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<3;i++){a[0]=m[i][0];a[1]=m[i][1];b[0]=m[i+1][0];b[1]=m[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for(i=0;i<3;i++){a[0]=m[i][0]*cos(h)-m[i][1]*sin(h);a[1]=m[i][1]*cos(h)+m[i][0]*sin(h);b[0]=m[i+1][0]*cos(h)-m[i+1][1]*sin(h);b[1]=m[i+1][1]*cos(h)+m[i+1][0]*sin(h);DDALine(a,b, RGB(0, 200, 255), pDC);}}#define k 2;#define f 2.5void CCGWithVCView::OnTransMove() //缩放{// TODO: Add your command handler code here//AfxMessageBox(_T("Please Insert The Scale Change Code!")) ;int m[4][2]={{100,50},{50,100},{150,100},{100,50}};int i;int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<3;i++){a[0]=m[i][0];a[1]=m[i][1];b[0]=m[i+1][0];b[1]=m[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for(i=0;i<3;i++){a[0]=m[i][0]*k;a[1]=m[i][1]*f;b[0]=m[i+1][0]*k;b[1]=m[i+1][1]*f;DDALine(a,b, RGB(0, 200, 255), pDC);}}#define n 2#define d 0void CCGWithVCView::OnTransOther(){// TODO: Add your command handler code here//AfxMessageBox(_T("Please Insert The Other Change Code!")) ;int m[4][2]={{100,50},{50,100},{150,100},{100,50}};int i;int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<3;i++){a[0]=m[i][0];a[1]=m[i][1];b[0]=m[i+1][0];b[1]=m[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for(i=0;i<3;i++){a[0]=m[i][0]+n*m[i][1];a[1]=m[i][1]+d*m[i][0];b[0]=m[i+1][0]+n*m[i+1][1];b[1]=m[i+1][1]+d*m[i+1][0];DDALine(a,b, RGB(0, 200, 255), pDC);}}三维变换:#include<math.h>#define dx 100#define dy 100#define dz 0void CCGWithVCView::OnTransScale() //平移(50,100){// TODO: Add your command handler code here// AfxMessageBox(_T("Please Insert The Move Change Code!")) ;int i;int p2d[6][2];int p3d[6][3]={{400,300,0},{300,400,0},{300,300,10},{275,300,0},{400,300,0},{300,300,10}};for( i=0;i<6;i++){p2d[i][0]=p3d[i][1]-p3d[i][0]/sqrt(2);p2d[i][1]=p3d[i][2]+p3d[i][0]/sqrt(2);}int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<5;i++){a[0]=p2d[i][0];a[1]=p2d[i][1];b[0]=p2d[i+1][0];b[1]=p2d[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for( i=0;i<6;i++){p2d[i][0]=p3d[i][1]+dy-p3d[i][0]+dx/sqrt(2);p2d[i][1]=p3d[i][2]+dz+p3d[i][0]+dx/sqrt(2);}for(i=0;i<5;i++){a[0]=p2d[i][0];a[1]=p2d[i][1];b[0]=p2d[i+1][0];b[1]=p2d[i+1][1];DDALine(a,b, RGB(0, 0, 255), pDC);}}#define k 0.1745void CCGWithVCView::OnTransRotate() //旋转{// TODO: Add your command handler code here// AfxMessageBox(_T("Please Insert The Rotate Change Code!")) ;int i;int p2d[6][2];int p3d[6][3]={{400,300,0},{300,400,0},{300,300,10},{275,300,0},{400,300,0},{300,300,10}};for( i=0;i<6;i++){p2d[i][0]=p3d[i][1]-p3d[i][0]/sqrt(2);p2d[i][1]=p3d[i][2]+p3d[i][0]/sqrt(2);}int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<5;i++){a[0]=p2d[i][0];a[1]=p2d[i][1];b[0]=p2d[i+1][0];b[1]=p2d[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for( i=0;i<6;i++){p2d[i][0]=p3d[i][1]*cos(k)-p3d[i][2]*sin(k)-p3d[i][0]/sqrt(2);p2d[i][1]=p3d[i][2]*cos(k)+p3d[i][1]*sin(k)+p3d[i][0]/sqrt(2);}for(i=0;i<5;i++){a[0]=p2d[i][0];a[1]=p2d[i][1];b[0]=p2d[i+1][0];b[1]=p2d[i+1][1];DDALine(a,b, RGB(0, 0, 255), pDC);}}四、程序调试及结果的分析二维:三维:五、实验心得及建议在实验过程中,尽管过程中任由许多不会的地方,而且有待于今后的提高和改进,但我加深了对书本上知识的理解与掌握,同时也学到了很多书本上没有东西,并积累了一些宝贵的经验,这对我以后的学习与工作是不无裨益的。

三维设计实习报告(3篇)

三维设计实习报告(3篇)

三维设计实习报告(3篇)三维设计实习报告(通用3篇)三维设计实习报告篇1一、实习目的:由于计算机技术的高速发展,三维建模与三维动画制作在广告设计与制作等领域的作用的影响越来越大。

《三维动画制作》课程是网络技术专业的一门扩展能力的课程。

该课程的实习,应该强调动手能力和实战能力。

因此,本次实习将从实战入手,让学生深入掌握三维动画制作软件3D MA_的三维建模、设置材质与贴图、设置灯光与摄像机以及三维动画设计等方法与技术。

二、实习内容:1、三维建模部分(1)室内效果设计(2)甜美三维生日蛋糕3DsMA_制作的生日蛋糕场景中,蛋糕盘上放置着甜美的蛋糕,蛋糕体上插放着摇曳的烛光和可爱的小樱桃。

2、三维动画设计(1)转动的地球仪美丽的地球在支撑杆的怀抱中匀速的转动。

(2)影视片头字幕浮出海面的金属立体字特效。

三、实习过程:1、室内效果设计从房间的顶部开始建造,即建造天花板―― 主墙体的创建―― 门窗的设置―― 地面的制作―― 各种边角的修饰―― 室内物品的建造―― 室内布局。

2、制作地球仪先创建地球仪模型,即创建地球――圆环造型――地球仪的旋转轴和底座――支座――设置材质;最后制作动画。

3、制作生日蛋糕创建蛋糕模型――制作蛋糕的材质――创建蜡烛。

4、制作影视片头字幕场景为白云朵朵的蓝天和波浪涌动的海面,海面使用了光线跟踪贴图材质,具备镜面反射功能;波浪用波浪命令制作,通过修改相位值实现涌动的效果。

四、实习总结:通过本次实习,我发现自己的动手操作能力有很大的提高。

我明白我们这些技术性很强的专业更应该把理论用到实践这来,才能使自己学到真实的技术,才能使理论于实践更趋于完美化。

正是这次实习,我发现自己还有很多缺陷,例如:对于灯光的设置和地球的旋转,没有做出良好的效果。

当然,我每做出一部自己满意的作品,心里的自豪不言而喻。

我最终明白了,学习是一个相互交流的过程。

五、对实习的建议:为了实习的顺利进行,老师们的功劳不言而喻,同学之间的关怀铭记于心。

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

图形学课程设计题目:三维真实感图形设计与绘制专业:计算机科学与技术学号姓名:一.一)课程设计目的与要求图形学课程设计的主要目的是让同学们通过图形学的实际问题应用,进一步增强计算机图形学理论的理解、算法应用、图形数据结构设计与图形程序设计等,从而提高图形学实际应用与软件开发能力。

二)课程设计题目三维真实感图形设计与绘制三)问题的提出与需求分析(1)题目内容说明:本题目要求应用OpenGL的光照技术和纹理技术实现一个简单的三维真实感图形的程序设计。

具体要求实现功能:1)通过对话方式实现交互式设计光照模型功能。

2)实现三维模型纹理映射功能。

3)用鼠标跟踪球方法实现三维模型的空间旋转。

(2)技术要点说明1)三维模型显示场景树:将三维可视化模型场景内容分解用一种树或表数据结构描述。

2)实现一个读Targa文件的程序:Targa是一种常见的图像格式文件,该文件通常以未压缩的格式存储图像。

3)实现鼠标跟踪球方法程序。

二.设计思路要设计一个良好的场景和优秀的交互方式,现在虚拟现实场景十分繁多,各种交互方式也五花八门,我们要选择特定的场景,场景要保证两点:一是其新鲜性,让人耳目一新,否则会让人有过于老套的感觉;另外就是其真实度,这是本次课题的着重关注点;在选取选定的场景后,我们要定义各交互方式,在从现有可得到的交互方式案例中提取和创新,以保证开发出来的交互方式可以最大程度的提高人机交互的效率。

场景的规模是必须考虑的,因为设计的时间和人员有限,必须限制场景规模,没有时间和人力去开发过大的场景规模,但是如果场景规模过小,演示系统就无法给人带来非常强烈的真实感冲击,而且过小规模的场景也会限制交互方式的设计和开发;所以定义适当的场景规模,对于课题的成败十分重要。

通过对计算机图形学和三维人机交互方式等相关书籍和文献的阅读和学习,了解和掌握建立真实图形显示系统的过程和三维虚拟场景中人机交互的方式。

三维图形及动画场景的显示,就是把所建立的三维空间模型,经过计算机的复杂处理,最终在计算机二维屏幕上显示的过程,并且在显示的过程要保证其真实感。

一般,设计三维图形软件要经过以下步骤:(1)图元建立三维模型。

(2)设置观看物体的窗口和观看点(视点)。

(3)设定各物体的属性(如色彩、光照、纹理映射等)(4)如果要物体动起来,还要进行图形变换(如几何变换、视窗变换和投影变换等)。

(5)三维图形的二维化。

流程如下:(1) 建立三维模型建立三维模型,就是在三维坐标系中画三维场景。

利用画点(Point)、画线(Line)、画多边形(Polygon)等函数可以建立复杂的空间模型。

在表示三维空间时,一般用齐次坐标(Homogeneous Coordinate)。

在实际应用时一般把一系列顶点(Vertex )组织起来以构成物体或图元。

(2) 置窗口和视口图形显示的区域称为显示窗口。

流程顺序为:定义一个窗口一般由以下步骤完成:设置窗口模式,设置窗口位置、大小,初始化窗口,窗口颜色设置清理窗口是指把窗口清成某种颜色。

要观看场景,也需要一个窗口,即视口。

通俗地讲,视口变大,场景被放大;视口变小,场景被缩小。

(3) 设置光照要使物体具有真实感,就要对物体进行光照处理。

在计算机图形学中,物体的真实感应考虑两种因素:光源和物体材质。

三.主要程序设计的说明//main函数(其中部分函数代码省略)#include <gl/glut.h>#include <stdio.h>#include <math.h>#include "gtools.h"#include "Texture.h"#define MAXTEXTURE 1 //定义纹理贴图数GLuint texture[MAXTEXTURE]; //纹理数组,保存纹理名字(name)// 鼠标位置int OldX = -1;int OldY = -1;// 是否进行鼠标追踪球bool gIsStartTrackBall = false;// 旋转矩阵double mMatrix[16];// 向量的点积double dotMult(GPoint3d v1, GPoint3d v2){……}// 向量的叉积GPoint3d crossMult(GPoint3d v1, GPoint3d v2) {……}// 将鼠标二维点映射为球面向量(用于鼠标追踪球)GPoint3d gMousePtToSphereV ec(int x, int y, int w, int h) {……}//绘制网格线void drawPlane()glColor3f(1.0f, 1.0f, 1.0f);for(float u=-1.0; u<=1.0; u+=0.2f){glBegin(GL_LINES);glV ertex3f(-1, 0, u);glV ertex3f(1, 0, u);glV ertex3f(u, 0, -1);glV ertex3f(u, 0, 1);glEnd();}}//绘制正方体void DrawTextureCube(double xPos,double yPos,double zPos) {glPushMatrix();glTranslatef(xPos,yPos,zPos);//顶面glBegin(GL_QUADS);glTexCoord2f(0.0,0.0);glV ertex3f(-0.3,0.3,0.3);glTexCoord2f(1.0,0.0);glV ertex3f(0.3,0.3,0.3);glTexCoord2f(1.0,1.0);glV ertex3f(0.3,0.3,-0.3);glTexCoord2f(0.0,1.0);glV ertex3f(-0.3,0.3,-0.3);glEnd();//正面:glBegin(GL_QUADS);glTexCoord2f(0.0,0.0);glV ertex3f(0.3,-0.3,0.3);glTexCoord2f(1.0,0.0);glV ertex3f(0.3,0.3,0.3);glTexCoord2f(1.0,1.0);glV ertex3f(-0.3,0.3,0.3);glTexCoord2f(0.0,1.0);glV ertex3f(-0.3,-0.3,0.3);glEnd()//右面:glBegin(GL_QUADS);glTexCoord2f(0.0,0.0);glV ertex3f(0.3,0.3,-0.3);glTexCoord2f(1.0,0.0);glV ertex3f(0.3,0.3,0.3);glTexCoord2f(1.0,1.0);glV ertex3f(0.3,-0.3,0.3);glTexCoord2f(0.0,1.0);glV ertex3f(0.3,-0.3,-0.3);glEnd();//左面glBegin(GL_QUADS);glTexCoord2f(0.0,0.0);glV ertex3f(-0.3,-0.3,0.3);glTexCoord2f(1.0,0.0);glV ertex3f(-0.3,0.3,0.3);glTexCoord2f(1.0,1.0);glV ertex3f(-0.3,0.3,-0.3);glTexCoord2f(0.0,1.0);glV ertex3f(-0.3,-0.3,-0.3);glEnd();//底面:glBegin(GL_QUADS);glTexCoord2f(0.0,0.0);glV ertex3f(0.3,-0.3,0.3);glTexCoord2f(1.0,0.0);glV ertex3f(-0.3,-0.3,0.3);glTexCoord2f(1.0,1.0);glV ertex3f(-0.3,-0.3,-0.3);glTexCoord2f(0.0,1.0);glV ertex3f(0.3,-0.3,-0.3);glEnd();//后面:glBegin(GL_QUADS);glTexCoord2f(0.0,0.0);glV ertex3f(0.3,0.3,-0.3);glTexCoord2f(1.0,0.0);glV ertex3f(0.3,-0.3,-0.3);glTexCoord2f(1.0,1.0);glV ertex3f(-0.3,-0.3,-0.3);glTexCoord2f(0.0,1.0);glV ertex3f(-0.3,0.3,-0.3);glEnd();glPopMatrix();}// 绘制事件函数void displayEvent(){glClearColor(0, 0, 0, 0); //设置背景颜色glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glMatrixMode(GL_MODELVIEW); //设置当前矩阵为模型视图矩阵glLoadIdentity(); //载入单位矩阵glTranslatef(0, 0, -3.50f);glMultMatrixd(mMatrix);drawPlane();glLineWidth(2); //线宽glDisable(GL_BLEND);// 关闭透明处理glEnable(GL_DEPTH_TEST); // 启用深度测试glBlendFunc(GL_SRC_COLOR,GL_DST_COLOR); // 指定计算源混合因子和目标混合因子glPushMatrix();glTranslatef(-0.3, 0.3, -0.3);DrawTextureCube(0.0,0.0,0.0); // 绘制正方体glPopMatrix();glPushMatrix();glTranslatef(0.3, 0.2, -0.3);glColor3f(0.98,0.625,0.12);glutSolidSphere(0.2f, 16, 16); // 绘制球体glPopMatrix();glPushMatrix();glTranslatef(-0.1, 0.0, 0.3);glRotatef(-90, 1, 0, 0);glColor3f(0.0,0.9,0.0);glutWireCone(0.2f, 0.8f, 16, 16); // 绘制圆锥体glPopMatrix();glFlush();glutSwapBuffers(); // 交换缓存}//对opengl进行设置void InitGL(GLvoid){glClearColor(0.0,0.0,0.0,0.0);glShadeModel(GL_SMOOTH);glEnable(GL_DEPTH_TEST);glEnable(GL_CULL_FACE);glFrontFace(GL_CCW);//启用2D纹理映射:glEnable(GL_TEXTURE_2D);glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // 最精细的透视计算BuildTexture("B_mar003b_49.jpg", texture[0]); //生成纹理,并保存在texture[0]中。

相关文档
最新文档