计算机图形学实验_透视茶壶源代码

合集下载

计算机图形学实验_透视茶壶源代码

计算机图形学实验_透视茶壶源代码
glRotatef(-90,1,0,0);
glScalef(sx,sy,sz);
Draw_Scene();
if(bAnim)
fRotate+=0.3f;
//todo hint:when you want to rotate the teepot you may like to add another line here =
case 'c':{center[1]=center[1]-1;break;}
case 'r':{center[0]=0;center[1]=0;center[2]=0;};//恢复原状
//茶壶相关操作
case 'j':{tx++;break;}
case 'l':{tx--;break;}
case 'i':{ty++;break;}
glMatrixMode(GL_PROJECTION);//select the projection matrix
glLoadIdentity();//reset the projection matrix
float whRatio=(GLfloat)width/(GLfloat)height;
if(bPersp)
float center[]={0,0,0};
//todo:hint:you may need another array when you operate the teapot
void key(unsigned char k,int x,int y)
{
switch(k)
{
case 27:

《计算机图形学》实验指导书

《计算机图形学》实验指导书

计算机图形学实验指导书袁科计算机技术实验中心目录实验一实现DDA、中点画线算法和Bresenham画线算法 (24)实验二实现Bezier曲线 (25)实验三实现B样条曲线 (26)实验四实现多边形填充的边界标志算法 (27)实验五实现裁剪多边形的Cohen-Sutherland算法 (28)实验六二维图形的基本几何变换 (30)实验七画图软件的编制 (31)实验一实现DDA、中点画线算法和Bresenham画线算法【实验目的】1、掌握直线的多种生成算法;2、掌握二维图形显示原理。

【实验环境】VC++6.0/ BC【实验性质及学时】验证性实验,2学时,必做实验【实验内容】利用任意的一个实验环境,编制源程序,分别实现直线的三种生成算法,即数字微分法(DDA)、中点画线法以及Bresenham画线算法。

【实验原理】1、数字微分法(Digital Differential Analyzer,DDA)算法思想:基于直线的微分方程来生成直线。

ε=1/max(|△x|,|△y|)max(|△x|,|△y|)=|△x|,即|k|≤1 的情况:max(|△x|,|△y|)=|△y|,此时|k|≥1:2、中点画线法算法思想:每次在最大位移方向上走一步,另一方向是否走步取决于误差项的判断。

3、Bresenham画线算法算法思想:其基本思想同中点算法一样,即每次在最大位移方向上走一步,而另一个方向是否走步取决于误差项的判断。

【实验要求】1.上交源程序;2.上交实验报告,实验报告内容如下:(1) 实验名称(2) 实验目的(3) 算法实现的设计方法及程序流程图(4) 程序结果分析【分析与思考】(1) 上述所阐述的三个算法,其基本算法只能适用于直线的斜率(|K|<=1) 的情形,如何将上述算法进行推广,使其能够处理任意斜率的直线?(2) 计算机显示屏幕的坐标圆心在哪里,与我们平时的习惯有什么差异,如何协调二者?实验二 实现Bezier 曲线【实验目的】1、掌握Bezier 曲线的定义;2、能编程实现N 次Bezier 曲线的绘制与显示。

计算机图形学 实验一:生成彩色立方体(含源代码)

计算机图形学 实验一:生成彩色立方体(含源代码)

实验一实验目的:生成彩色立方体实验代码://ColorCube1.javaimport java.applet.Applet; //可以插入htmlimport java.awt.BorderLayout; //窗口采用BorderLayout方式布局import com.sun.j3d.utils.applet.MainFrame; //applicationimport com.sun.j3d.utils.geometry.ColorCube;//调用生成ColorCube的Utility import com.sun.j3d.utils.geometry.Primitive;import com.sun.j3d.utils.universe.*; //观测位置的设置import javax.media.j3d.*; //核心类import javax.vecmath.*; //矢量计算import com.sun.j3d.utils.behaviors.mouse.*;public class ColorCube1 extends Applet {public BranchGroup createSceneGraph() {BranchGroup objRoot=new BranchGroup();//BranchGroup的一个对象objRoot(放置背景、灯光)BoundingSphere bounds=new BoundingSphere(newPoint3d(0.0,0.0,0.0),100.0);//有效范围TransformGroup objTrans=new TransformGroup();objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);objRoot.addChild(objTrans);MouseRotate behavior = new MouseRotate();behavior.setTransformGroup(objTrans);objRoot.addChild(behavior);behavior.setSchedulingBounds(bounds);MouseZoom behavior2 = new MouseZoom();behavior2.setTransformGroup(objTrans);objRoot.addChild(behavior2);behavior2.setSchedulingBounds(bounds);MouseTranslate behavior3 = new MouseTranslate();behavior3.setTransformGroup(objTrans);objRoot.addChild(behavior3);behavior3.setSchedulingBounds(bounds);Color3f bgColor=new Color3f(0.0f,0.0f,0.0f);//背景颜色Background bg=new Background(bgColor);bg.setApplicationBounds(bounds);objRoot.addChild(bg);Color3f directionalColor=new Color3f(1.f,1.f,1.f);Vector3f vec=new Vector3f(1.f,1.f,-1.0f);DirectionalLight directionalLight=new DirectionalLight(directionalColor,vec);directionalLight.setInfluencingBounds(bounds);objRoot.addChild(directionalLight);Appearance app=new Appearance();//外观材质Material material=new Material();//圆锥颜色//material.setEmissiveColor(new Color3f(1.0f,1.0f,0.0f));material.setDiffuseColor(new Color3f(1.0f,1.0f,0.0f));//辐射光效果app.setMaterial(material);ColorCube cone=new ColorCube(0.2);objTrans.addChild(cone);//pile();return objRoot;}public ColorCube1() {setLayout(new BorderLayout());Canvas3D c=new Canvas3D(null);add("Center",c);BranchGroup scene=createSceneGraph();SimpleUniverse u=new SimpleUniverse(c);u.getViewingPlatform().setNominalViewingTransform();u.addBranchGraph(scene);}public static void main(String[] args) {new MainFrame(new ColorCube1(),400,300);}}运行截图:。

计算机图形学实验报告及代码

计算机图形学实验报告及代码
(2)向量图形的尺寸变化;
九、作业
课后习题
十、本章小结
在本章中,对计算机图形学的基本概念和研究内容进行了概述,对发展概况和应用领域进行了说明。
第2章计算机图形系统
一、教学目标
通过对本章的学习,要求熟悉计算机图形系统的组成/各种图形显示器、图形输入/输出设备。
二、教学要求
1、了解计算机图形系统的组成;
(5).计算机网络
计算机网络是指将上述四类计算机平台,或者其中某一类通过某种互联技术彼此连接,按照某种通信协议进行数据传输、数据共享、数据处理的多机工作环境。
它的特点是多种计算机相连,可以充分发挥各个机器的性能和特点,以达到很高的性能价格比。
网络图形系统要考虑的关键问题是网络服务器的性能,图形数据的通信、传输、共享以及图形资源的利用问题。
(3).中、小型计算机
一般在特定的部门、单位和应用领域中采用此类环境。它是大型信息系统建立的重要环境,这种环境中信息和数据的处理量是很大的,要求机器有极高的处理速度和极大的存储容量。
(4).大型机
以大型计算机为基础,具有容量庞大的存储器和极强的计算功能,大量的显示终端及
高精度、大幅面的硬拷贝设备。还往往拥有自行开发的、功能齐全的应用软件系统。例如,美国第三大汽车公司(CHRYSLER汽车公司)就拥有庞大的计算机系统来进行计算机辅助设计、实体造型、结构分析、运动模拟、工程和科学计算、项目管理、生产过程控制等。
1.1计算机图形学的研究内容
计算机图形表现形式
(1).线条式(线框架图)
用线段来表现图形,容易反映客观实体的内部结构,如各类工程技术中结构图的表示,机械设计中零件结构图及电路设计中的电路原理图等。具有面模型、色彩、浓淡和明暗层次效应,适合表现客观实体的外形或外貌,如汽车、飞机、轮船等的外形设计以及各种艺术品造型设计等。

09008406_实验二

09008406_实验二

计算机图形学实验报告二09008406陈怡东2010年11月23日星期二一、使用手册程序功能:生成了一个三维茶壶,并且设置了光照,和表面材质。

可以通过键盘上的按键来改变光源的位置,或者右击菜单中也有直接设置光源的位置的功能。

可以通过对茶壶的拾取和鼠标移动对视点进行变换,看到茶壶的不同表面。

可以通过右击菜单中的选项来改变茶壶的材质,或者直接用户自定义茶壶材质参数使用手册:打开程序后,1.通过键盘上的'w''s''a''d''q''e'键来改变光源的位置。

2.鼠标右键菜单, 可以改变材质属性, 或者手动输入材质属性3.右击菜单中的添加纹理贴图可以对球体进行贴图. (默认图片为该文件夹下的output.bmp)4.可以通过对茶壶的拾取和鼠标移动对视点进行变换,看到茶壶的不同表面。

5.右击菜单中可以直接指定用户需要的光源位置。

6.q键退出二、设计思路:a)光源.本实验没有做Init()函数来初始化,而是直接封装在myDisplay()函数中。

先开始对于光源的位置用GlLookAt初始化,而后在对'w''s'的响应中对y坐标改变0.1,在对'a''d'的响应中对x坐标改变0.1,在对'q''e'的响应中对z的坐标改变0.1。

还可以通过右击菜单中的“设置光源位置”直接对数组Light_PosType 赋值,从而能够设定光源位于任何位置的效果b)材质在myDisplay()中对材质附初始值。

