#include <gl/glut.h>
#include <gl/glaux.h>
void Initial(void)
{
glClearColor(1.0,1.0,1.0,1.0);
glClear(GL_COLOR_BUFFER_BIT);
glShadeModel(GL_SMOOTH);
}
void Palette(void)
{
GLint i;
static GLfloat rgb[8][3]={{1,0,0},{1,0,0.5},{1,0,1},{0,0,1},{0,1,1},{0,1,0},{1,1,0},{1,0.5,0}};
for(i=0;i<8;i++)
auxSetOneColor(i+1,rgb[i][0],rgb[i][1],rgb[i][2]);//auxSetOneColor()有四个参数。它使第一个参数代表的索引值和后三个参数代表的RGB颜色对相关联
}
void DrawColorFans(void)
{
GLint i;
glTranslatef(-15,-15,0);
for(i=0;i<8;i++)
{
glIndexd(i+1);//设置当前颜色索引
glTranslatef(i,i-1,0);//移动坐标原点。对应的3个参数对应着3个坐标轴
glutSolidSphere(1,20,20);//第一个参数为半径;第二个参数为环绕Z轴的剖分数,即纬度方向;第三个参数为沿着Z轴的剖分数,即经度方向。
}
}
void CALLBACK myDisplay(void)
{
Palette();
DrawColorFans();
glFlush();
}
void CALLBACK myReshape(GLsizei w,GLsizei h)
{
glViewport(0,0,w,h);//void glViewport(GLint x,GLint y,GLsizei width,GLsizei height); x,y
//指定视口矩形左下角,以像素为单位。默认值为(0,0);
//width height 分别指定宽度和高度。根据窗口的实时变化重绘窗口
glMatrixMode(GL_PROJECTION);
glLoadIdentity();//通常需要先调用glLoadidentity来把当前矩阵单位化,从而使各种变换效果不会叠加
gluPerspective(100,1,1,20);/*void gluPerspective(GLdouble fovy, //角度
GLdouble aspect,//视景体的宽高比
GLdouble zNear,//沿z轴方向的两裁面之间的距离的近处
GLdouble zFar //沿z轴方向的两裁面之间的距离的远处)*/
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0,0,-15);
}
void main()
{
auxInitDisplayMode(AUX_SINGLE|AUX_INDEX);
auxInitPosition(100,100,500,500);
auxInitWindow("Draw the color sphere");
Initial();
auxReshapeFunc(myReshape);//当窗口被调整大小、移动或者打开时,函数会被调用,即新的宽的值和高的值,通常*function指向的函数
//会调用glViewport(),显示裁减后的新尺寸,然后重定义投影矩阵,以便投影后图像的比例与视点匹配,避免比例失调
auxMainLoop(myDisplay);
}
颜色索引画小球
最新推荐文章于 2022-03-23 08:50:04 发布