opengl大作业,球体绘制
时间: 2023-08-24 16:08:12 浏览: 65
好的,下面是一个简单的球体绘制的程序,使用OpenGL库。你可以根据需要进行修改和优化。
```
#include <gl/glut.h>
#include <math.h>
#define PI 3.14159265358979323846
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 1.0, 1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.0, 0.0, 10.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); // 设置视点
int i, j;
int n = 20; // 球体细分数
double r = 1.0; // 球体半径
glBegin(GL_QUADS);
for (i = 0; i < n / 2; i++) {
double lat0 = PI * (-0.5 + (double) i / n);
double z0 = sin(lat0);
double zr0 = cos(lat0);
double lat1 = PI * (-0.5 + (double) (i + 1) / n);
double z1 = sin(lat1);
double zr1 = cos(lat1);
for (j = 0; j < n; j++) {
double lng = 2 * PI * (double) (j - 1) / n;
double x = cos(lng);
double y = sin(lng);
glNormal3f(x * zr0, y * zr0, z0);
glVertex3f(x * zr0 * r, y * zr0 * r, z0 * r);
glNormal3f(x * zr1, y * zr1, z1);
glVertex3f(x * zr1 * r, y * zr1 * r, z1 * r);
lng = 2 * PI * (double) j / n;
x = cos(lng);
y = sin(lng);
glNormal3f(x * zr1, y * zr1, z1);
glVertex3f(x * zr1 * r, y * zr1 * r, z1 * r);
glNormal3f(x * zr0, y * zr0, z0);
glVertex3f(x * zr0 * r, y * zr0 * r, z0 * r);
}
}
glEnd();
glutSwapBuffers();
}
void reshape(int w, int h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0, (GLfloat) w / (GLfloat) h, 1.0, 20.0); // 设置投影矩阵
}
void init(void)
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glEnable(GL_DEPTH_TEST); // 启用深度测试
glShadeModel(GL_FLAT); // 设定着色模式
glEnable(GL_LIGHTING); // 启用光照
glEnable(GL_LIGHT0); // 启用光源0
GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
glLightfv(GL_LIGHT0, GL_POSITION, light_position); // 设置光源位置
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(500, 500);
glutInitWindowPosition(100, 100);
glutCreateWindow("球体绘制");
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMainLoop();
return 0;
}
```
这个程序使用了GLU库,如果你的编译器没有自带GLU库,你需要在编译的时候加上-lGLU参数。