程序一太阳、月亮和地球
#include "stdafx.h"
#include
#include
GLfloat whiteLight[] = { 0.2f, 0.2f, 0.2f, 1.0f };
GLfloat sourceLight[] = { 0.8f, 0.8f, 0.8f, 1.0f };
GLfloat lightPos[] = { 0.0f, 0.0f, 0.0f, 1.0f };
void RenderScene(void)
{
static float fMoonRot = 0.0f;
static float fEarthRot = 0.0f;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glTranslatef(0.0f, 0.0f, -300.0f);
glDisable(GL_LIGHTING);
glColor3ub(255, 255, 0);
glutSolidSphere(15.0f, 30, 17);
glEnable(GL_LIGHTING);
glLightfv(GL_LIGHT0,GL_POSITION,lightPos);
glRotatef(fEarthRot, 0.0f, 1.0f, 0.0f);
glColor3ub(0,0,255);
glTranslatef(105.0f,0.0f,0.0f);
glutSolidSphere(15.0f, 30, 17);
glColor3ub(200,200,200);
glRotatef(fMoonRot,0.0f, 1.0f, 0.0f);
glTranslatef(30.0f, 0.0f, 0.0f);
fMoonRot+= 15.0f;
if(fMoonRot > 360.0f)
fMoonRot = 0.0f;
glutSolidSphere(6.0f, 30, 17);
glPopMatrix();
fEarthRot += 5.0f;
if(fEarthRot > 360.0f)
fEarthRot = 0.0f;
glutSwapBuffers();
}
// This function does any needed initialization on the rendering
// context.
void SetupRC()
{
// Light values and coordinates
glEnable(GL_DEPTH_TEST); // Hidden surface removal
glFrontFace(GL_CCW); // Counter clock-wise polygons face out glEnable(GL_CULL_FACE); // Do not calculate inside of jet
// Enable lighting
glEnable(GL_LIGHTING);
// Setup and enable light 0
glLightModelfv(GL_LIGHT_MODEL_AMBIENT,whiteLight);
glLightfv(GL_LIGHT0,GL_DIFFUSE,sourceLight);
glLightfv(GL_LIGHT0,GL_POSITION,lightPos);
glEnable(GL_LIGHT0);
// Enable color tracking
glEnable(GL_COLOR_MA TERIAL);
// Set Material properties to follow glColor values
glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
// Black blue background
glClearColor(0.0f, 0.0f, 0.0f, 1.0f );
}
void TimerFunc(int value)
{
glutPostRedisplay();
glutTimerFunc(100, TimerFunc, 1);
}
void ChangeSize(int w, int h)
{
GLfloat fAspect;
// Prevent a divide by zero
if(h == 0)
h = 1;
// Set Viewport to window dimensions
glViewport(0, 0, w, h);
// Calculate aspect ratio of the window
fAspect = (GLfloat)w/(GLfloat)h;
// Set the perspective coordinate system
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
// field of view of 45 degrees, near and far planes 1.0 and 425
gluPerspective(45.0f, fAspect, 1.0, 425.0);
// Modelview matrix reset
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(800, 600);
glutCreateWindow("Earth/Moon/Sun System");
glutReshapeFunc(ChangeSize);
glutDisplayFunc(RenderScene);
glutTimerFunc(250, TimerFunc, 1);
SetupRC();
glutMainLoop();
return 0;
}
程序二旋转的圆环
#include "stdafx.h"
#include
#include
GLfloat pos[]={-2,4,5,1};
GLfloat amb[]={0.3,0.3,0.3,1.0};
GLfloat front_amb_diff[]={0.7,0.5,0.1,1.0};
GLfloat back_amb_diff[]={0.4,0.7,0.1,1.0};
GLfloat spe[]={0.25,0.25,0.25,1.0};
GLfloat theta=0,dt=0.5,axes[3][3]={{1,0,0},{0,1,0},{0,0,1}};
int axis=0;
void display(void) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
if(axis<3) glRotated(theta,axes[axis][0],axes[axis][1],axes[axis][2]);
else {
glPushMatrix();
glRotated(theta,0,0,1);
glLightfv(GL_LIGHT0,GL_POSITION,pos);
glPopMatrix();
}
glutSolidTorus(0.4,1.0,48,96);
glPopMatrix();
glutSwapBuffers();
}
void idle(void) {
if(theta>=360) axis=(axis+1) % 4;
theta=(theta<360) ? theta+dt : dt;
glutPostRedisplay();
}
int main(int argc, char* argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(600,600);
glutInitWindowPosition(200,100);
glutCreateWindow("GLUT objects");
glClearColor(0.0,0.0,0.0,0.0);
glEnable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45,1.0,2,8);
glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,front_amb_diff);
glMaterialfv(GL_BACK,GL_AMBIENT_AND_DIFFUSE,back_amb_diff);
glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,spe);
glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,75);
glLightfv(GL_LIGHT0,GL_AMBIENT,amb);
glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslated(0,0,-5);
glLightfv(GL_LIGHT0,GL_POSITION,pos);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glutDisplayFunc(display);
glutIdleFunc(idle);
glutMainLoop();
return 0; }
实验名称OpenGL 中真实感图形的显示实现 一、实验目的 学习基于OpenGL真实感图形显示的原理与实现方法。 二、实验内容 利用向导生成应用程序框架,参考示例编写实现三维图形的应用程序,增加光照与材质效果实现真实感图形的显示。 三、实验步骤 1.利用向导生成应用程序框架。 2.添加相应的函数,绘制立方体(参照上课给的实例)。 3.添加相应的函数,实现三维球体的绘制。 4.增加光源,并设置光源参数与材质参数,观察显示效果。 实验代码及程序运行结果截图如下: // 2008cube.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "gl/glut.h" #include "math.h" void myinit() { glClearColor( 1.0, 1.0, 1.0, 0.0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-1.5, 1.5, -1.5, 1.5,-1.5,1.5); } void draw_cube() { glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0,0.0,0.0); glBegin(GL_POL YGON); glVertex3f(0.0,0.0,0.0); glVertex3f(0.0,1.0,0.0); glVertex3f(1.0,1.0,0.0); glVertex3f(1.0,0.0,0.0); glEnd(); glColor3f(0.0,1.0,0.0);
实验四真实感图形的生成 一、实验内容 ?创建一个简单场景 ?场景中有一个复杂的三维几何体 ?通过一系列处理使得场景和几何体具有真实感 ?可以通过变换视点观察场景 二、程序结构 创建Win32 Console Application,使用OpenGL的控制台应用程序框架。其中: ?init()函数进行场景初始化工作; ?reshape(GLsizei width, GLsizei height)函数设置窗口的视口大小,同时设置透视深度和透视角度等参数; ?display()函数构建坐标系并通过调用具体的绘制图形函数来绘制具体场景和几何图形; ?LoadBMP()函数导入纹理位图文件; ?LoadTexture()函数加载纹理到内存空间中; ?generateShadow(GLfloat shadow[4][4], const GLfloat ground[4], const GLfloat light[4])函数来计算空间中物体上任意一点的平面阴影 投射矩阵 ?keyboard(unsigned char key, int x, int y)函数处理键盘按键消息; ?mouseButton(int button, int state, int x, int y)函数处理鼠标按键消息; 最后由主函数main(int argc, char** argv)中调用OpenGL函数来显示窗口,并进行绘图和处理事件消息函数。 三、代码说明 1.加载位图纹理 首先,编写LoadBMP()函数导入位图文件,代码截图如下: 然后,编写LoadEarthTexture()函数加载导入的位图并设置相关参数,代码