计算机图形学       课程实验报告

实验名称    真实感图形绘制    

一、实验目的

1.掌握光照模型的编程应用

2.能够编程模拟实现简单的太阳系

1. 用不同的着色和光照参数绘制茶壶:

i. 线框模型的茶壶

ii. 没有光照的固定颜色的茶壶

iii. 只有环境光,采用单一颜色的茶壶

iv. 只有环境光和漫反射光,采用Gouraud插值着色的茶壶

v. 有环境光、漫反射光和镜面高光,采用Gouraud插值着色的茶壶

vi. 有环境光、漫反射光和镜面高光,采用Phone插值着色的茶壶

2. 模拟简单的太阳系,太阳在中心,地球每365天绕太阳转一周,月球每年绕地球转12周。另外,地球每天24个小时绕它自己的轴旋转。

二、实验环境

1.codeblocks-17.12

2.Windows10 SDK 10.0.17134.0

三、实验内容

1茶壶绘制

1.1问题重述

用不同的着色和光照参数绘制茶壶:

i. 线框模型的茶壶

ii. 没有光照的固定颜色的茶壶

iii. 只有环境光,采用单一颜色的茶壶

iv. 只有环境光和漫反射光,采用Gouraud插值着色的茶壶

v. 有环境光、漫反射光和镜面高光,采用Gouraud插值着色的茶壶

vi. 有环境光、漫反射光和镜面高光,采用Phone插值着色的茶壶

2.2实验结果

i. 线框模型的茶壶

ii. 没有光照的固定颜色的茶壶

iii. 只有环境光,采用单一颜色的茶壶

iv. 只有环境光和漫反射光,采用Gouraud插值着色的茶壶

v. 有环境光、漫反射光和镜面高光,采用Gouraud插值着色的茶壶

vi. 有环境光、漫反射光和镜面高光,采用Phone插值着色的茶壶

2.模拟太阳系

2.1问题重述

模拟简单的太阳系,太阳在中心,地球每365天绕太阳转一周,月球每年绕地球转12周。另外,地球每天24个小时绕它自己的轴旋转。

2.2运行结果

三、源代码

1.

#include<windows.h>

#include <GL/glut.h>

#include <stdio.h>

GLfloat d = 0.1;

GLfloat translateX = 0, translateY = 0;

int halfLength = 20;

GLfloat ratio;

class Point{

public:

GLfloat x, y, z;

Point(GLfloat x = 0.0, GLfloat y = 0.0, GLfloat z = 0.0){

this->x = x;

this->y = y;

this->z = z;

}

};

typedef Point Color;

int renderMode = 1;

GLfloat light_position[]={1.0,1.0,1.0,0.0};

GLfloat blackColor[]={0.0,0.0,0.0,1.0};

GLfloat greyColor[] = {0.5, 0.5, 0.5, 1.0};

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

GLfloat redColor[]={1.0,0.0,0.0,1.0};

GLfloat no_mat[] ={0.0,0.0,0.0,1.0};

GLfloat mat_ambient[] = {0.7,0.7,0.7,1.0};

GLfloat mat_diffuse[] = {0.1,0.5,0.8,1.0};

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

GLfloat no_shininess[] = {0.0};

GLfloat low_shininess[] = {5.0};

GLfloat high_shininess[] = {100.0};

void init(){

glClearColor(1.0, 1.0, 1.0, 1.0);

//远光源照射

glLightfv(GL_LIGHT0,GL_POSITION,light_position);

//启用光照

glEnable(GL_LIGHTING);

glEnable(GL_LIGHT0);

glShadeModel(GL_SMOOTH);

//局部光源照射

//    GLfloat light_position1[] = {2.0,0.0,3.0,1.0};

//    glLightfv(GL_LIGHT1,GL_POSITION,light_position1);

//    glEnable(GL_LIGHTING);

//    glEnable(GL_LIGHT1);

glEnable(GL_DEPTH_TEST);

}

