目的:
1、理解光照模型,特别是phong简单光照模型原理,会用OpenGL绘制具有明暗效果的简单三维图形;
2、了解简单的交互式技术,用户可以简单控制图形。
要求:
使用OpenGL绘制一个简单的三维图形,例如立方体,球;2.为该图形添加光照,使其具有明暗效果;
3.添加鼠标消息函数,用户可以通过鼠标浏览该三维图形;
1.高性能微机;
2.有基本的图形I/O设备;
3.有相应的配套软件,可视化程序设计环境;
实验内容:
用OpenGL绘制一个简单的三维图形球,并且使用phong光照模型模拟物体表面对光的反射作用。
实验步骤:
1.算法、原理清晰,有详细的设计步骤;
2.依据算法、步骤或程序流程图,用C++语言编写源程序;
3.编辑源程序并进行调试;
4.进行运行测试,并结合情况进行调整;
5.对运行结果进行保存与分析;
6.打印源程序或把源程序以文件的形式提交;
7.按格式书写实验报告。
#include "windows.h"
#include <gl/glut.h>
#define SCREEN_WIDTH 480
#define SCREEN_HEIGHT 480
static int spin = 0;
void init(void)
{
GLfloat mat_specular[] = {0.0, 1.0, 1.0, 1.0};
GLfloat mat_shininess[] = {50.0};
GLfloat light_position[] = {7.0, 7.0, 1.0, 0.0};
GLfloat light_ambient[] = {5.0, 0.0, 5.0, 0.0};
GLfloat white_light[] = {1.0, 1.0, 1.0, 1.0};
GLfloat lmodel_ambient[] = {0.5, 0.5, 0.5, 5.0};
glClearColor(0.0, 0.0, 0.0, 0.0);
glShadeModel(GL_SMOOTH);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, white_light);
glLightfv(GL_LIGHT0, GL_SPECULAR, white_light);
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_DEPTH_TEST);
}
void display(void)
{
GLfloat light_position[] = {1.0, 1.0, 1.0, 0.0};
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
glPushMatrix();
glRotatef(spin, 1.0, 0.0, 0.0);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glTranslatef(0.0, 0.0, 1.5);
glDisable(GL_LIGHTING);
glEnable(GL_LIGHTING);
glPopMatrix();
glBegin(GL_QUADS);
glColor3f(1.0, 0.0, 0.0);
glVertex3f(-0.5, -0.5, 0.5);
glVertex3f(0.5, -0.5, 0.5);
glVertex3f(0.5, 0.5, 0.5);
glVertex3f(-0.5, 0.5, 0.5);
glColor3f(0.0, 1.0, 0.0);
glVertex3f(-0.5, -0.5, -0.5);
glVertex3f(0.5, -0.5, -0.5);
glVertex3f(0.5, 0.5, -0.5);
glVertex3f(-0.5, 0.5, -0.5);
glColor3f(0.0, 0.0, 1.0);
glVertex3f(-0.5, -0.5, 0.5);
glVertex3f(-0.5, 0.5, 0.5);
glVertex3f(-0.5, 0.5, -0.5);
glVertex3f(-0.5, -0.5, -0.5);
glColor3f(1.0, 1.0, 0.0);
glVertex3f(0.5, -0.5, 0.5);
glVertex3f(0.5, 0.5, 0.5);
glVertex3f(0.5, 0.5, -0.5);
glVertex3f(0.5, -0.5, -0.5);
glColor3f(1.0, 0.0, 1.0);
glVertex3f(-0.5, 0.5, 0.5);
glVertex3f(0.5, 0.5, 0.5);
glVertex3f(0.5, 0.5, -0.5);
glVertex3f(-0.5, 0.5, -0.5);
glColor3f(0.0, 1.0, 1.0);
glVertex3f(-0.5, -0.5, 0.5);
glVertex3f(0.5, -0.5, 0.5);
glVertex3f(0.5, -0.5, -0.5);
glVertex3f(-0.5, -0.5, -0.5);
glEnd();
glPopMatrix();
glFlush();
}
void mouse(int button, int state, int x, int y)
{
switch (button)
{
case GLUT_LEFT_BUTTON:
if (state == GLUT_DOWN)
{
spin = (spin + 10) % 360;
glutPostRedisplay();
}
break;
case GLUT_RIGHT_BUTTON:
if (state == GLUT_DOWN)
{
spin = (spin - 10) % 360;
glutPostRedisplay();
}
break;
default:
break;
}
}
void reshape(int w, int h)
{
glViewport(0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (w < h)
{
glOrtho(-1.5, 1.5, -1.5 * (GLfloat) h / (GLfloat) w,
1.5 * (GLfloat)h / (GLfloat)w, -10.0, 10.0);
}
else
{
glOrtho(-1.5 * (GLfloat) h / (GLfloat) w,
1.5 * (GLfloat) h / (GLfloat) w,
-1.5, 1.5, -10.0, 10.0);
}
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE|GLUT_DEPTH);
glutInitWindowSize(SCREEN_WIDTH, SCREEN_HEIGHT);
glutInitWindowPosition(50, 100);
glutCreateWindow("立方体");
init();
glutDisplayFunc(&display);
glutReshapeFunc(&reshape);
glutMouseFunc(&mouse);
glutMainLoop();
return 0;
}
相关知识
技术实现模型
计算机经典书籍电子书合集(适合计算机学生学习以及程序员笔试、面试)
OpenGL 画荷花
虚拟植物范文6篇(全文)
基于Perlin噪声的花卉仿真算法研究
大学计算机实验报告范文
计算机最早的设计师应用于,计算机辅助园林设计的应用与优缺点
计算机辅助园林设计考试题,计算机辅助园林设计的应用与优缺点
树木花卉形态建模研究
计算机辅助园林规划设计
网址: 计算机图形学 Phong光照模型实验(OpenGL的基本使用) https://m.huajiangbk.com/newsview620907.html
上一篇: 若关于x的方程 |
下一篇: 打造绿色家园,家庭养花记录表,科 |