对鼠标右键加入菜单, 对相应条目设置固定的材质属性以方便调用加入手动设置条目, 让用户可以从键盘输入材质属性.c)贴图先写 loadTexture() 函数, 把默认图片载入为默认贴图, 再响应右击菜单中的“增加纹理贴图”选项开启贴图功能 (2d), 并在要贴图时先调用loadTexture载入贴图后,再绘制要贴图的对象.注意:默认图片为 output.bmp问题:不太理解 OpenGL用什么方式在茶壶等曲面上完成贴图的。

计算机图形学opengl动画的实现源代码

计算机图形学opengl动画的实现源代码

实验目的:
在VC6.0的opengl的环境下,实现固定物体的连续变化,从而使简单动画得以实现。

实验思想:
由于是简单图形的变化过程,所以问题关键在于:
1、物体的位置变化如何实现,而位置变化在opengl中体现在坐标的变化中,因而设置坐标的每一步物体的位置变化情况是该问题的关键,此关键代码如下:
wAngleX += 1.0f;
wAngleY += 10.0f;
wAngleZ += 5.0f;
2、再有就是如何使得连续的变化得以实现,这就实现了手动变化相自动变化的转变,为了实现这一问题,我们想到设置一个变化时间,使得物体在每个时间段变换一次位置,当这个时间适当小时,就实现了物体的连续变化;这就需要引进一个计时器,通过设置间隔时间实现物体的连续变化,此关键代码如下:
SetTimer(1, 150, NULL);
实验步骤:
1、初始化OpenGL。

