《计算机图形学》实验 5

一、实验目的:

1) 理解光照模型; 2) 生成带光照模型的图形

二、实验内容
共有三道题目。请根据给定的实验结果样例,结合参考程序设计程序,实现样例的显示效果,把程序代码和实验截图拷贝到实验报告中。
题目 1:
设计程序实现点光源移动时,球体的观察效果.

效果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码:

#include <gl/glut.h>
void init(void)
{
//光照参数初始化全位于此处
//材质反光性设置
GLfloat mat_specular [] = {1.0,1.0,1.0,1.0}; //镜面反射参数
GLfloat mat_shininess [] = {100.0}; //高光指数

//GLfloat light_position [] = {0.0,5.0,0.0,1.0};  //点光源位置        Y 轴正向照射的光源效果图
//GLfloat light_position [] = {0.0,-5.0,0.0,1.0}; //点光源位置         Y 轴负向照射的光源效果图
//GLfloat light_position [] = {5.0,0,0,1.0};      //点光源位置       X 轴正向照射的光源效果图
//GLfloat light_position [] = {-5.0,0,0,1.0};     //点光源位置       X 轴负向照射的光源效果图
//GLfloat light_position [] = {0.0,0.0,5.0,1.0};  //点光源位置        Z 轴正向照射的光源效果图
//GLfloat light_position [] = {0.0,0.0,-5.0,1.0}; //点光源位置         Z 轴负向照射的光源效果图
GLfloat light_position [] = {5.0,5.0,-5.0,-1.0}; //点光源位置

//GLfloat light_position [] = {0.0,0.0,50.0,0.0}; //无限远模拟平行光
GLfloat white_light [] = {1.0,1.0,1.0,1.0}; //设置光源颜色
GLfloat model_ambient [] = {0.1,0.1,0.1,1.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_DIFFUSE,white_light); //定义散射光为白色
glLightfv(GL_LIGHT0,GL_SPECULAR,white_light); //定义镜面光为白色
glLightModelfv(GL_LIGHT_MODEL_AMBIENT,model_ambient); //光照模型参数:全局环境光
glEnable(GL_LIGHTING); //打开光源
glEnable(GL_LIGHT0); //启动 0 号光源
glEnable(GL_DEPTH_TEST); //打开深度测试
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glutSolidSphere(1.0,300,16); //定义球体法向量
glFlush();
}
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,1.5,-1.5*(GLfloat)w/(GLfloat)h, 1.5*(GLfloat)w/(GLfloat)h,-10.0,10.0);
//设置模型参数--几何体参数
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
int main(int argc, char** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH);
glutInitWindowPosition(200,200);
glutInitWindowSize(400,400);

//glutCreateWindow("Y 轴正向照射的光源效果图  ");
//glutCreateWindow("Y 轴负向照射的光源效果图  ");
//glutCreateWindow("X 轴正向照射的光源效果图  ");
//glutCreateWindow("X 轴负向照射的光源效果图  ");
//glutCreateWindow("Z 轴正向照射的光源效果图  ");
//glutCreateWindow("Z 轴负向照射的光源效果图  ");
glutCreateWindow("其他任意角度光源效果图  ");

init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMainLoop();
return 0;
}

题目 2:
设计程序在三维空间绘制立方体。
1) 生成一个双光源和三光源照射的球体
效果:
在这里插入图片描述

代码:


#include <windows.h>
#include <GL/glut.h>
#include <math.h>
#pragma comment(linker,"/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
#define PI 3.1416
float r[17]={0,0.1,0.2,0.3,0.4,1,0.7,1,0.4,0.6,0,1};
float g[17]={1,0,0.5,1,0.5,0.6,0.7,0.3,1,0.6,0.2,0,1,0};
float b[17]={0.3,0.8,0.9,1,0,0,0,1,0.4,0.6,1,0.2,1,0.5,1};
GLint color[9]={1,2,3,0,2,3,1,2,3};
float n=30.0;
float n2=-30.0;
GLfloat xRot = 0;
GLfloat yRot = 0;
GLfloat zRot = 0;

void SpecialKeys(int key, int x, int y)
{
 if (key == GLUT_KEY_UP)
 xRot -= 5.0f;
 if (key == GLUT_KEY_DOWN)
 xRot += 5.0f;
 if (key == GLUT_KEY_LEFT)
 yRot -= 5.0f;
 if (key == GLUT_KEY_RIGHT)
 yRot += 5.0f;
 if (key> 356.0f)
 xRot = 0.0f;
 if (key< -1.0f)
 xRot = 355.0f;
 if (key> 356.0f)
 yRot = 0.0f;
 if (key< -1.0f)
 yRot = 355.0f;
 if (key==GLUT_KEY_F1) //绕着 z 轴旋转
 zRot+= 5.0f;
 // 使用新的坐标重新绘制场景
 glutPostRedisplay();
}