void drawCoord(){

glColor3f(1.0, 1.0, 1.0);

glBegin(GL_LINES);

glVertex2f(-halfLength, 0.0);

glVertex2f(halfLength, 0.0);

glVertex2f(0.0, -halfLength);

glVertex2f(0.0, halfLength);

glEnd();

}

void changeSize(GLsizei w, GLsizei h){

glViewport(0.0, 0.0, w, h);

if(h == 0)

h = 1;

ratio = (GLfloat)w / (GLfloat)h;

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

if(w < h)

glOrtho(-halfLength, halfLength, -halfLength / ratio, halfLength /ratio, -halfLength, halfLength);

//        glFrustum(-halfLength, halfLength, -halfLength / ratio, halfLength /ratio, -10 * halfLength, 0.0);

else

glOrtho(-halfLength * ratio, halfLength * ratio, -halfLength, halfLength, -halfLength, halfLength);

//        glFrustum(-halfLength * ratio, halfLength * ratio, -halfLength, halfLength, -10 * halfLength, 0.0);

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

}

void renderScene(){

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glLoadIdentity();

glEnable(GL_LIGHTING);

switch (renderMode){

case 1:

case 2:

glDisable(GL_LIGHTING);

break;

case 3:

glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mat_ambient);

glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, no_mat);

glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, no_mat);

glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, no_shininess);

//            glLightfv(GL_LIGHT0,GL_DIFFUSE,whiteColor);

break;

case 4:

glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mat_ambient);

glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_diffuse);

glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, no_mat);

glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, no_shininess);

//            glLightfv(GL_LIGHT0,GL_SPECULAR,whiteColor);;

case 5:

glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mat_ambient);

glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_diffuse);

glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular);

glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, low_shininess);

break;

case 6:

glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mat_ambient);

glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_diffuse);

glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular);

glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, high_shininess);

default:;

}

glColor3f(1.0, 0, 0);

glMatrixMode(GL_MODELVIEW);

glTranslatef(0.0, 0.0, -5.0);

//glRotatef(15.0, 1.0, 1.0, 1.0);

printf("renderMode = %d\n", renderMode);

if(renderMode == 1)

glutWireTeapot(7.0);

else

glutSolidTeapot(7.0);

glFlush();

}

void keyboardFunc(unsigned char key, int x, int y){

switch(key){

case '1':

case '2':

case '3':

case '4':

case '5':

case '6':

renderMode = key - '0';

break;

case 'q':

exit(0);

default:;

}

glutPostRedisplay();

}

int main(int argc, char *argv[]) {

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);

glutInitWindowSize(500, 500);

glutCreateWindow("template");

init();

glutDisplayFunc(renderScene);

glutReshapeFunc(changeSize);

glutKeyboardFunc(keyboardFunc);

glutMainLoop();

return 0;

}

2.

#include<windows.h>

#include <GL/glut.h>

#include <stdio.h>

GLfloat d = 0.1;

GLfloat translateX = 0, translateY = 0;

int halfLength = 70;

GLfloat ratio;

GLfloat sun2Earth = 40.0;

GLfloat earth2Moon = 10.0;

GLfloat earthAngle = 0.0, moonAngle = 0.0;

GLfloat sunSize = 15;

GLfloat earthSize = 5;

GLfloat moonSize = 2;

GLfloat sunColor[] = {1.0, 0.0, 0.0, 1.0};

GLfloat earthColor[] = {0.0, 0.0, 1.0, 1.0};

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

GLfloat whiteLight[] = {0.5f, 0.5f, 0.5f, 1.0f};

GLfloat sourceLight[] = {0.8f, 0.8f, 0.8f, 1.0f};

GLfloat lightPos[] = {0.0f, 0.0f, 0.0f, 1.0f};

class Point{

public:

GLfloat x, y, z;

Point(GLfloat x = 0.0, GLfloat y = 0.0, GLfloat z = 0.0){

this->x = x;

this->y = y;

this->z = z;

}

};

typedef Point Color;

