计算机图形学_实验3_三维图形绘制
基于OpenGL的三维图形绘制实验
![基于OpenGL的三维图形绘制实验](https://img.taocdn.com/s3/m/41ca29c081eb6294dd88d0d233d4b14e85243eba.png)
基于OpenGL的三维图形绘制实验基于OpenGL的三维图形绘制实验⽬录实验题⽬:交互图形程序设计基础实验 (3)1.实验⽬的 (3)2.实验内容 (3)2.1 实验内容 (3)2.2 实验任务 (3)3.实验过程 (4)3.1 预处理 (4)3.3 主要函数说明 (5)3.4 过程描述 (6)3.5 运⾏截图 (7)4.实验结果 (7)5.实验体会 (7)实验题⽬:交互图形程序设计基础实验1.实验⽬的1)理解并掌握三维基本图形数据结构表⽰⽅法。
2)掌握编写OpenGL图形程序的基本⽅法.3)掌握OpenGL基本图形表⽰及绘制。
2.实验内容2.1 实验内容基于OpenGL的三维图形绘制实验⽬的是掌握图形信息的表⽰、数据的组织,在此基础上基于OpenGL绘制出三维图形。
实验内容包括OpenGL编程环境搭建、OpenGL程序结构、基本数据类型、核⼼函数等的使⽤;基本图形的绘制(点、线段、折线、闭合折线、多边形、三⾓形、三⾓扇、三⾓条带、四边形、四边形条带等)及图形属性控制(线宽、颜⾊、线型、填充样式等);对指定的若⼲三维模型进⾏建模、绘制,在⼀个程序框架下实现,提交1次程序,1份实验报告。
2.2 实验任务1、使⽤Visual C++建⽴⼀个单⽂档(SDI)程序,完成OpenGL绘制框架程序的设计。
在此基础上参照提供的资料,定义绘制函数,基于⾃定义的若⼲点坐标与颜⾊,分别绘制绘制点、线段、不闭合折线、闭合折线、多边形、三⾓形、四边形、三⾓扇、三⾓条带、四边形条带。
2、使⽤1中建⽴的程序框架,完成如下任务:(1)绘制正棱柱(底⾯多变形的边数及⾼度可以通过对话框输⼊)(2)正棱锥(底⾯多变形的边数及⾼度可以通过对话框输⼊)(3)正棱台(底⾯多变形的边数、台⾼、锥⾼可以通过对话框输⼊)注意模型坐标系的选择和顶点坐标的计算,每个图形的绘制单独写成函数。
加⼊菜单绘制三、四、五、六边的情况,其他边数情况从弹出对话框中输⼊参数,然后绘制。
计算机图形学实验03
![计算机图形学实验03](https://img.taocdn.com/s3/m/e6f6a49f1eb91a37f0115ca2.png)
计算机图形学实验03
《计算机图形学》实验报告
圆(椭圆)的生成算法
一、实验教学目标与基本要求
1.实现圆的生成算法;
2.实现椭圆的生成算法;
二、实验课程内容 (2学时)
1.写出完整的圆的Bresenham生成算法;
2.写出完整的椭圆的中点生成算法;
三、算法思想
1.圆的Bresenham生成算法:
如果我们构造函数 F(_,y)=_+y-R,则对于圆上的点有F(_,y)=0,对于圆外的点有F(_,y)_gt;0,对于圆内的点F(_,y)_lt;0 。
与中点画线法一样,构造判别式:d=F(M)=F(_p+1,yp-0.5)=(_p+1)+(yp-0.5)-R。
若d_lt;0,则应取P1为下一象素,而且再下一象素的判别式为:
222d=F(_p+2,yp-0.5)=(_p+2)+(yp-0.5)-R=d+2_p+3
若d≥0,则应取P2为下一象素,而且下一象素的判别式为:
d=F(_p+2,yp-1.5)=(_p+2)+(yp-
1.5)-R=d+2(_p-yp)+5我们这里讨论的第一个象素是(0,R),判别式d的初始值为:d0=F(1,R-0.5)=1.25-R。
为了进一步提高算法的效率,将上面的算法中的浮点数改写成整数,将乘法运算改成加法运算,即仅用整数实现中点画圆法。
2.椭圆的中点生成算法:
椭圆中点生成算法是将椭圆在第一象限中分为两个部分:
1)对于斜率绝对值小于1的区域内在_方向取单位量;
2)对于斜率绝对值大于1的区域内在y方向取单位量;
斜率可以通过椭圆的标准方程中获得为K = - (ry_ry)__/(r__r_)_y;这里中点椭圆222222222。
计算机图形学-3D图形绘制代码和截图
![计算机图形学-3D图形绘制代码和截图](https://img.taocdn.com/s3/m/0d5d74e928ea81c759f57813.png)
实验报告内容:
一、实验设备:
OpenGL 实用工具库文件 glut32.dll,glut.h,glut32.lib
安装 GLUT 库
Copy glut.h
=>VC/include/gl/
glut32.lib =>VC/lib/
glut32.dll =>windows/system32/
二、实验目的、要求: 1.理解 OpenGL 三维观察流水线 2.理解 3D 模式数据结构及绘制方法
②截图:
glMatrixMode(GL_PROJECTION); glLoadIdentity(); // gluPerspective(45.0, float(w) / h, 0.1, 100.0); glFrustum(-1.0,1.0,-1.0,1.0,1.5,20.0); glMatrixMode(GL_MODELVIEW); } void display(void) { glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0,1.0,1.0); glLoadIdentity();//设置当前矩阵为单位矩阵 gluLookAt(5.0,4.0,9.0,0.0,0.0,0.0,0.0,1.0,0.0); glScalef(2.0,1.0,1.0);//x 方向放大 2 倍 glutWireCube(1); glFlush(); } void main(int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); glutInitWindowSize(500,500); glutInitWindowPosition(100,100); glutCreateWindow("3D Cube"); init(); glutReshapeFunc(myReshape); glutDisplayFunc(display); glutMainLoop(); }
图形学实验报告三维图形
![图形学实验报告三维图形](https://img.taocdn.com/s3/m/4e09910b6c85ec3a87c2c53b.png)
图形学课程设计题目:三维真实感图形设计与绘制专业:计算机科学与技术学号姓名:一.一)课程设计目的与要求图形学课程设计的主要目的是让同学们通过图形学的实际问题应用,进一步增强计算机图形学理论的理解、算法应用、图形数据结构设计与图形程序设计等,从而提高图形学实际应用与软件开发能力。
二)课程设计题目三维真实感图形设计与绘制三)问题的提出与需求分析(1)题目内容说明:本题目要求应用OpenGL的光照技术和纹理技术实现一个简单的三维真实感图形的程序设计。
具体要求实现功能:1)通过对话方式实现交互式设计光照模型功能。
2)实现三维模型纹理映射功能。
3)用鼠标跟踪球方法实现三维模型的空间旋转。
(2)技术要点说明1)三维模型显示场景树:将三维可视化模型场景内容分解用一种树或表数据结构描述。
2)实现一个读Targa文件的程序:Targa是一种常见的图像格式文件,该文件通常以未压缩的格式存储图像。
3)实现鼠标跟踪球方法程序。
二.设计思路要设计一个良好的场景和优秀的交互方式,现在虚拟现实场景十分繁多,各种交互方式也五花八门,我们要选择特定的场景,场景要保证两点:一是其新鲜性,让人耳目一新,否则会让人有过于老套的感觉;另外就是其真实度,这是本次课题的着重关注点;在选取选定的场景后,我们要定义各交互方式,在从现有可得到的交互方式案例中提取和创新,以保证开发出来的交互方式可以最大程度的提高人机交互的效率。
场景的规模是必须考虑的,因为设计的时间和人员有限,必须限制场景规模,没有时间和人力去开发过大的场景规模,但是如果场景规模过小,演示系统就无法给人带来非常强烈的真实感冲击,而且过小规模的场景也会限制交互方式的设计和开发;所以定义适当的场景规模,对于课题的成败十分重要。
通过对计算机图形学和三维人机交互方式等相关书籍和文献的阅读和学习,了解和掌握建立真实图形显示系统的过程和三维虚拟场景中人机交互的方式。
三维图形及动画场景的显示,就是把所建立的三维空间模型,经过计算机的复杂处理,最终在计算机二维屏幕上显示的过程,并且在显示的过程要保证其真实感。
计算机图形学实验报告
![计算机图形学实验报告](https://img.taocdn.com/s3/m/8161e308e418964bcf84b9d528ea81c758f52e98.png)
计算机图形学实验报告
在计算机图形学课程中,实验是不可或缺的一部分。
通过实验,我们可以更好地理解课程中所学的知识,并且在实践中掌握这些
知识。
在本次实验中,我学习了如何使用OpenGL绘制三维图形,并了解了一些基本的图形变换和视图变换。
首先,我们需要通过OpenGL的基本命令来绘制基本图形,例
如线段、矩形、圆等。
这些基本的绘制命令需要首先设置OpenGL 的状态,例如绘制颜色、线段宽度等,才能正确地绘制出所需的
图形。
然后,在实验中我们学习了图形的变换。
变换是指通过一定的
规则将图形的形状、位置、大小等进行改变。
我们可以通过平移、旋转、缩放等变换来改变图形。
变换需要按照一定的顺序进行,
例如先进行旋转再进行平移等。
在OpenGL中,我们可以通过设
置变换矩阵来完成图形的变换。
变换矩阵包含了平移、旋转、缩
放等信息,通过矩阵乘法可以完成图形的复合变换。
最后,视图变换是指将三维场景中的图形投影到二维平面上,
成为我们所见到的图形。
在实验中,我们学习了透视投影和正交
投影两种方式。
透视投影是指将场景中的图形按照视点不同而产
生不同的远近缩放,使得图形呈现出三维感。
而正交投影则是简单地将场景中的图形按照平行投影的方式呈现在屏幕上。
在OpenGL中,我们可以通过设置视图矩阵和投影矩阵来完成视图变换。
通过本次实验,我对于计算机图形学有了更深入的了解,并掌握了一些基本的图形绘制和变换知识。
在今后的学习中,我将继续学习更高级的图形绘制技术,并应用于实际的项目中。
计算机图形学与三维建模实验报告
![计算机图形学与三维建模实验报告](https://img.taocdn.com/s3/m/0e634c31e45c3b3567ec8b8d.png)
计算机图形学与三维建模实验报告计算机图形学实验报告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系统,初始化后先设置视角、投影、光照、材质等因素,绘制基本的图形,再通过函数判断键盘输入进行重复绘制,完成基本的平移,缩放,旋转等操作三.系统设计思路在系统设计最初,本来想直接使用默认视角后直接设置光照和平移旋转等功能,但是发现在默认视角下对物体,特别是正方体的三维效果无法很好地观察,因此采用侧视视角然后在对材质的定义上,由于立方体设置比较麻烦,最后决定画一个球体,然后在平移旋转缩放等功能的演示上,直接演示过于简单,就是一个函数的执行,因此决定采取利用键盘控制移动和缩放及旋转的方式。
数学实验三维绘图课件
![数学实验三维绘图课件](https://img.taocdn.com/s3/m/d83fdfdb1a37f111f1855bb3.png)
(1,2,1)
(3,4,1)
(3,3,1)
(2,3,1)
(2,2,1)
(2,1,1)
(1,1,1)
(3,2,1)
3 2.5
2
2
1.5
11
(3,1,1) 3
北京科技大学数学实验
例: x=1:.1:3; y=1:.1:4;
[X,Y]=meshgrid(x,y); Z=ones(size(X)); mesh(X,Y,Z)
三、matlab三维曲面绘图
meshgrid——生成网格矩阵
调用格式: [X,Y]=meshgrid(x,y)--------生成小矩形顶点的坐
标值矩阵
[X,Y]=meshgrid(x) 等价于[X,Y]=meshgrid(x,x)
北京科技大学数学实验
例:x=[1,2,3];y=[1,2,3,4]; [X,Y]=meshgrid(x,y)
matlab 三维绘图
北京科技大学数学实验
三维曲线绘图 三维曲面绘图
北京科技大学数学实验
二、matlab三维曲线绘图
plot3——三维曲线绘制指令
plot3的调用格式: plot3(X,Y,Z) plot3(X,Y,Z,’String’) plot3(X1,Y1,Z1,’ String1’,X2,Y2,Z2,’ String2’,…) plot3与plot的 用法相同
北京科技大学数学实验
例:x=[1,2,3] y=[1,2,3,4] [X,Y]=meshgrid(x,y)
X= 1 2 3
123 123 123
Y =1 1 1 222 333 444
Z=ones(size(X));mesh(X,Y,Z)
计算机图形学 实验3 三维形体构造
![计算机图形学 实验3 三维形体构造](https://img.taocdn.com/s3/m/feb871bf960590c69ec3769d.png)
一、实验题目:三维形体构造二、实验内容使用三维造型工具(如3DSMax或AutoCAD)设计一个日常生活用品(如:计算机器材、水果、杯子、电视、桌椅等)三、实验过程1、设计过程(1)在‘标准几何体’面板中选择“球体”命令将球体的半径设置为40,段数为36,然后在视图区中的顶视图中绘制一个球体(2)在顶视图中鼠标右键单击球体,在快捷菜单中选择“转换为”中的“转换NURBS曲面”命令。
(3)单击命令面板中的“NURBS曲面”选项前面的“+”按钮,选择该命令中的“CV曲面”命令,这时,球体的周围出现了黄色的经线和纬线组成的框线,并且在交叉点上有绿色的点,这些绿色的点被称为CV控制点(4)在CV卷展栏中单击“单个控制点”按钮,在顶视图中单击球体的中心控制点(5)关闭CV卷展栏,打开软选择卷展栏,将该命令下的“软选择”和“影响相邻”命令激活,在“衰减”命令栏中输入20,选择工具栏中的“选择移动”工具,在前视图中对选择的中心点沿Y轴向下移动,这时在苹果的上端会出现一个向下的苹果顶坑(6)在顶视图中球体的中心位置再次单击鼠标的左键选择球体下面的控制点(7)在前视图中沿Y轴向上移动鼠标,创建一个球体的向上凹进的苹果底坑,这时,前视图如下:(8)在‘标准几何体’面板中选择“圆柱体”命令,把光标放在顶视图苹果的中心,画出苹果的叶柄,设置相应的参数。
(9)在修改器列表中选择“弯曲”,设置弯曲的角度为60,再选择“锥化”,设置参数,数量为0,曲线为-2.0(10)给苹果和叶柄渲染上相应的颜色,得到苹果2、实验结果图3、说明设计中采用哪些三维形体构成方法该设计采用的是几何体素构造法,该方法是一种用简单几何形体构造复杂实体的造型方法,用到的造型体素有球体、圆柱体。
4、该实体构造方法的优缺点分析优点:CSG既能增加体素,又能移去体素的布尔运算。
一般造型系统都为用户提供了基本体素,它们的尺寸、形状、位置都可由用户输入少量的参数值来确定,因此非常便捷。
《计算机图形学》实验报告
![《计算机图形学》实验报告](https://img.taocdn.com/s3/m/fd58cdf2910ef12d2af9e7e2.png)
实验报告模板《计算机图形学》实验报告一、实验目的及要求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);}}四、程序调试及结果的分析二维:三维:五、实验心得及建议在实验过程中,尽管过程中任由许多不会的地方,而且有待于今后的提高和改进,但我加深了对书本上知识的理解与掌握,同时也学到了很多书本上没有东西,并积累了一些宝贵的经验,这对我以后的学习与工作是不无裨益的。
计算机图形学实验_简单动画的实现、三维图形变换
![计算机图形学实验_简单动画的实现、三维图形变换](https://img.taocdn.com/s3/m/1678b3b86529647d272852a0.png)
学号专业姓名实验日期2018.12.11 教师签字成绩实验报告【实验名称】简单动画的实现、三维图形变换【实验目的】(1)指定图形运动轨迹,实现物体的移动过程和移动速度控制;(2)理解并掌握形体的投影变换的原理;【实验原理】1)简单动画的原理:显示一个对象,然后把它抹去,把这个图形进行变换后,再在新位置予以显示.当上述过程重复执行时,在视觉上便产生了运动;了解getimage函数和 putimage函数、imagesize函数、malloc 函数、 cleardevice 函数的使用。
2)绘制一点透视图的变换矩阵:1 0 0 0T= 0 1 0 00 0 0 1/dL m n 1+n/d得变换后的点坐标为:x’=(x+l)/(d+(n+z)*d)y’=(y+m)/(d+(n+z)*d)z’=0一.设计思想(一)图形的移动分别画出一个六边形和一个三角形,用两个一维数组p和A来存放其各点坐标;运用putimage(x,y,p,op)函数将六边形不断地向三角形平移,直到到达三角形的边界位置为止。
用到的函数如下: getimage(x1,y1,x2,y2,p); 将屏幕左上角(x1,y1),右下角(x2,y2)的矩形区域内的图象存到指针P 所指向的内存区域中。
putimage(x,y,p,op);将p 所指向的内存区域的内容在屏幕上显示,左上角坐标(x,y)。
(二) 一点透视基本步骤如下:1. 将三维物体平移到适当位置(l,m,n);2. 令视点在z 轴,进行透视变换,变换矩阵如下:1000/110000100001d 3. 最后,向xOy 面作正投影变换,将结果变换到xOy 面上。
如此构造的一点透视变换矩阵为:d n n ml d/1/100000100001+ 则三维形体中任意一点(x,y,z )的一点透视变换的齐次坐标计算形式为:[x’,y’,z’,1]=10)/(*)()/(*)(z n d d m y z n d d l x ++++++;【实验内容】1.图形的移动显示两个图形,然后移动其中一个图形.当被移动的图形超出屏幕范围时,输 出错误信息“Coordinate out of range ”并结束。
计算机图形学课程设计-三维真实感图形设计与绘制
![计算机图形学课程设计-三维真实感图形设计与绘制](https://img.taocdn.com/s3/m/5e1b431d77232f60ddcca1ba.png)
计算机图形学课程设计报告一、实验题目三维真实感图形设计与绘制(1)题目容说明:本题目要求应用OpenGL的光照技术和纹理技术实现一个简单的三维真实感图形的程序设计。
具体要现功能:1)通过对话方式实现交互式设计光照模型功能。
2)实现三维模型纹理映射功能3)用鼠标跟踪球方法实现三维模型的空间旋转2)实现鼠标跟踪球方法程序二、需求分析真实感图形的设计与绘制,是计算机图形学中的一个重要研究领域,也是三维实体造型系统和特征造型系统的重要组成部分。
一般地,三维实体在计算机显示屏上有三种表现形式:简单线框图、线框消隐图和真实感图形。
其中,简单线框图能够粗略表达实体的形状,但由于简单线框图的二义性,从而导致表达其的实体形状具有不确定性。
而线框消隐图虽然能反映实体各表面间的相互遮挡关系,从而达到消除简单线框图产生的二义性的目的,但是这两者一样地只能反映实体的几何形状和实体间的相互关系,而不能反映实体表面的特征,如表面的颜色、材质、纹理等。
所以,只有真实感图形才能表现实体的这些特征,因此,在三维实体造型中,生成三维实体的光照模型,进行实体的真实感绘制与显示占有重要的地位,是很有必要的,也是我做此设计的初衷。
在设计中,我主要使用Opengl绘制真实感图形,它作为一种强大的三维图形开发工具,通过便捷的编程接口提供了处理光照和物体材质、颜色属性等通用功能。
真实感图形学是计算机图形的核心容之一,是最能直接反映图形学魅力的分支。
寻求能准确地描述客观世界中各种现象与景观的数学模型,并逼真地再现这些现象与景观,是图形学的一个重要研究课题。
很多自然景物难以用几何模型描述,如烟雾、植物、水波、火焰等。
本文所讨论的几种建模及绘制技术都超越了几何模型的限制,能够用简单的模型描述复杂的自然景物。
在计算机的图形设备上实现真实感图形必须完成的四个基本任务。
1. 三维场景的描述。
三维造型。
2. 将三维几何描述转换成为二维透视图。
透视变换。
3. 确定场景中的所有可见面。
计算机图形学实验报告
![计算机图形学实验报告](https://img.taocdn.com/s3/m/5a26f368cec789eb172ded630b1c59eef8c79a38.png)
计算机图形学实验报告计算机图形学实验报告引言计算机图形学是研究计算机生成和处理图像的学科,它在现代科技和娱乐产业中扮演着重要的角色。
本实验报告旨在总结和分享我在计算机图形学实验中的经验和收获。
一、实验背景计算机图形学实验是计算机科学与技术专业的一门重要课程,通过实践操作和编程,学生可以深入了解图形学的基本原理和算法。
本次实验主要涉及三维图形的建模、渲染和动画。
二、实验内容1. 三维图形建模在实验中,我们学习了三维图形的表示和建模方法。
通过使用OpenGL或其他图形库,我们可以创建基本的几何体,如立方体、球体和圆柱体,并进行变换操作,如平移、旋转和缩放。
这些基本操作为后续的图形处理和渲染打下了基础。
2. 光照和着色光照和着色是图形学中重要的概念。
我们学习了不同的光照模型,如环境光、漫反射和镜面反射,并了解了如何在三维场景中模拟光照效果。
通过设置材质属性和光源参数,我们可以实现逼真的光照效果,使物体看起来更加真实。
3. 纹理映射纹理映射是一种将二维图像映射到三维物体表面的技术。
通过将纹理图像与物体的顶点坐标相对应,我们可以实现更加细致的渲染效果。
在实验中,我们学习了纹理坐标的计算和纹理映射的应用,使物体表面呈现出具有纹理和细节的效果。
4. 动画和交互动画和交互是计算机图形学的重要应用领域。
在实验中,我们学习了基本的动画原理和算法,如关键帧动画和插值技术。
通过设置动画参数和交互控制,我们可以实现物体的平滑移动和变形效果,提升用户体验。
三、实验过程在实验过程中,我们首先熟悉了图形库的使用和基本的编程技巧。
然后,我们按照实验指导书的要求,逐步完成了三维图形建模、光照和着色、纹理映射以及动画和交互等任务。
在实验过程中,我们遇到了许多挑战和问题,但通过不断的尝试和调试,最终成功实现了预期的效果。
四、实验结果通过实验,我们成功实现了三维图形的建模、渲染和动画效果。
我们可以通过键盘和鼠标控制物体的移动和变形,同时观察到真实的光照效果和纹理映射效果。
计算机图形学报告
![计算机图形学报告](https://img.taocdn.com/s3/m/ef5cc164cc17552706220801.png)
. . . . .. . 优质资料 .. 计算机图形学 (2017年秋季学期)实验 报 告系别:计算机科学与技术 班级: : 学号:实验名称:2-真实感图形绘制2020-11-132/3《计算机图形学》实验报告实验名称真实感图形绘制 实验序号 2实验日期 2017.12.13 实验人 一、实验目的、要求与环境1.目的:通过实验,学生应掌握通过计算机程序进行真实感图形绘制的基本原理,特别是对三维显示对象进行纹理映射的基本方法,将理论和实际应用切实结合起来。
2.要求:对一个三维立方体进行旋转,对其6个不同的面进行6个不同图像的纹理映射,并进行投影变换与显示,分析增强后的视觉效果,提交实验报告。
3.环境:Windows 7操作系统Microsoft Visual Studio 2005OpenGL 函数库4. 自带位图文件(换成你自己的图像文件):总成绩:评语:日期:2020-11-1311/12二、实验容与步骤1. 准备相关图像文件。
2. 进行立方体各面图像与旋转速度的大体设计。
3.在Windows 7 操作系统上,打开Microsoft Visual Studio 2005,编写相关程序,完成程序主体框架结构。
4.编写六面体显示相关的程序代码。
5.编写六面体旋转相关的程序代码。
6.编写深度检测相关的程序代码。
7. 编写纹理载入功能的相关程序代码。
8. 编写纹理参数定义功能的相关程序代码。
9. 编写纹理映射功能的相关程序代码。
10.对程序进行相关调试,修改程序,去除其中的BUG 。
11. 观察纹理映射后的六面体的旋转显示,与预想的结果进行对比,修改相关程序参数。
12.截屏,保留实验结果,进行实验结果分析,并撰写实验报告。
2020-11-13 2/32020-11-13 11/12四、编译过程截图五、实验结果与分析(下面是一个例子,换上你自己的图)实验结果:实验分析程序通过glBindTexture(GL_TEXTURE_2D, lastTextureID);语句,完成了恢复之2020-11-13 2/32020-11-13 11/122020-11-13 2/32020-11-13 11/122020-11-13 2/3。
《计算机图形学》实验3实验报告
![《计算机图形学》实验3实验报告](https://img.taocdn.com/s3/m/b16fe6d880eb6294dd886c8c.png)
实验3实验报告格式《计算机图形学》实验3实验报告实验题目:直线(光栅化)实数型Bresenham 算法在用户坐标系和Java AWT 坐标系下显示图像实验内容:1 直线(光栅化)实数型Bresenham 算法原理及程序。
2 直线(光栅化)DDA 算法原理及程序。
3 在用户坐标系和Java AWT 坐标系下显示图像的算法原理及实现。
写程序调用验证之。
参考资料:1 课件:光栅图形生成算法.PP T2 Bresenham 算法演示程序已经在MyCanvas 包里,DDA 算法applet 演示程序DDA.java3 有一个示范程序imageDrawApplet.java基本概念:(详细叙述自己对实验内容的理解) 直线(光栅化):画一条从(x1, y1)到(x2, y2)的直线,实质上是一个发现最佳逼近直线的像素序列、并填入色彩数据的过程。
这过程称为直线光栅化。
Bresenham 算法:Bresenham 直线算法是用来描绘由两点所决定的直线的算法,它会算出一条线段在 n 维光栅上最接近的点。
这个算法只会用到较为快速的整数加法、减法和位元移位,常用于绘制电脑画面中的直线。
DDA 算法:DDA 算法(Digital Differential Analyzer ),又称数值微分法,是计算机图形学中一种基于直线的微分方程来生成直线的方法。
算法设计:(详细叙述自己设计的Bresenham 算法以及程序的功能、不同坐标系下图像显示的算法)程序功能:用DDA 算法画出直线,在不同的坐标系下显示图像。
Bresenham 算法:用坐标为(xi ,yi,r)的象素来表示直线上的点,则第i+1个点只能在C 和D 中选取。
令d1=BC ,d2=DBd1-d2=(yi+1–yi,r)-( yi,r+1-yi+1)=2yi+1–yi,r –(yi,r+1)= 2yi+1–2yi,r –1x i x i+1令ε(xi+1)= yi+1–yi,r–0.5=BC-AC=BA=B-A= yi+1–(yi,r+ yi,r+1)/2当ε(xi+1)≥0时,yi+1,r= yi,r+1,即选D点,即下个点(xi+1,yi+1 )对应的象素(xi +1,yi+1,r )为(xi+1,yi,r+1 )当ε(xi+1)<0时,yi+1,r= yi,r,即选C点,即下个点(xi+1,yi+1 )对应的象素(xi +1,yi+1,r )为(xi+1,yi,r )ε(xi+1)= yi+1–yi,r–0.5ε(xi+1)≥0时,yi+1,r= yi,r+1ε(xi+1)<0时,yi+1,r= yi,r用户坐标系下图像显示算法:定义自己的坐标系,将用户坐标系转换为Java awt坐标,调用Graphics类的drawImage方法即可。
三维图形的绘制3篇
![三维图形的绘制3篇](https://img.taocdn.com/s3/m/b7e53e5f7f21af45b307e87101f69e314332fa88.png)
三维图形的绘制第一篇:三维图形绘制的基础知识三维图形的绘制是计算机图形学的一个重要分支。
它主要涉及从二维的平面上,通过透视、平移、旋转等变换操作,生成具有三维空间感的图像。
这些图像可以在计算机科学、工程、建筑、影视等领域中得到广泛应用。
三维图形的绘制通常需要借助于专业的三维建模软件或计算机编程语言来实现。
这些软件或语言提供了一套规范和标准的图形库,可以帮助程序员或设计师更加方便快捷地生成所需的三维图形。
在进行三维图形的绘制之前,需要掌握一些基础的知识。
首先,要了解三维坐标系。
三维坐标系一般由X、Y、Z三个轴和一个原点组成,其中X轴表示水平方向、Y轴表示垂直方向,Z轴表示深度方向。
可视化的时候,X、Y、Z三个轴通常用红、绿、蓝三种颜色表示,这就是RGB颜色模式。
其次,要了解三维图形的基本构成单位——三角形。
一个由多个三角形组成的面称为多边形,而一个由多个多边形组成的物体称为模型。
三角形在三维图形中起着至关重要的作用,它们不仅可以构成各种形状的物体,还可以用来做光照处理。
最后,还需要对各种变换操作有一定的了解。
其中比较基础的变换包括平移、旋转、缩放等。
这些变换操作可以将三维图形上的物体,按一定角度或距离进行移动、变形,从而得到不同的视角和效果。
综上所述,三维图形的绘制需要掌握三维坐标系、三角形、变换等基础知识,并借助于专业的建模软件或开发语言进行实现。
对于初学者来说,可以通过学习三维图形的基础知识,逐步掌握绘制技巧,从而进一步提高自己的三维图形绘制能力。
第二篇:三维图形绘制的建模方法三维图形绘制的建模方法有多种,各有其特点和适用范围。
下面介绍其中比较常见的三种建模方法。
第一种是多边形网格建模(Polygon Mesh Modeling)。
这种建模方法是最基础也是最常见的一种,主要通过组合不同数量、不同形状的三角形、四边形面片来构建三维模型。
这种方法的优点是灵活、实时交互性强,适用于低多边形模型的构建,如游戏或一些快速原型设计等。
计算机图形学实验2------OPengl绘制3D图形
![计算机图形学实验2------OPengl绘制3D图形](https://img.taocdn.com/s3/m/5b2ae7164431b90d6c85c73d.png)
实验二 OPengl绘制3D图形一、实验目的➢了解和学习OpengL的编程➢通过学习掌握OpenGL 基本图元的绘制,进行3D图形的绘制➢掌握基于 Win32、Visual C++环境绘制3D 图形配置过程、绘制原理二、环境配置1)创建一个工程。
2)链接OpenGL libraries。
在Visual C++中先单击Project,再单击Settings,再找到Link单击,最后在Object/library modules 的最前面加上opengl32.lib glu32.lib glut.lib g laux.lib gdi32.lib user32.lib advapi32.lib或者在project -> add to project ->files引入需要的头文件3)单击Project Settings中的C/C++标签,将Preprocessor definitions 中的_CONSOLE 改为__WINDOWS。
最后单击OK。
三、实验关键代码void CCMyOpenGLView::RenderScene(){glLoadIdentity();glTranslatef(m_xPos,m_yPos,-5.0f);glRotatef(m_xAngle,1.0f,0.0f,0.0f);glRotatef(m_yAngle,0.0f,1.0f,0.0f);glutWireCone(1.0f,2.0,20,20);}bool CCMyOpenGLView::InitializeOpenGL(){m_pDC = new CClientDC(this);if(m_pDC == NULL){MessageBox("Error Obtaining DC");return FALSE;}if(!SetupPixelFormat()){return FALSE;}m_hRC = ::wglCreateContext (m_pDC->GetSafeHdc ());if(m_hRC == 0){MessageBox("RC创建失败!");return FALSE;}if(::wglMakeCurrent (m_pDC->GetSafeHdc (), m_hRC)==FALSE) {MessageBox("设置当前RC失败!");return FALSE;}::glClearColor(0.0f,0.0f,0.0f,0.0f);::glClearDepth(1.0f);::glEnable(GL_DEPTH_TEST);return TRUE;}bool CCMyOpenGLView::SetupPixelFormat(){static PIXELFORMATDESCRIPTOR pfd ={sizeof(PIXELFORMATDESCRIPTOR),1, PFD_DRAW_TO_WINDOW |PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,PFD_TYPE_RGBA, 24, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 16, 0, 0, PFD_MAIN_PLANE, 0, 0, 0, 0};int m_nPixelFormat = ::ChoosePixelFormat(m_pDC->GetSafeHdc(), &pfd);if ( m_nPixelFormat == 0 ){return FALSE;}if(::SetPixelFormat(m_pDC->GetSafeHdc(),m_nPixelFormat,&pfd)==FALSE){return FALSE;}return TRUE;}int CCMyOpenGLView::OnCreate(LPCREATESTRUCT lpCreateStruct) {if (CView::OnCreate(lpCreateStruct) == -1)return -1;InitializeOpenGL();return 0;}void CCMyOpenGLView::OnDestroy(){CView::OnDestroy();if(::wglMakeCurrent (0,0) == FALSE)MessageBox("Could not make RC non-current");if(::wglDeleteContext (m_hRC)==FALSE)MessageBox("Could not delete RC");if(m_pDC)delete m_pDC;m_pDC = NULL;}BOOL CCMyOpenGLView::OnEraseBkgnd(CDC* pDC){return TRUE;}void CCMyOpenGLView::OnSize(UINT nType, int cx, int cy){CView::OnSize(nType, cx, cy);GLdouble aspect_ratio;if ( 0 >= cx || 0 >= cy )return;::glViewport(0, 0, cx, cy);aspect_ratio = (GLdouble)cx/(GLdouble)cy;::glMatrixMode(GL_PROJECTION);::glLoadIdentity();::gluPerspective(45.0f, aspect_ratio, .01f, 200.0f);::glMatrixMode(GL_MODELVIEW);::glLoadIdentity();}void CCMyOpenGLView::OnLButtonDown(UINT nFlags, CPoint point) {m_MouseDownPoint=point;SetCapture();CView::OnLButtonDown(nFlags, point);}void CCMyOpenGLView::OnLButtonUp(UINT nFlags, CPoint point) {m_MouseDownPoint=CPoint(0,0);ReleaseCapture();CView::OnLButtonUp(nFlags, point);}void CCMyOpenGLView::OnMouseMove(UINT nFlags, CPoint point) {if (GetCapture()==this){m_xAngle+=(point.y-m_MouseDownPoint.y)/3.6;m_yAngle+=(point.x-m_MouseDownPoint.x)/3.6;InvalidateRect(NULL,FALSE);m_MouseDownPoint=point;};CView::OnMouseMove(nFlags, point);}void CCMyOpenGLView::OnObjectsCone(){m_bTeapot=FALSE;m_bSphere=FALSE;m_bCone=TRUE;InvalidateRect(NULL,FALSE);}四、实验结果五、心得体会通过学习Opengl编程,实现三维立体图形的绘制,了解了设置像素格式,即OpenGL怎样操作像素、创建着色描述表并当前化着色表、删除着色表,响应WM_DESTROY消息响应WM_CREATE消息等等,函数实现了解了Opengl实用工具集,它体现了几乎所有现代窗口系统所共有的功能的函数库。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
深圳大学实验报告
课程名称:计算图形学
实验名称:三维图形绘制
学院:计算机与软件学院专业:计算机科学与技术报告人:学号:班级:
同组人:无
指导教师:周虹
实验时间:2014/11/20
实验报告提交时间:2014/11/20
教务处制
一.实验目的
1、掌握设计三维图形绘制程序的主要过程。
2、学会设置多个视区(并设计边框)
3、掌握模型变换的基本方法,熟悉变换次序对结果的不同影响,能正确使用各
个函数进行视点设置、投影变换、视区变换。
二.实验步骤
1、启动Microsoft visual studio 2005 并新建工程<实验三_control_2012150285>
2、新建<实验三_三维图形设计_20121502585.cpp>文件并把磁盘中对应的cpp 文件复制到该文件中,初次编译运行得到原始文件。
3、把显示窗口名称改成“三维图形绘制”
4、建立整体视图,画上纵向边框、横向边框和四周边框(四周边框是后来加上的)。
5、用glutSolidTorus函数插入实心圆环,经测试可以设置内半径为1,外半径为1.65,分割数及环线数均为50。
6、用glutWireCone绘制线型圆锥,设置底面半径、高、绕z轴分割数目、沿z轴数目分别为0.5,3,50,50
7、修改透视视区中旋转函数参数,X轴绕Y轴旋转-15°.
8、改变Angle的值为-25°
9、改变左上视区eye的位置为(0,-5,3),从另一个角度看两个实体
三.实验结果
本次实验中,通过对三维图形的绘制,完成了对用函数绘制三维图形、建立不同视区、绘制视区边框、在不同的视点显示实体、旋转实体等任务。
另外学习了平行投影和透视投影两种对投影方式的使用技巧。
四.实验心得
通过这次实验,我比较深入地理解了三维图形的绘制过程,包括用函数生成不同的实体,对实体平行投影、透视投影的处理,旋转实体,建立不同视区等操作。
通过不断用数据测试,发现:
①平行投影中,视点与实体的距离不影响看到得物体的大小(不过有可能看到的物体
不全面,例如把视点设置在物体内部)。
②透视投影中,物体的大小受到视点与实体的距离影响。
③同样的两个变换以不同的次序给出时可能有不一样的结果。
注:1、报告内的项目或内容设置,可根据实际情况加以调整和补充。
2、教师批改学生实验报告时间应在学生提交实验报告时间后10日内。