几何变换



#include "stdafx.h"
#include"gl/glut.h"//包含了OPENGL编程所需要的所有信息
#include"math.h"


GLfloat x,dx=0.1;
GLfloat pos[]={-2,4,5,1},
amb[]={0.8,0.8,0.8,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;
GLfloat r(double angle){//计算r得到角
return 1-cos(angle);
}

void display(void){//显示出做的图形


GLfloat d=-7.0;

GLfloat no_mat[]={0.0,0.0,0.0,1.0};
GLfloat no_mat1[]={0.5,0.7,0.2,0.0};
GLfloat no_mat2[]={0.5,0.0,0.3,0.2};
GLfloat mat_ambient[]={0.0,0.0,1.0,1.0};
GLfloat mat1_ambient[]={0.5,0.5,0.0,0.0};
GLfloat mat2_ambient[]={0.0,0.5,0.2,0.8};
GLfloat mat_diffuse[]={0.6,0.5,0.3,1.0};
GLfloat mat2_diffuse[]={0.0,0.4,0.9,0.2};
GLfloat mat1_diffuse[]={0.0,0.6,0.2,0.0};
GLfloat mat_specular[]={1.0,1.0,1.0,1.0};
GLfloat mat1_specular[]={0.0,0.5,0.8,1.0};
GLfloat mat2_specular[]={0.0,0.2,0.8,0.2};
GLfloat no_shininess[]={0.0};
GLfloat no_shininess1[]={0.5};
GLfloat no_shininess2[]={0.8};
GLfloat low_shininess[]={5.0};
GLfloat low_shininess1[]={10.0};
GLfloat high_shininess[]={100.0};
GLfloat high_shininess1[]={50.0};
GLfloat mat_emission[]={0.3,0.2,0.2,1.0};
GLfloat mat1_emission[]={1.0,0.0,0.5,0.3};
GLfloat mat2_emission[]={0.8,0.2,0.4,0.7};

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glPushMatrix();
glTranslatef(-1.8,1.5,d);

for(x=0;x<1;x=x+dx)
{
glMaterialfv(GL_FRONT,GL_AMBIENT,no_mat);//参数第一个指明对前面生效;第二个指定要改变的材料的特性的符号常数;第三个指向一个为该特性提供新值的GLfloat数组的指针。AMBIENT为环境光
glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);//漫反射光
glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);//镜面反射
glMaterialfv(GL_FRONT,GL_SHININESS,high_shininess);//镜面反射指数
glMaterialfv(GL_FRONT,GL_EMISSION,no_mat);//辐射光
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);//GL_POSITION设置光源位置
glPopMatrix();//将栈顶元素托出当前矩阵
}
double t,p=3.141593/180;//弧度制

glBegin(GL_POLYGON);//定义一个简单的凸多边形
for(int i=0;i<360;i=i+4){
t=i*p;
glVertex2f(r(t)*cos(t),r(t)*sin(t));
}
glEnd();
}
glPopMatrix();//出栈


glPushMatrix();//入栈
glTranslatef(2.5,1.5,d);//平移

for(x=0;x<1;x=x+dx)
{
glMaterialfv(GL_FRONT,GL_AMBIENT,no_mat1);//前面环境光
glMaterialfv(GL_FRONT,GL_DIFFUSE,mat1_diffuse);//前面漫反射光
glMaterialfv(GL_FRONT,GL_S

PECULAR,mat1_specular);//前面镜面光
glMaterialfv(GL_FRONT,GL_SHININESS,high_shininess1);
glMaterialfv(GL_FRONT,GL_EMISSION,no_mat1);//前面辐射光
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();//出栈
}
double t,p=3.141593/180;

glBegin(GL_POLYGON);//画凸多边形
for(int i=0;i<360;i=i+4){
t=i*p;
glVertex2f(r(t)*cos(t),r(t)*sin(t));
}
glEnd();
}
glPopMatrix();//出栈