2、设置菜单与关联函数初始化,设置视口与窗口匹配,重新设置坐标系统。

3、建立正交变换下的剪切体(即变换物体)。

4、编写变换幅度函数,设置没不变换情况。

5、编写连续变换计时器,使得在一定间隔下连续变换。

实验关键代码:
实验结果:。

计算机图形学实验内容

计算机图形学实验内容

计算机图形学实验内容计算机图形学实验肖加清实验一图形学实验基础一、实验目的(1)掌握VC++绘图的一般步骤;(2)掌握OpenGL软件包的安装方法;(3)掌握OpenGL绘图的一般步骤;(4)掌握OpenGL的主要功能与基本语法。

二、实验内容1、VC++绘图实验(1)实验内容:以下是绘制金刚石图案。

已给出VC++参考程序,但里面有部分错误,请改正,实现以下图案。

N=3N=4N=5N=10CP2();virtual ~CP2();CP2(double,double);double x;double y;};CP2::CP2(){this->x=0.0;this->y=0.0;}CP2::~CP2(){}CP2::CP2(double x0,double y0) {this->x=x0;this->y=y0;}//视图类的一个成员函数,这个成员函数可以放在OnDraw函数里调用。

//在视图类的头文件(.h)里定义此函数void Diamond();//在视图类的实现文件(.cpp)里实现此函数void CTestView::Diamond(){CP2 *P;int N;double R;R=300;N=10;P=new CP2[N];CClientDC dc(this);CRect Rect;GetClientRect(&Rect);double theta;theta=2*PI/N;for(int i=0;i<N;i++){P[i].x=R*cos(i*theta);P[i].y=R*sin(i*theta);}for(i=0;i<=N-2;i++){for(int j=i+1;j<=N-1;j++){//其中ROUND函数需要自己实现,实现四舍五入的功能。

