2024年4月1日发(作者:)

计算机图形学实验报告

学院名称

课程名称

实验类型

计算机图形学

年级、专

业、班

实验项目

名称

3D机器人

指导

教师

同组姓名

验证 √ 综合 □ 设计 □ 创新 □ 成绩

教师

评语

教师签名: 年 月 日

实验报告内容一般包括以下几个内容:1、目的要求 2、仪器用具及材料(仪器名称及主要规格、用具名称) 3、实验内容及原理(简

单但要抓住要点,写出依据原理) 4、操作方法与实验步骤 5、数据图表格(照片) 6、实验过程原始记录 7数据处理及结果(按

实验要求处理数据、结论) 8、作业题 9、讨论(对实验中存在的问题、进一步的想法等进行讨论)

实验报告内容:

一、实验设备:

OpenGL实用工具库文件 ,glut.h,

安装GLUT库

Copy glut.h =>VC/include/gl/

=>VC/lib/

=>windows/system32/

二、实验内容

(1)实验代码:

#include

#include

#include

#define SOLID 1

#define WIRE 2

int moveX,moveY;

int spinX = 0;

int spinY = 0;

int des = 0;

void init() {

//定义光源的颜色和位置

GLfloat ambient[] = { 0.5, 0.8, 0.1, 0.1 };

GLfloat diffuse[] = { 1.0, 1.0, 1.0, 1.0 };

GLfloat position[] = { -80.0, 50.0, 25.0, 1.0 };

//选择光照模型

GLfloat lmodel_ambient[] = { 0.4, 0.4, 0.4, 1.0 };

GLfloat local_view[] = { 0.0 };

glClearColor(1.0, 1.0, 1.0, 1.0);

glShadeModel(GL_SMOOTH);

//设置环境光

glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);

//设置漫射光

glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);

//设置光源位置

glLightfv(GL_LIGHT0, GL_POSITION, position);

glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);

glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER, local_view);

//启动光照

glEnable(GL_LIGHTING);

//启用光源

glEnable(GL_LIGHT0);

}

//画球

void drawBall(double R, double x, double y,double z, int MODE) {

glPushMatrix();

glTranslated(x,y,z);

if (MODE == SOLID) {

glutSolidSphere(R,20,20);

} else if (MODE ==WIRE) {

glutWireSphere(R,20,20);

}

glPopMatrix();

}

//画半球

void drawHalfBall(double R, double x, double y,double z, int MODE) {

glPushMatrix();

glTranslated(x,y,z);

GLdouble eqn[4]={0.0, 1.0, 0.0, 0.0};

glClipPlane(GL_CLIP_PLANE0,eqn);

glEnable(GL_CLIP_PLANE0);

if (MODE == SOLID) {

glutSolidSphere(R,20,20);

} else if (MODE ==WIRE) {

glutWireSphere(R,20,20);

}

glDisable(GL_CLIP_PLANE0);

glPopMatrix();

}

//画长方体

void drawSkewed(double l, double w, double h, double x, double y, double z, int MODE) {

glPushMatrix();

glScaled(l, w, h);

glTranslated(x, y, z);

if (MODE == SOLID) {

glutSolidCube(1);

} else if (MODE ==WIRE) {

glutWireCube(1);

}

glPopMatrix();

}

void display(void) {

//清除缓冲区颜色

glClear(GL_COLOR_BUFFER_BIT);

//定义白色

glColor3f(1.0, 1.0, 1.0);

//圆点放坐标中心

glLoadIdentity();

//从哪个地方看

gluLookAt(-2.0, -1.0, 20.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);

glPushMatrix();

glRotated(spinX, 0, 1, 0);

glRotated(spinY, 1, 0, 0);

glTranslated(0, 0, des);

//头

drawBall(2, 0, 1, 0, SOLID);

//身体

drawSkewed(5, 4.4, 4, 0, -0.75, 0, SOLID);

//肩膀

drawHalfBall(1, 3.5, -2.1, 0, SOLID);

drawHalfBall(1, -3.5, -2.1, 0, SOLID);

//胳膊

drawSkewed(1, 3, 1, 3.5, -1.3, 0, SOLID);

drawSkewed(1, 3, 1, -3.5, -1.3, 0, SOLID);

//手

drawBall(1, 3.5, -6.4, 0, SOLID);

drawBall(1, -3.5, -6.4, 0, SOLID);

//腿

drawSkewed(1.2, 3, 2, 1, -2.4, 0, SOLID);

drawSkewed(1.2, 3, 2, -1, -2.4, 0, SOLID);

//脚

drawSkewed(1.5, 1, 3, 0.9, -9.2, 0, SOLID);

drawSkewed(1.5, 1, 3, -0.9, -9.2, 0, SOLID);

glPopMatrix();

glutSwapBuffers();

}

//鼠标点击事件

void mouseClick(int btn, int state, int x, int y) {

moveX = x;

moveY = y;

GLfloat ambient[] = { (float)rand() / RAND_MAX, (float)rand() / RAND_MAX, (float)rand() / RAND_MAX, 0.1 };

//设置环境光