代码改变世界

实用指南:实验十三 Z-buffer算法实验

2025-11-30 13:11  tlnshuju  阅读(0)  评论(0)    收藏  举报

一、实验内容

运用opengl,做完Z-buffer算法实验。

二、实验目的

掌握Z-buffer算法实验相关内容。

三、实验代码

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

#include <GL/glut.h>

// 定义场景中的立方体数量

#define CUBE_COUNT 5

// 定义窗口大小

#define WINDOW_WIDTH 800

#define WINDOW_HEIGHT 600

// 立方体顶点坐标

GLfloat cubeVertices[8][3] = {

{-1.0, -1.0, -1.0}, {-1.0, 1.0, -1.0}, {1.0, 1.0, -1.0}, {1.0, -1.0, -1.0},

{-1.0, -1.0, 1.0}, {-1.0, 1.0, 1.0}, {1.0, 1.0, 1.0}, {1.0, -1.0, 1.0}

};

// 立方体面的顶点索引

GLint cubeFaces[6][4] = {

{0, 1, 2, 3}, // 前面

{1, 5, 6, 2}, // 右面

{5, 4, 7, 6}, // 后面

{4, 0, 3, 7}, // 左面

{3, 2, 6, 7}, // 底面

{4, 5, 1, 0} // 顶面

};

// 立方体各面的颜色

GLfloat cubeFaceColors[6][3] = {

{1.0, 0.0, 0.0}, // 前面红色

{1.0, 1.0, 0.0}, // 右面黄色

{0.0, 1.0, 0.0}, // 后面绿色

{0.0, 0.0, 1.0}, // 左面蓝色

{1.0, 0.5, 0.0}, // 底面橙色

{0.0, 1.0, 1.0} // 顶面青色

};

// 立方体结构体

typedef struct {

GLfloat position[3]; // 位置

GLfloat rotation[3]; // 旋转角度

GLfloat scale; // 缩放比例

} Cube;

Cube cubes[CUBE_COUNT]; // 立方体数组

// 初始化立方体

void initCubes() {

for (int i = 0; i < CUBE_COUNT; i++) {

// 随机位置,分布在不同深度

cubes[i].position[0] = (float)(rand() % 200 - 100) / 50.0;

cubes[i].position[1] = (float)(rand() % 200 - 100) / 50.0;

cubes[i].position[2] = (float)(rand() % 200 - 100) / 50.0 - 5.0;

// 初始旋转角度

cubes[i].rotation[0] = 0.0;

cubes[i].rotation[1] = 0.0;

cubes[i].rotation[2] = 0.0;

// 随机缩放比例

cubes[i].scale = (float)(rand() % 50 + 50) / 100.0;

}

}

// 绘制一个立方体

void drawCube(Cube cube) {

glPushMatrix();

// 应用变换

glTranslatef(cube.position[0], cube.position[1], cube.position[2]);

glRotatef(cube.rotation[0], 1.0, 0.0, 0.0);

glRotatef(cube.rotation[1], 0.0, 1.0, 0.0);

glRotatef(cube.rotation[2], 0.0, 0.0, 1.0);

glScalef(cube.scale, cube.scale, cube.scale);

// 绘制立方体的每个面

for (int i = 0; i < 6; i++) {

glBegin(GL_QUADS);

glColor3fv(cubeFaceColors[i]);

for (int j = 0; j < 4; j++) {

glVertex3fv(cubeVertices[cubeFaces[i][j]]);

}

glEnd();

}

glPopMatrix();

}

void init() {

glClearColor(0.0, 0.0, 0.0, 1.0);

glEnable(GL_DEPTH_TEST);

glDepthFunc(GL_LESS);

glEnable(GL_CULL_FACE);

glCullFace(GL_BACK);

}

void display() {

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

gluLookAt(0.0, 0.0, 10.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);

// 绘制所有立方体

for (int i = 0; i < CUBE_COUNT; i++) {

drawCube(cubes[i]);

}

glutSwapBuffers(); // 交换缓冲区

}

// 重置视图

void reshape(int width, int height) {

glViewport(0, 0, (GLsizei)width, (GLsizei)height);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

gluPerspective(45.0, (GLfloat)width / (GLfloat)height, 0.1, 100.0); // 设置透视投影

}

// 动画更新函数

void update(int value) {

// 更新立方体的旋转角度

for (int i = 0; i < CUBE_COUNT; i++) {

cubes[i].rotation[0] += 1.0;

cubes[i].rotation[1] += 2.0;

cubes[i].rotation[2] += 1.5;

}

glutPostRedisplay(); // 标记窗口需要重新绘制

glutTimerFunc(33, update, 0); // 设置下一次更新时间

}

int main(int argc, char** argv) {

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); // 启用双缓冲和深度缓冲

glutInitWindowSize(WINDOW_WIDTH, WINDOW_HEIGHT);

glutInitWindowPosition(100, 100);

glutCreateWindow("Z-buffer算法实验");

init();

initCubes();

glutDisplayFunc(display);

glutReshapeFunc(reshape);

glutTimerFunc(33, update, 0);

glutMainLoop();

return 0;

}

四、实验结果