void init(void) {

    // 存储坐标和角度
    GLfloat x, y, z, angle,x1,y1;
    //光照参数初始化全位于此处
    GLfloat mat_specular [] = {1.0,1.0,1.0,1.0}; //镜面反射参数
    GLfloat mat_shininess [] = {100.0}; //高光指数

    GLfloat white_light [] = {0.9,0.9,0.9,1.0}; //设置光源颜色
    GLfloat red_light [] = {0.8,0.2,0.0,1.0}; //设置光源颜色
    GLfloat green_light [] = {0,0.8,0.2,1.0}; //设置光源颜色

	GLfloat light_position [] = {5.0,5.0,5.0,1.0}; //点光源位置
    GLfloat light_position1 [] = {-5.0,-5.0,5.0,1.0}; //点光源位置
    GLfloat light_position2 [] = {5.0,-5.0,5.0,1.0}; //点光源位置

    GLfloat model_ambient [] = {0.1,0.1,0.1,1.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); //使用光泽度

    glMaterialfv(GL_FRONT,GL_COLOR_INDEXES,mat_specular); 

    //灯光设置
    glLightfv(GL_LIGHT0,GL_POSITION,light_position1); //定义光源的位置
    glLightfv(GL_LIGHT0,GL_DIFFUSE,white_light); //定义散射光为白色
    glLightfv(GL_LIGHT0,GL_SPECULAR,white_light); //定义镜面光为白色

    //第二个光源
    glLightfv(GL_LIGHT1,GL_POSITION,light_position2); //定义光源的位置
    glLightfv(GL_LIGHT1,GL_DIFFUSE,red_light); //定义散射光为红色
    glLightfv(GL_LIGHT1,GL_SPECULAR,red_light); //定义镜面光为红色

    //第三个光源
    glLightfv(GL_LIGHT2,GL_POSITION,light_position); //定义光源的位置
    glLightfv(GL_LIGHT2,GL_DIFFUSE,green_light); //定义散射光为绿色
    glLightfv(GL_LIGHT2,GL_SPECULAR,green_light); //定义镜面光为绿色

    glLightModelfv(GL_LIGHT_MODEL_AMBIENT,model_ambient); //光照模型参数:全局环境光
    glEnable(GL_LIGHTING); //打开光源
    glEnable(GL_LIGHT0); //启动 0 号光源
    glEnable(GL_LIGHT1); //启动 1 号光源
    glEnable(GL_LIGHT2); //启动 2 号光源
    glEnable(GL_DEPTH_TEST); //打开深度测试


     // 保存矩阵状态并旋转
    glPushMatrix();
    glRotatef(xRot, 1.0f, 0.0f, 0.0f);
    glRotatef(yRot, 0.0f, 1.0f, 0.0f);
    glRotatef(zRot, 0.0f, 0.0f, 1.0f);
}
void display(void) {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glutSolidSphere(1.0,300,16); //定义球体法向量
    glFlush();
}
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,1.5,-1.5*(GLfloat)w/(GLfloat)h, 1.5*(GLfloat)w/(GLfloat)h,-10.0,10.0);
    //设置模型参数--几何体参数
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}
int main(int argc, char** argv) {
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH);
    glutInitWindowPosition(200,200);
    glutInitWindowSize(400,400);
    //glutCreateWindow("双光源(白光+红光)");
	//glutCreateWindow("三光源(白光+红光+绿光)");
	//glutCreateWindow("三光源(白光+红光+绿光、没有镜面光系数)");
	glutCreateWindow("三光源(白光+红光+绿光+ GL_COLOR_INDEXES)");
    init();
    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutSpecialFunc(SpecialKeys);
    glutMainLoop();
    return 0;
}

题目 3:
设计程序在生成一个立方体,设置三个点光源,实现立方体的动态观察。
示例 1:在每个点上都设置了法向量
效果:
在这里插入图片描述
示例 2:每个面只在一个点上设置了法向量
效果:
在这里插入图片描述
(代码只需改个别地方,即可实现两种效果)
代码:

