1、利用glut.h函数库,组合三维场景,包含茶壶、球体、立方体、甜甜圈等几何体; 2、添加环境光属性; 3、添加ChangeSize函数,控制窗体变化时几何体外形形变。
时间: 2023-10-20 12:05:38 浏览: 59
以下是一个基本的示例代码,其中包含了一个茶壶、球体、立方体和甜甜圈,并添加了环境光属性和ChangeSize函数来控制窗体变化时几何体外形形变。
```
#include <GL/glut.h>
#include <stdlib.h>
GLfloat angleTeapot = 0.0f;
GLfloat angleCube = 0.0f;
GLfloat angleSphere = 0.0f;
GLfloat angleTorus = 0.0f;
void init(void)
{
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
GLfloat ambientLight[] = {0.2f, 0.2f, 0.2f, 1.0f};
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientLight);
GLfloat lightColor[] = {0.7f, 0.7f, 0.7f, 1.0f};
GLfloat lightPos[] = {0.0f, 10.0f, 10.0f, 1.0f};
glLightfv(GL_LIGHT0, GL_DIFFUSE, lightColor);
glLightfv(GL_LIGHT0, GL_POSITION, lightPos);
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotatef(angleTeapot, 0.0f, 1.0f, 0.0f);
glutSolidTeapot(1.0f);
glPopMatrix();
glPushMatrix();
glTranslatef(-2.0f, 0.0f, 0.0f);
glRotatef(angleCube, 1.0f, 1.0f, 1.0f);
glutSolidCube(1.0f);
glPopMatrix();
glPushMatrix();
glTranslatef(2.0f, 0.0f, 0.0f);
glRotatef(angleSphere, 1.0f, 1.0f, 1.0f);
glutSolidSphere(1.0f, 20, 20);
glPopMatrix();
glPushMatrix();
glTranslatef(0.0f, 2.0f, 0.0f);
glRotatef(angleTorus, 0.0f, 1.0f, 0.0f);
glutSolidTorus(0.5f, 1.0f, 20, 20);
glPopMatrix();
glutSwapBuffers();
}
void changeSize(int w, int h)
{
GLfloat aspectRatio = (GLfloat)w / (GLfloat)h;
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (w <= h)
glOrtho(-4.0, 4.0, -4.0 / aspectRatio, 4.0 / aspectRatio, -4.0, 4.0);
else
glOrtho(-4.0 * aspectRatio, 4.0 * aspectRatio, -4.0, 4.0, -4.0, 4.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void timer(int value)
{
angleTeapot += 1.0f;
angleCube += 2.0f;
angleSphere += 1.5f;
angleTorus += 1.0f;
glutPostRedisplay();
glutTimerFunc(15, timer, 0);
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(800, 600);
glutCreateWindow("3D Scene");
init();
glutDisplayFunc(display);
glutReshapeFunc(changeSize);
glutTimerFunc(15, timer, 0);
glutMainLoop();
return 0;
}
```
在这个示例代码中,我们使用了几个常见的几何体函数:
- `glutSolidTeapot`:绘制茶壶
- `glutSolidCube`:绘制立方体
- `glutSolidSphere`:绘制球体
- `glutSolidTorus`:绘制甜甜圈
我们使用了OpenGL的函数库来为场景添加环境光属性。我们使用了 `glEnable` 函数来启用深度测试和灯光,并使用 `glLightModelfv` 函数将环境光设置为一种暗灰色。我们使用 `glEnable` 函数启用颜色材质,并使用 `glColorMaterial` 函数将前表面的红、绿、蓝和透明度设置为环境光和漫反射光的和。
我们还使用 `changeSize` 函数来控制窗口大小,以便在窗口大小更改时调整几何体的形状。我们使用 `glOrtho` 函数来重新定义投影矩阵,以便更好地适应窗口大小。
最后,我们使用一个 `timer` 函数来控制几何体的旋转。每当定时器触发时,我们将旋转角度增加一些,然后调用 `glutPostRedisplay` 函数来重新绘制场景。