Opengl项目一
一、题目分析
利用OpenGL绘制一个简单的场景
– 包含球、正方形、网格数据
– 交互操作:平移、缩放、旋转
– 可以使用不同的灯光
? 项目1作业上交内容 项目作 交内容
– 代码
– 报告
? 简要介绍项目的开发情况
? 场景介绍,不同的场景要有不同的图支持
? 操作介绍,不同的操作要有操作后的图支持
? 灯光介绍,不同的灯光要有不同灯光下的图支持
对 GL的理解
二、场景介绍
开始:
开灯:
旋转:
移动:
放大:
缩小:
三、代码
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}
#include <windows.h>
#include <GL/glut.h>
float m_xRotation;
float m_yRotation;
float m_xTranslation;
float m_yTranslation;
float m_zTranslation;
float m_xScaling;
float m_yScaling;
float m_zScaling;
static int cpt1=45; //定义自转角度
static int cpt2=45; //定义公转的?度
BOOL bColorMaterial = FALSE;//颜色跟踪Á模式
void InitGeometry()
{
m_xRotation=0.0;//初始时不旋转也不平移除了沿轴也不缩放
m_yRotation=0.0;
m_xTranslation=3.0;
m_yTranslation=4.0;
m_zTranslation=-1.0;
m_xScaling=1.0;
m_yScaling=1.0;
m_zScaling=1.0;
}
void SetupRC(void)
{
//全局光照系数
GLfloat globel_ambient[] = { 0.1 , 0.1, 0.2 , 0.0 };
//打开全局光照?
glLightModelfv(GL_LIGHT_MODEL_AMBIENT , globel_ambient);
glEnable(GL_LIGHTING);
glEnable(GL_DEPTH_TEST);
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
}
void ChangeSize(GLsizei w, GLsizei h)
{
if(h == 0) h = 1;
glViewport(0, 0, w, 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)w/(GLfloat)h, 1.5*(GLfloat)w/(GLfloat)h, -1.5, 1.5, -10.0, 10.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluPerspective(60.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0);
// 重置坐标系统使投影变换复位?
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
//定义视景转换前3个参数表示视点的空间位置中间个参数表示参考点的空间位置最后
//个参数表示向上向量的方向
gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
}
void RenderScene(void)
{
float i;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//glLoadIdentity();
glPushMatrix();
glTranslatef(0.0,0.0,0.0);
glRotatef ((GLfloat) cpt1, -1.0, 1.0, 1.0); //ball自转轴的偏转角度
glutSolidSphere(0.6,40,40);
glPopMatrix();
glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
glRectf(-1.0,-1.0,1.0,1.0);//正方形
for(i=-100.0f;i<=100.0f;i=i+0.2f)
{
glBegin(GL_LINES);
glVertex2f(i,-100.0f);
glVertex2f(i,100.0f);
glEnd();
glBegin(GL_LINES);
glVertex2f(-100.0f,i);
glVertex2f(100.0f,i);
glEnd();
}
//开启双面光照?
glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
glutSwapBuffers(); // 刷新命令缓冲区
glFlush();
}
void display(int value)
{
switch (value)
{
case 1:{
GLfloat mat_ambient[]= { 0.2f, 0.2f, 0.2f, 1.0f };
GLfloat mat_diffuse[]= { 1.0f, 0.6f, 1.0f, 1.0f };
GLfloat mat_specular[] = { 0.8f, 1.0f, 1.0f, 1.0f };
GLfloat mat_shininess[] = { 50.0f };
GLfloat mat_emission[]={0.3f, 0.2f, 0.1f, 0.0f};
GLfloat light0_diffuse[]= { 0.8f, 0.1f, 0.4f, 1.0f};
GLfloat light0_position[] = { 1.0f, 0.8f, 0.5f, 0.0f };
GLfloat light0_ambient[]= { 0.2f, 0.2f, 0.2f, 1.0f };
GLfloat light0_specular[] = { 1.0f, 0.6f, 0.6f, 1.0f };
GLfloat light1_ambient[]= { 0.2f, 0.5f, 0.2f, 1.0f };
GLfloat light1_specular[] = { 1.0f, 0.6f, 0.6f, 1.0f };
GLfloat light1_diffuse[]= { 0.3f, 1.0f, 0.1f, 1.0f };
GLfloat light1_position[] = { -3.0f, -3.0f, 3.0f, 1.0f };
GLfloat spot_direction[]={ 1.0f, 1.0f, -2.0f};
//定义材质属性?
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS,mat_shininess);
glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);
//light0为漫反射的READ色点光源
glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_diffuse);
glLightfv(GL_LIGHT0, GL_POSITION,light0_position);
glLightfv(GL_LIGHT0, GL_AMBIENT, light0_ambient);
glLightfv(GL_LIGHT0, GL_SPECULAR,light0_specular);
//light1为BLUE聚光光源
glLightfv(GL_LIGHT1, GL_AMBIENT, light1_ambient);
glLightfv(GL_LIGHT1, GL_SPECULAR,light1_specular);
glLightfv(GL_LIGHT1, GL_DIFFUSE, light1_diffuse);
glLightfv(GL_LIGHT1, GL_POSITION,light1_position);
glLightf (GL_LIGHT1, GL_SPOT_CUTOFF, 30.0);
glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION,spot_direction);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHT1);
glEnable(GL_DEPTH_TEST);
break;}
//开灯
case 2:{
glEnable(GL_LIGHTING);
glDisable(GL_LIGHT0);
glDisable(GL_LIGHT1);
glEnable(GL_DEPTH_TEST);
break;}
//关灯
case 3:{
glTranslatef(2.0,1.0, 1.0);
break;
//移动
}
case 4:{
glScalef(2.0,2.0,2.0);
break;
}
//放大
case 5:{
glScalef(0.1,0.1,0.1);
break;
}
//缩小
}
}
void right_menu(int id)
{
switch(id)
{
case 1:
display(1);
break;
case 2:
display(2);
break;
case 3:
display(3);
break;
case 4:
display(4);
break;
case 5:
display(5);
break;
default:
break;
}
glutPostRedisplay();
}
void main(void)
{
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(600,400);
glutInitWindowPosition(300,300);
glutCreateWindow("opengl项目一");
glutDisplayFunc(RenderScene);
glutReshapeFunc(ChangeSize);
glutCreateMenu(right_menu);
glutAddMenuEntry("开灯",1);
glutAddMenuEntry("灯",2);
glutAddMenuEntry("移动",3);
glutAddMenuEntry("放大",4);
glutAddMenuEntry("缩小",5);
glutAttachMenu(GLUT_RIGHT_BUTTON);
SetupRC();
glutMainLoop();
}
四、对GL的理解
通过这段时间对OPENGL的学习,我发现虽然GL不需要太复杂的语言,不过想要真正学好它还是非常不容易的。
OpenGL(全写Open Graphics Library)是个定义了一个跨编程语言、跨平台的编程接口的规格,它用于三维图象(二维的亦可)。OpenGL是个专业的图形程序接口,是一个功能强大,调用方便的底层图形库。
贵州大学实验报告
学院:计算计科学与信息学院 专业: 班级:
贵州大学实验报告
学院:计算计科学与信息学院 专业:数字媒体技术 班级:数媒091
贵州大学实验报告
学院:计算计科学与信息学院 专业:数字媒体技术 班级:数媒091
计算机图形学基础实验6OpenGL中的变换一实验目的及要求1理解OpenGL中的各种变换的实现原理2掌握OpenGL中模型视图矩阵…
计算机图形学实验指导书计算机科学与信息工程学院目录实验一OpenGL程序设计3实验二二维基本图元的生成7实验三二维图元的填充13实…
Opengl项目一一题目分析利用OpenGL绘制一个简单的场景包含球正方形网格数据交互操作平移缩放旋转可以使用不同的灯光项目1作业…
本科实验报告课程名称:计算机图形学实验类型:上机实验项目名称:实现五边形的扫描转换算法学生姓名:**专业:软件工程学号:**指导老…
计算机图形学基础实验4OpenGL中基本图形的绘制一实验目的及要求1掌握OpenGL中点的绘制方法2掌握OpenGL中直线的绘制方…
贵州大学实验报告学院计算计科学与信息学院专业班级贵州大学实验报告学院计算计科学与信息学院专业数字媒体技术班级数媒091贵州大学实验…
计算机图形学基础实验6OpenGL中的变换一实验目的及要求1理解OpenGL中的各种变换的实现原理2掌握OpenGL中模型视图矩阵…
计算机图形学实验指导书计算机科学与信息工程学院目录实验一OpenGL程序设计3实验二二维基本图元的生成7实验三二维图元的填充13实…
本科实验报告课程名称:计算机图形学实验类型:上机实验项目名称:实现五边形的扫描转换算法学生姓名:**专业:软件工程学号:**指导老…