glPushMatrix();入栈
glTranslatef(0.8,-1.5,d);//平移
for(x=0;x<1;x=x+dx)
{
glMaterialfv(GL_FRONT,GL_AMBIENT,no_mat2);//前面环境光
glMaterialfv(GL_FRONT,GL_DIFFUSE,mat2_diffuse);//前面漫反射光
glMaterialfv(GL_FRONT,GL_SPECULAR,mat2_specular);//前面镜面光
glMaterialfv(GL_FRONT,GL_SHININESS,high_shininess1);
glMaterialfv(GL_FRONT,GL_EMISSION,no_mat2);//前面辐射光
if(axis<3)glRotated(theta,axes[axis][0],axes[axis][1],axes[axis][2]);//绕哪个轴旋转
else{
glPushMatrix();//进栈
glRotated(theta,0,0,1);//旋转,theta为旋转角度
glLightfv(GL_LIGHT0,GL_POSITION,pos);
glPopMatrix();//出栈
}
double t,p=3.141593/180;

glBegin(GL_POLYGON);//画凸多边形
for(int i=0;i<360;i=i+4){
t=i*p;
glVertex2f(r(t)*cos(t),r(t)*sin(t));
}
glEnd();
}
glPopMatrix();//出栈







glutSwapBuffers();//交换缓冲区

}





void idle(void){//在主循环空闲时由OPENGL系统调用的回调函数
if(theta>=360)axis=(axis+1)%4;
theta=(theta<360)?theta+dt:dt;
glutPostRedisplay();//使系统在当前事件处理循环结束时调用用于显示的回调函数,指明重新执行作图函数


}





void myreshape(int w,int h){//回调函数,重新定义窗口与图像的映射关系
if(h==0)
h=1;
glViewport(0,0,(GLsizei)w,(GLsizei)h);
glMatrixMode(GL_PROJECTION);//此句和下句将投影矩阵设为系统当前矩阵,然后以单位矩阵对当前的矩阵进行初始化处理
glLoadIdentity();
gluPerspective(55.0,(GLfloat)w/(GLfloat)h,1.0,20.0);
glMatrixMode(GL_MODELVIEW);//OPENGL保持一个称为modelview的矩阵,用了进行建模变换与观察变换的合成变换矩阵,此句和下句为初始化
glLoadIdentity();
}





int main(int argc, char* argv[])
{
glutInit(&argc,argv);//初始化GLUT库,使系统识别GLUT库中的命令
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);//告诉GLUT库在创建窗口时使用的显示模式和颜色模型。GLUT_DOUBLE指定双缓冲显示模式;GLUT_DEPTH建立深度缓冲区
glutInitWindowSize(800,600);//设置应用程序窗口的大小,参数表示宽和高
glutInitWindowPosition(200,100);//设置应用程序窗口的位置,参数表示左上角的坐标

glutCreateWindow("GLUT Objects");//创建应用程序窗口,参数指定串口标题
glClearColor(1.0,1.0,1.0,1.0);
glEnable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);//将投影矩阵设为系统当前矩阵,然后以单位矩阵对当前的矩阵进行初始化处理
glLoadIdentity();
gluPerspective(1000,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);//OPENGL保持一个称为modelview的矩阵,用了进行建模变换与观察变换的合成变换矩阵,此句和下句为初始化
glLoadIdentity();
glTranslated(0,0,-5);//平移
glLightfv(GL_LIGHT0,GL_POSITION,pos);//第一个参数指定光源的符号常数;第二个是指定要改变的特性的符号常数;第三个是指向一个为该特性提供新值的GLfloat数组的指针

glEnable(GL_LIGHTING);//启动光照
glEnable(GL_LIGHT0);//每个光源都要在建立之后再经过启动才能在光照计算中,此处启动GL_LIGHT0




glutDisplayFunc(display);//通过调用用户程序绘制图形
glutIdleFunc(idle);//向系统注册用于空闲的回调函数


glutReshapeFunc(myreshape);//回调函数在进入事件处理循环之前需调用此句来向系统注册

glutMainLoop();//只能放在main函数的最后,所有已经建立的窗口将在此时显示,对创建窗口的绘制开始生效,事件处理开始启动
return 0;
}


相关主题
相关文档
最新文档