#include <windows.h>
#include <GL/glut.h>
#include <math.h>
#pragma comment(linker,"/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
#define PI 3.1416
float r[17]={1,0,1,0,1,0};
float g[17]={1,0,0,1,0,1};
float b[17]={0,1,1,0,0,1};
GLint color[9]={1,2,3,0,2,3,1,2,3};
float n=30.0;
float n2=-30.0;
static GLfloat direction[][3] = {
    -0.5f, -0.5f, -0.5f,
     0.5f, -0.5f, -0.5f,
    -0.5f,  0.5f, -0.5f,
     0.5f,  0.5f, -0.5f,
    -0.5f, -0.5f,  0.5f,
     0.5f, -0.5f,  0.5f,
    -0.5f,  0.5f,  0.5f,
     0.5f,  0.5f,  0.5f,
};
static const GLint index[][4] = {
    0, 2, 3, 1,
    0, 4, 6, 2,
    0, 1, 5, 4,
    4, 5, 7, 6,
    1, 3, 7, 5,
    2, 6, 7, 3,
};

GLfloat xRot = 0;
GLfloat yRot = 0;
GLfloat zRot = 0;

//光照参数初始化全位于此处
GLfloat mat_specular [] = {1.0,1.0,1.0,1.0}; //镜面反射参数
GLfloat mat_shininess [] = {100.0}; //高光指数

GLfloat light_position [] = {5.0,5.0,5.0,1.0}; //点光源位置
GLfloat light_position1 [] = {-5.0,-5.0,5.0,1.0}; //点光源位置
GLfloat light_position2 [] = {5.0,-5.0,5.0,1.0}; //点光源位置

GLfloat white_light [] = {0.0,0.0,1.0,1.0}; //设置光源颜色
GLfloat red_light [] = {1.0,0.0,0.0,1.0}; //设置光源颜色
GLfloat green_light [] = {0,1.0,0.0,1.0}; //设置光源颜色

GLfloat model_ambient [] = {0.1,0.1,0.1,1.0}; //环境光参数
    
int i,j;
void Init(void)
{
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    glColor3f(1.0f, 1.0f, 0.0f);
	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_DIFFUSE,white_light); //定义散射光为蓝色
    glLightfv(GL_LIGHT0,GL_SPECULAR,white_light); //定义镜面光为蓝色

    glLightfv(GL_LIGHT1,GL_POSITION,light_position1); //定义光源的位置
    glLightfv(GL_LIGHT1,GL_DIFFUSE,red_light); //定义散射光为红色
    glLightfv(GL_LIGHT1,GL_SPECULAR,red_light); //定义镜面光为红色

    glLightfv(GL_LIGHT2,GL_POSITION,light_position2); //定义光源的位置
    glLightfv(GL_LIGHT2,GL_DIFFUSE,green_light); //定义散射光为绿色
    glLightfv(GL_LIGHT2,GL_SPECULAR,green_light); //定义镜面光为绿色

    glLightModelfv(GL_LIGHT_MODEL_AMBIENT,model_ambient); //光照模型参数:全局环境光
    glEnable(GL_LIGHTING); //打开光源
    glEnable(GL_LIGHT0); //启动 0 号光源
    glEnable(GL_LIGHT1); //启动 1 号光源
	glEnable(GL_LIGHT2); //启动 2 号光源
    glEnable(GL_DEPTH_TEST); //打开深度测试

    // 把顺时针环绕的多边形设为正面,这与默认是相反的,因为我们使用的是三角形扇
    glFrontFace(GL_CW);
    glOrtho(-1.0f,1.0f,-1.0f,1.0f,-1.0f,1.0f);
}
void SpecialKeys(int key, int x, int y)
{
 if (key == GLUT_KEY_UP)
 xRot -= 5.0f;
 if (key == GLUT_KEY_DOWN)
 xRot += 5.0f;
 if (key == GLUT_KEY_LEFT)
 yRot -= 5.0f;
 if (key == GLUT_KEY_RIGHT)
 yRot += 5.0f;
 if (key> 356.0f)
 xRot = 0.0f;
 if (key< -1.0f)
 xRot = 355.0f;
 if (key> 356.0f)
 yRot = 0.0f;
 if (key< -1.0f)
 yRot = 355.0f;
 if (key==GLUT_KEY_F1) //绕着 z 轴旋转
 zRot+= 5.0f;
 // 使用新的坐标重新绘制场景
 glutPostRedisplay();
}
void RenderScene()
{
 // 存储坐标和角度
 GLfloat x, y, z, angle,x1,y1;
 // 用于三角形颜色的交替设置
 int iPivot = 1;
 // 用默认颜色设置背景色,并清除深度缓冲区(必须的,因为 3D 空间有视景深度)
 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
 //打开剔除功能(背面剔除,它用于消除一个表面的背面)
 //glEnable(GL_CULL_FACE);
 // 打开深度测试,如果不打开深度测试,3D 锥体的显示就会与现实情况不符合
 glEnable(GL_DEPTH_TEST);
 // 保存矩阵状态并旋转
 glPushMatrix();
 glRotatef(xRot, 1.0f, 0.0f, 0.0f);
 glRotatef(yRot, 0.0f, 1.0f, 0.0f);
 glRotatef(zRot, 0.0f, 0.0f, 1.0f);
// glBegin(GL_TRIANGLE_FAN);

 glBegin(GL_QUADS);
 for(i=0; i<6; ++i){  // 有六个面,循环六次
     glColor3d(r[i],g[i],b[i]);
	 //每个面只在一个点上设置了法向量
	 glNormal3f(direction[index[i/2][0]][0],direction[index[i/2][0]][1],direction[index[i/2][0]][2]); //设置法向量

     for(j=0; j<4; ++j){     // 每个面有四个顶点,循环四次

         //在每个点上都设置了法向量
		 //glNormal3f(direction[index[i][j]][2],direction[index[i][j]][1],direction[index[i][j]][0]); //设置法向量
         glVertex3fv(direction[index[i][j]]);
	 }
 }
 glEnd();
 glPopMatrix();
 glutSwapBuffers();
}
int main(int argv,char *argc[]){
 glutInit(&argv,argc);
 glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE);
 glutInitWindowSize(400,400);
 glutInitWindowPosition(400,300);
 glutCreateWindow("立方体 每个面只在一个点上设置了法向量 ");
 //glutCreateWindow("立方体 在每个点上都设置了法向量 ");
 glutDisplayFunc(RenderScene);
 glutSpecialFunc(SpecialKeys);
 Init();
 glutMainLoop();
 return 0;
}