void init(){

glEnable(GL_LIGHTING);

glLightModelfv(GL_LIGHT_MODEL_AMBIENT, whiteLight);

glLightfv(GL_LIGHT0, GL_DIFFUSE, sourceLight);

glLightfv(GL_LIGHT0, GL_POSITION, lightPos);

glEnable(GL_LIGHT0);

glEnable(GL_COLOR_MATERIAL);

glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);

glEnable(GL_DEPTH_TEST);

glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

glShadeModel(GL_SMOOTH);

}

void drawCoord(){

glColor3f(1.0, 1.0, 1.0);

glBegin(GL_LINES);

glVertex2f(-halfLength, 0.0);

glVertex2f(halfLength, 0.0);

glVertex2f(0.0, -halfLength);

glVertex2f(0.0, halfLength);

glEnd();

}

void changeSize(GLsizei w, GLsizei h){

glViewport(0.0, 0.0, w, h);

if(h == 0)

h = 1;

ratio = (GLfloat)w / (GLfloat)h;

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

if(w < h)

glOrtho(-halfLength, halfLength, -halfLength / ratio, halfLength /ratio, -halfLength, halfLength);

//        glFrustum(-halfLength, halfLength, -halfLength / ratio, halfLength /ratio, -10 * halfLength, 0.0);

else

glOrtho(-halfLength * ratio, halfLength * ratio, -halfLength, halfLength, -halfLength, halfLength);

//        glFrustum(-halfLength * ratio, halfLength * ratio, -halfLength, halfLength, -10 * halfLength, 0.0);

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

}

void renderScene(){

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glLoadIdentity();

glMatrixMode(GL_MODELVIEW);

glRotatef(80.0, 1.0, 1.0, 1.0);

//    drawCoord();

glColor3fv(sunColor);

glDisable(GL_LIGHTING);

glutSolidSphere(sunSize, 50, 50);

glEnable(GL_LIGHTING);

glRotatef(earthAngle, 0.0, 0.0, 1.0);

glTranslatef(sun2Earth, 0.0, 0.0);

glColor3fv(earthColor);

glutSolidSphere(earthSize, 50, 50);

glRotatef(moonAngle, 0.0, 0.0, 1.0);

glTranslatef(earth2Moon, 0.0, 0.0);

glColor3fv(moonColor);

glutSolidSphere(moonSize, 50, 50);

glLoadIdentity();

earthAngle += d;

moonAngle += 12 * d;

glutSwapBuffers();

glutPostRedisplay();

}

void mySpecialKeyFunc(int key, int x, int y){

switch (key){

case GLUT_KEY_UP:

d += 0.01;

break;

case GLUT_KEY_DOWN:

d -= 0.01;

break;

default:;

}

}

void myKeyboardFunc(unsigned char key, int x, int y){

if(key == 'q'){

exit(0);

}

}

int main(int argc, char *argv[]) {

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);

glutInitWindowSize(500, 500);

glutCreateWindow("template");

init();

glutDisplayFunc(renderScene);

glutReshapeFunc(changeSize);

glutSpecialFunc(mySpecialKeyFunc);

glutKeyboardFunc(myKeyboardFunc);

glutMainLoop();

return 0;

}