dc.MoveTo(ROUND(P[i].x+Rect.right/2),RO UND(P[i].y+Rect.bottom/2));dc.LineTo(ROUND(P[j].x+Rect.right/2),RO UND(P[j].y+Rect.bottom/2));}}delete []P;}2、OpenGL绘图(1)以下是用OpenGL绘制茶壶的代码,请在OpenGL环境下运行,分析OpenGL程序的结构#include <windows.h>#include <GL/gl.h>#include <GL/glu.h>#include <GL/glaux.h>//定义输出窗口的大小#define WINDOW_HEIGHT 300#define WINDOW_WIDTH 500//用户初始化函数void myninit(void);//窗口大小变化时的回调函数void CALLBACK myReshape(GLsizei w,GLsizei h);//每帧OpenGL都会调用这个函数,应该把显示代码放在这个函数中void CALLBACK display(void);int window_width=WINDOW_WIDTH;int window_height=WINDOW_HEIGHT;//视点离物体的距离float distance=3.6f;//初始化,此时为空,可以在这里进行初始化操作void myinit(void){}void CALLBACK display(void){//设置清屏的颜色,并清屏和深度缓冲glClearColor(0.0f,0.0f,0.0f,0.0f);glClear(GL_COLOR_BUFFER_BIT|GL_ DEPTH_BUFFER_BIT);//设置成模型矩阵模式glMatrixMode(GL_MODELVIEW);//载入单位化矩阵glLoadIdentity();//坐标中心向Z轴平移-distance,这样使坐标中心位于视点前方glTranslatef(0.0,0.0,-distance);//在坐标中心显示一个茶壶auxWireTeapot(1.0);//等待现有的OpenGL命令执行完成glFlush();//交换前后缓冲区auxSwapBuffers();}void CALLBACK myReshape(GLsizei w,GLsizei h){if(!h) return ;//这定视区glViewport(0,0,w,h);//设定透视方式glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(60.0,1.0*(GLfloat)w/(GLflo at)h,1.0,30.0);window_width=w;window_height=h;}//移近移远的回调函数void CALLBACK MoveNear(void){distance-=0.3f;}void CALLBACK MoveFar(void){distance +=0.3f;}//主函数int main(int argc,char **argv){//初始化OpenGL的显示方式auxInitDisplayMode(AUX_DOUBLE|AUX _RGB|AUX_DEPTH16);//设定OpenGL窗口位置和大小auxInitPosition(0,0,WINDOW_WIDTH,W INDOW_HEIGHT);//打开窗口auxInitWindow("OpenGL的一个简单的例子!");//调用初始化函数myinit();//设定窗口大小变化的回调函数auxReshapeFunc(myReshape);//设定移动视点的回调函数auxKeyFunc('A',MoveNear); //按A键变大auxKeyFunc('a',MoveFar); //按a键变小//使display函数一直被调用auxIdleFunc(display);//开始OpenGL的循环auxMainLoop(display);//结束程序return (0);}其运行结果如图所示:(2)OPENGL绘制矩形的简单例子参考程序:#include <gl/glut.h>void Initial(void){glClearColor(1.0f, 1.0f, 1.0f, 1.0f); //设置窗口背景颜色为白色glMatrixMode(GL_PROJECTION);//设置投影参数gluOrtho2D(0.0,200.0,0.0,150.0);}void Display(void){glClear(GL_COLOR_BUFFER_BIT); //用当前背景色填充窗口glColor3f(1.0f, 0.0f, 0.0f); //设置当前的绘图颜色为红色glRectf(50.0f, 100.0f, 150.0f, 50.0f); //绘制一个矩形glFlush(); //处理所有的OpenGL程序}int main(int argc, char* argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); //初始化窗口的显示模式glutInitWindowSize(400,300);//设置窗口的尺寸glutInitWindowPosition(100,120);//设置窗口的位置glutCreateWindow("矩形"); //创建一个名为矩形的窗口glutDisplayFunc(Display);//设置当前窗口的显示回调函数Initial();//完成窗口初始化glutMainLoop();//启动主GLUT事件处理循环return 0;}三、实验结果分析实验二直线生成算法与用户接口与交互式技术一、实验目的1、掌握直线生成算法(1)DDA算法(2)Bresenham算法2、掌握交互式技术(1)鼠标(2)键盘数字键、字母键、功能键和特殊键3、实现拾取操作二、实验内容1、以下给出了DDA算法的C++代码,请参考用Visual C++实现Bresenham算法。