四、主要知识点说明:
1、 光源设置:
1)设置光源成分
a) 设置环境光

  • 对于 GL_LIGHT0,我们可以为其指定环境光成分。
  • 调用 glLightfv(GL_LIGHT0, GL_AMBIENT, ambient Light);

b)设置漫射光成分

  • 通过对漫射光成分的设置,我们可以产生一个点光源,只需调用 glLightfv(GL_LIGHT0, GL_DIFFUSE, DiffuseLight);

c)设置镜面光成分

  • 通过对镜面光成分的设置,我们可以产生一个平行光源,只需调用 glLightfv(GL_LIGHT0, GL_SPECULAR,SpecularLight);

2)设置光源的位置
对于点光源和平行光源,我们常常需要指定光源的位置来产生需要的效果。
方法仍然是调用 glLightfv 函数:

glLightfv(GL_LIGHT0, GL_POSITION, LightPosition);
  • 其中,LightPosition 也是一个四维数组,四维数组的前 3 项依次为光源位置的 X,Y,Z 分量,第四个值很特殊,一般为 1或-1。
  • 当 LightPosition[4]=-1 的时候,表示光源位于距离场景无限远的地方,无论前面设置的 X,Y,Z 是什么值。
  • 当 LightPosition[4]=1 时,光源的位置就是前三项所指定的位置。 X,Y,Z 分量的坐标系如下图所示。
    在这里插入图片描述
    函数:
void glLightfv (GLenum light, GLenum pname, const GLfloat *params)
  • 第一个参数 light 指定所创建的光源号,如 GL_LIGHT0、GL_LIGHT1、…、GL_LIGHT7。
  • OpenGL 可以同时为我们提供 8 个有效的光源,也就是说,我们最多可以同时启用 8 个光源。
  • 其中,GL_LIGHT0 是最特殊的一个光源,我们可以为 GL_LIGHT0 指定环境光成分。
    在这里插入图片描述
    第三个参数设置相应的光源特性值。
    例如下边定义了一个位置在(0,0,0),没有环境光,镜面反射光和漫反射光都为白光的光源:
GLfloat light_position [] = { 0.0, 0.0, 0.0, 0.0 }; 
GLfloat light_ambient [] = { 0.0, 0.0, 0.0, 1.0 };
GLfloat light_diffuse [] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };

光源的位置坐标采用齐次坐标(x, y, z, w)设置。

  • 第四个参数 w 为 0.0 时,定义相应的光源是定向光源,其所有的光线几乎是互相平行的,典型的如太阳光。光源方向由定义的坐标(x, y,
    z)指向(0,0,0);
  • w 为 1.0 时,光源为定位光源。(x, y, z, w)指定光源在齐次坐标系下的具体位置,该位置会根据模型视点矩阵进行变换。

光源设置示例:
一个位置在(0,0,0)的白光光源:

GLfloat light_position[] = { 0.0, 0.0, 0.0, 0.0 }; 
GLfloat white_light [] = {1.0,1.0,1.0,1.0}; //设置光源颜色
glLightfv(GL_LIGHT0,GL_POSITION,light_position); //定义光源的位置
glLightfv(GL_LIGHT0,GL_DIFFUSE,white_light); //定义散射光为白色
glEnable(GL_LIGHTING); //打开光源
glEnable(GL_LIGHT0); //启动 0 号光源

2、 材质设置:
1)材质颜色

  • OpenGL 用材料对光的红、绿、蓝三原色的反射率来近似定义材料的颜色。像光源一样,材料颜色也分成环境、漫反射和镜面反射成分,它们决定了材料对环境光、漫反射光和镜面反射光的反射程度。
  • 在进行光照计算时,材料对环境光的反射率与每个进入光源的环境光结合,对漫反射光的反射率与每个进入光源的漫反射光结合,对镜面光的反射率与每个进入光源的镜面反射光结合。对环境光与漫反射光的反射程度决定了材料的颜色,并且它们很相似。
  • 对镜面反射光的反射率通常是白色或灰色(即对镜面反射光中红、绿、蓝的反射率相同)。
  • 镜面反射高光最亮的地方将变成具有光源镜面光强度的颜色。例如一个光亮的红色塑料球,球的大部分表现为红色,光亮的高光将是白色的。

2)材质定义
材质的定义与光源的定义类似。其函数为:

void glMaterialfv (GLenum face, GLenum pname, const GLfloat *params);
  • 第一个参数 face 可以是
    GL_FRONTGL_BACKGL_FRONT_AND_BACK,它表明当前材质应该应用到物体的哪一个面上;
  • 第二个参数 pname 指定正在设定的材质特性,这个参数的辅助信息下表所示:
    在这里插入图片描述
  • 第三个 params 参数设置相应的材质的特性值
  • 若函数为向量形式,则 param 是一组值的指针,反之为参数值本身。
  • 非向量形式仅用于设置GL_SHINESS

材料光照设置示例:

//材质反光性设置
GLfloat mat_specular [] = {1.0,1.0,1.0,1.0}; //镜面反射参数
GLfloat mat_shininess [] = {100.0}; //高光指数
//材质属性:如何反射光线(材料环境、散射、镜面颜色、光泽度)
glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular); //使用镜面材质颜色
glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess); //使用光泽度

3、法向量的设置
一个面一个法向量。三个顶点决定一个面。法向量可以通过 3 个顶点得到的两个矢量叉乘求出。
函数:glNormal3f (GLfloat x, GLfloat y, GLfloat z):x, y, z 表示法向量指向的位置。
作用:用来设置当前的法向量,这个法向量将被应用到紧接下来的 glVertex() 所定义的顶点上。

  • 但是通常各个顶点的法向是各不相同的,所以我们通常在定义每个顶点之前都为它确定一次法向量。

用法示例:

glBegin();
glNormal3f(x,y,z); //设置法向量
glVertex3f(x,y,z); //设置点坐标
glNormal3f(x,y,z); //设置法向量
glVertex3f(x,y,z); //设置点坐标
glEnd();

4、init()函数

  • 对一些基本数据进行初始化,如果是要绘制静态图形,那么可以将绘制命令放在 init 函数里面。
  • 如果是动态绘制图形(即绘制的图形是运动的、变化的,而非非静止的),那么绘制命令就不能放在 init 函数里面,而需要放在 display
    函数中。
  • glutDisplayFunc(display)用于调用绘制图形的函数 display。

忽然想到《庄子•德充符》里有一句话:“以知为时,以德为循”。 大师南怀谨对这句话的解读是:“一个人,天下大事也好,个人做事也罢,要了解自己什么时候该进一步,什么时候该退一步,随时随地知道自处之道,随时在道德的行为上,自己知道人生的一个方向,一个路径”。

这大概就是自知,知进退,自守,守自我,自定,定方向吧。
——知乎某作者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

少年游四方

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值