计算机图形学第五次上机——真实感图形绘制(引入光照模型)太阳系动画实现相关推荐

  1. 计算机图形学第四次上机——鼠标回调图形界面交互实现

    计算机图形学第四次上机实验 课程实验报告 目录 计算机图形学第四次上机实验 课程实验报告 一.实验目的 二.实验环境 三.实验内容 3.1绘制曲线 3.2绘制曲面 3.3颜色 3.4鼠标回调 四.实验 ...

  2. 计算机图形学 实验7 《复杂图形绘制-Bezier曲线与Hermite曲线》

    计算机图形学 实验7 <复杂图形绘制-Bezier曲线与Hermite曲线> 一.实验目的 学习样条曲线的绘制. 二.实验内容 1.绘制Bezier曲线: 2.绘制Hermite曲线. 三 ...

  3. 计算机图形学 实验8 《复杂图形绘制-Bezier曲面及其纹理》

    计算机图形学 实验8 <复杂图形绘制-Bezier曲面及其纹理> 一.实验目的 学习样条曲面绘制技术. 二.实验内容 1.绘制Bezier曲面: 2.将纹理图像映射到曲面. 三.实验方法 ...

  4. 【计算机图形学】小白谈计算机图形学(五)

    小白谈计算机图形学(五)三维图形投影 三维图形投影 分类 平面几何投影 1-平行投影 1.1-正投影 1.1.1-三视图 1.1.2-正轴测投影 例题 1.2-斜投影 相关链接 超链接 三维图形投影 ...

  5. TIT 计算机图形学 实验三 使用重心坐标算法绘制颜色渐变的正六面体

    TIT 计算机图形学 实验三 使用重心坐标算法绘制颜色渐变的正六面体 前言 参考视频计算机图形学全套算法讲解和C++编码实现(共23讲配套源码),计算机图形学案例视频讲解以及主页相关算法.孔老师是我的 ...

  6. 计算机图形学第三次上机作业

    计算机图形学第三次上机作业 读取OBJ文件 仿照群中调用的代码 利用半边数据结构 画出上机作业2中一样的三角形 计算网格面法向 这里的面法向量储存在HE_face中的数据域 facevector中 计 ...

  7. 计算机图形学实验一(二维图形绘制)

    计算机图形学实验一(二维图形绘制) 一.实验内容 二.实验环境 三.问题分析 四.算法设计 五.源代码 六.程序运行结果 一.实验内容 (1)绘制金刚石图案 金刚石图案的成图规则是:把一个圆周等分成n ...

  8. 计算机图形学笔记五:光栅化(消隐算法)和 前几节内容总结

    消隐算法和前几节内容总结 1.消隐算法 1.1画家算法(Painter's Algorithm) 1.2 Z-Buffer算法 2.前几节内容总结 1.消隐算法 1.1画家算法(Painter's A ...

  9. 计算机图形学十五:基于物理的渲染(蒙特卡洛路径追踪)

    蒙特卡洛路径追踪 摘要 1 蒙特卡洛积分(Monte Carlo Integration) 2 蒙特卡洛路径追踪(Monte Carlo Path Tracing) Reference (本篇文章同步 ...

最新文章

  1. Why gdb crash if create too many threads ?
  2. python资源百度网盘-bypy-百度网盘Python客户端 linux
  3. 电赛推迟了,回家吗?
  4. php acl rbac,建站常用的用户权限管理模型ACL和RBAC的区别
  5. 状态机复合状态 怎么写代码_状态不属于代码
  6. android widget 发送广播,android-从应用程序向小部件发送数据
  7. 运动社交或将成为“反科技”先锋
  8. 利用python操作mrjob实例---wordcount
  9. 对mysql having 的理解
  10. DoG算子和LoG算子
  11. npm i --legacy-peer-deps
  12. C语言I博客作业02
  13. CSU——1043克里莫
  14. 为什么很多人打游戏感觉很快乐,然而学习工作中的满足感却很低
  15. 网页设计与制作项目教程HTML+CSS+JavaScript之项目一
  16. Thinkcmf - 微信公众号开发 -1
  17. 【Lighthouse教程】Win10远程连接同步代码
  18. Redis数据莫名其妙全部丢失
  19. 商业银行为什么要更换核心业务系统?
  20. JAVA的基本数据类型以及数值范围

热门文章

  1. 连接oracle时17002,Oracle Errorcode 17002
  2. 3ds格式(3ds ftk), 还没有采用lib3ds库
  3. MAC环境下Eclipse Android jni环境配置
  4. 阿斯利康、诺华、勃林格殷格翰、德国默克、索诺瓦、Cytiva、因美纳、梯瓦等公司新动态 | 跨国药企在中国...
  5. 自动交易股票软件的功能?
  6. php写字板代码,JS+HTML5 Canvas实现简单的写字板功能示例
  7. PDF转Word转换器哪个好用
  8. 基于MATLAB GUI汉字识别系统开发与优化
  9. 〝女人旺夫的秘密〞女人应该看 男人更应该看!
  10. 计算机专业英语第12章在线测试答案,英语专业胡壮麟版本的语言学复习题(1-12章)...