《计算机图形学》课内实验报告(实验一)

《计算机图形学》课内实验报告(实验一)
PFNGLGETINFOLOGARBPROC glGetInfoLogARB;
PFNGLUNIFORM1FARBPROC glUniform1fARB;
PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB;
#ifndef __APPLE__
PFNGLSECONDARYCOLOR3FPROC glSecondaryColor3f;
{
GLbyte infoLog[MAX_INFO_LOG_SIZE];
glGetInfoLogARB(progObj, MAX_INFO_LOG_SIZE, NULL, infoLog);
fprintf(stderr, "Error in program linkage!\n");
fprintf(stderr, "Info log: %s\n", infoLog);
// Demonstrates high-level shaders
// Program by Benjamin Lipchak
#include "../../Common/OpenGLSB.h" // System and OpenGL Stuff
#include "../../Common/GLTools.h" // System and OpenGL Stuff
// Initially set the blink parameter to 1 (no flicker)
if (flickerLocation != -1)
glUniform1fARB(flickerLocation,1.0f);
// Program object has changed, so we should revalidate
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
//todo when 'p'operation ,hint:use function glupersPective
}
else
glOrtho(-3,3,-3,3,-100,100);
glMatrixMode(GL_MODELVIEW);//select the modelview matrix
}
void reshape(int width,int height)
case 'k':{ty--;break;}
case 'n':{tz++;break;}
case 'm':{tz--;ty--;break;}
case 'g':{sx=sy=sz=sx+0.05;break;}//放大
case 'f':{sx=sy=sz=sx-0.05;break;}//缩小
}
}
void redraw()
if(bWire)
{
glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
}
else
{
glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
}
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING);
GLfloat white[]={1.0,1.0,1.0,1.0};
float sy=0.3f;
float sz=0.3f;
void Draw_Scene()
{
glPushMatrix();
glTranslatef(0,0,5);
glRotatef(tangle,tx,ty,tz);
// glutSolidTeapot(1);
glutSolidSphere(1.0f,10,10);
bool bPersp=false;
bool bAnim=false;
bool bWire=false;
int wHeight=0;
int wWidth=0;
//todo
//hint:some additional parameters may needed here when you operate the teapot
case 'p':{bPersp=!bPersp;updateView(wHeight,wWidth);break;}
case ' ':{bAnim=!bAnim;break;}
case 'o':{bWire=!bWire;break;}
case 'a':{center[0]=center[0]+1;break;}//todo ,hint:eye[]and center[]are the keys to solve the problems
GLfloat light_pos[]={5,5,5,1};
glLightfv(GL_LIGHT0,GL_POSITION,light_pos);
glLightfv(GL_LIGHT0,GL_AMBIENT,white);
glEnable(GL_LIGHT0);
glRotatef(fRotate,0,0,1.0f);//ratate around y axis
case 'd':{center[0]=center[0]-1;break;}
case 'w':{center[2]=center[2]+1;break;}
case 's':{center[2]=center[2]-1;break;}
case 'z':{center[1]=center[1]+1;break;}
//leg4
glPushMatrix();
glTranslatef(-1.5,-1,1.5);
Draw_Leg();
glPopMatrix();
}
void updateView(int width,int height)
{
glViewport(0,0,width,height);//reset the current viewport
glRotatef(-90,1,0,0);
glScalef(sx,sy,sz);
Draw_Scene();
if(bAnim)
fRotate+=0.3f;
//todo hint:when you want to rotate the teepot you may like to add another line here =
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
gluLookAt(eye[0],eye[1],eye[2],center[0],center[1],center[2],0,1,0);//场景(0,0,0)扥视点中心(0,5,50)Y轴向上
glutSwapBuffers();
}
int main(int argc,char*argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGBA|GLUT_DEPTH|GLUT_DOUBLE);
glutInitWindowSize(480,480);
void Draw_Leg()
{
glScalef(1,1,3);
glutSolidCube(1.0f);
//glutWireCone(1.0f);
}
//定义操作茶壶的操作参数
int tx=1;
int ty=0;
int tz=0;
int tangle=90;
//定义设置scale的参数
float sx=0.3f;
{
if(height==0)//prevent a divide by zero by
{
height=1;
}
wHeight=height;
wWidth=width;
updateView(wHeight,wWidth);
}
void idle()
{
glutPostRedisplay();
}
float eye[]={0,0,8};
#include<windows.h>
#include<gl/glut.h>
#include<gl/gl.h>
using namespace std;
float fTranslate;
float fRotate;
float fScale=1.0f;//set inital scale value to 1.0f
int windowHandle=glutCreateWindow("Simple GLUT App");
glutDisplaunc(reshape);
glutKeyboardFunc(key);
glutIdleFunc(idle);
glutMainLoop();
return 0;
}
glMatrixMode(GL_PROJECTION);//select the projection matrix
glLoadIdentity();//reset the projection matrix
float whRatio=(GLfloat)width/(GLfloat)height;
if(bPersp)
glPopMatrix();
//leg2
glPushMatrix();
glTranslatef(-1.5,1,1.5);
Draw_Leg();
glPopMatrix();
//leg3
glPushMatrix();
glTranslatef(1.5,-1,1.5);
Draw_Leg();
glPopMatrix();
glPopMatrix();
glPushMatrix();
glTranslatef(0,0,3.5);
glScalef(5,4,1);
glutSolidCube(1.0);
glPopMatrix();
//leg1
glPushMatrix();
glTranslatef(1.5,1,1.5);
Draw_Leg();
float center[]={0,0,0};
//todo:hint:you may need another array when you operate the teapot
void key(unsigned char k,int x,int y)
{
switch(k)
{
case 27:
case 'q':{exit(0);break;}
case 'c':{center[1]=center[1]-1;break;}
case 'r':{center[0]=0;center[1]=0;center[2]=0;};//恢复原状
//茶壶相关操作
case 'j':{tx++;break;}
case 'l':{tx--;break;}
case 'i':{ty++;break;}
相关文档
最新文档