计算机图形学第五次上机——真实感图形绘制(引入光照模型)太阳系动画实现
计算机图形学 课程实验报告
实验名称 真实感图形绘制
一、实验目的
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;
}
计算机图形学第五次上机——真实感图形绘制(引入光照模型)太阳系动画实现相关推荐
- 计算机图形学第四次上机——鼠标回调图形界面交互实现
计算机图形学第四次上机实验 课程实验报告 目录 计算机图形学第四次上机实验 课程实验报告 一.实验目的 二.实验环境 三.实验内容 3.1绘制曲线 3.2绘制曲面 3.3颜色 3.4鼠标回调 四.实验 ...
- 计算机图形学 实验7 《复杂图形绘制-Bezier曲线与Hermite曲线》
计算机图形学 实验7 <复杂图形绘制-Bezier曲线与Hermite曲线> 一.实验目的 学习样条曲线的绘制. 二.实验内容 1.绘制Bezier曲线: 2.绘制Hermite曲线. 三 ...
- 计算机图形学 实验8 《复杂图形绘制-Bezier曲面及其纹理》
计算机图形学 实验8 <复杂图形绘制-Bezier曲面及其纹理> 一.实验目的 学习样条曲面绘制技术. 二.实验内容 1.绘制Bezier曲面: 2.将纹理图像映射到曲面. 三.实验方法 ...
- 【计算机图形学】小白谈计算机图形学(五)
小白谈计算机图形学(五)三维图形投影 三维图形投影 分类 平面几何投影 1-平行投影 1.1-正投影 1.1.1-三视图 1.1.2-正轴测投影 例题 1.2-斜投影 相关链接 超链接 三维图形投影 ...
- TIT 计算机图形学 实验三 使用重心坐标算法绘制颜色渐变的正六面体
TIT 计算机图形学 实验三 使用重心坐标算法绘制颜色渐变的正六面体 前言 参考视频计算机图形学全套算法讲解和C++编码实现(共23讲配套源码),计算机图形学案例视频讲解以及主页相关算法.孔老师是我的 ...
- 计算机图形学第三次上机作业
计算机图形学第三次上机作业 读取OBJ文件 仿照群中调用的代码 利用半边数据结构 画出上机作业2中一样的三角形 计算网格面法向 这里的面法向量储存在HE_face中的数据域 facevector中 计 ...
- 计算机图形学实验一(二维图形绘制)
计算机图形学实验一(二维图形绘制) 一.实验内容 二.实验环境 三.问题分析 四.算法设计 五.源代码 六.程序运行结果 一.实验内容 (1)绘制金刚石图案 金刚石图案的成图规则是:把一个圆周等分成n ...
- 计算机图形学笔记五:光栅化(消隐算法)和 前几节内容总结
消隐算法和前几节内容总结 1.消隐算法 1.1画家算法(Painter's Algorithm) 1.2 Z-Buffer算法 2.前几节内容总结 1.消隐算法 1.1画家算法(Painter's A ...
- 计算机图形学十五:基于物理的渲染(蒙特卡洛路径追踪)
蒙特卡洛路径追踪 摘要 1 蒙特卡洛积分(Monte Carlo Integration) 2 蒙特卡洛路径追踪(Monte Carlo Path Tracing) Reference (本篇文章同步 ...
最新文章
- Why gdb crash if create too many threads ?
- python资源百度网盘-bypy-百度网盘Python客户端 linux
- 电赛推迟了,回家吗?
- php acl rbac,建站常用的用户权限管理模型ACL和RBAC的区别
- 状态机复合状态 怎么写代码_状态不属于代码
- android widget 发送广播,android-从应用程序向小部件发送数据
- 运动社交或将成为“反科技”先锋
- 利用python操作mrjob实例---wordcount
- 对mysql having 的理解
- DoG算子和LoG算子
- npm i --legacy-peer-deps
- C语言I博客作业02
- CSU——1043克里莫
- 为什么很多人打游戏感觉很快乐,然而学习工作中的满足感却很低
- 网页设计与制作项目教程HTML+CSS+JavaScript之项目一
- Thinkcmf - 微信公众号开发 -1
- 【Lighthouse教程】Win10远程连接同步代码
- Redis数据莫名其妙全部丢失
- 商业银行为什么要更换核心业务系统?
- JAVA的基本数据类型以及数值范围
热门文章
- 连接oracle时17002,Oracle Errorcode 17002
- 3ds格式(3ds ftk), 还没有采用lib3ds库
- MAC环境下Eclipse Android jni环境配置
- 阿斯利康、诺华、勃林格殷格翰、德国默克、索诺瓦、Cytiva、因美纳、梯瓦等公司新动态 | 跨国药企在中国...
- 自动交易股票软件的功能?
- php写字板代码,JS+HTML5 Canvas实现简单的写字板功能示例
- PDF转Word转换器哪个好用
- 基于MATLAB GUI汉字识别系统开发与优化
- 〝女人旺夫的秘密〞女人应该看 男人更应该看!
- 计算机专业英语第12章在线测试答案,英语专业胡壮麟版本的语言学复习题(1-12章)...