📜  opengl draw house 使用 glut c++ (1)

📅  最后修改于: 2023-12-03 15:18:07.620000             🧑  作者: Mango

OpenGL绘制房屋 - 使用GLUT和C++

OpenGL是用于编写可视化和图形应用程序的图形API。它允许程序员使用基本的几何图元(如线,点,三角形)和颜色属性创建复杂的3D模型。

GLUT(OpenGL实用工具库)是一个跨平台的开源库,为OpenGL提供了方便的窗口和事件处理。

在本教程中,我们将使用OpenGL和GLUT绘制一个简单的房屋。我们将使用C++编写代码。

步骤1 - 安装OpenGL和GLUT库

首先,我们需要安装OpenGL和GLUT库。这里我们使用的是freeglut,它是GLUT的一个免费开源替代品。您可以使用以下命令在Ubuntu上安装freeglut:

sudo apt-get install freeglut3 freeglut3-dev
步骤2 - 设置环境

我们需要包含以下头文件:

#include <GL/glut.h>
#include <GL/gl.h>
#include <GL/glu.h>
步骤3 - 初始化OpenGL窗口

我们需要在main函数中初始化OpenGL窗口:

int main(int argc, char** argv) 
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(800, 600);
    glutCreateWindow("OpenGL:绘制房屋");
    init();
    glutDisplayFunc(display);
    glutMainLoop();
    return 0;
}
  • glutInit初始化窗口系统和OpenGL上下文。
  • glutInitDisplayMode设置显示模式。GLUT_Single模式用于单缓存窗口,GLUT_RGB模式用于指定颜色模式为RGB(红绿蓝)。
  • glutInitWindowSize设置窗口大小(800x600)。
  • glutCreateWindow创建窗口并指定标题。
  • init函数用于初始化OpenGL参数。
  • glutDisplayFunc告诉GLUT窗口在哪个函数中进行绘制。
  • glutMainLoop启动GLUT事件循环。
步骤4 - 绘制立方体

我们可以使用以下代码绘制立方体:

void draw_cube(float x, float y, float z, float width, float height, float depth) 
{
    glBegin(GL_QUADS);

    // 前面
    glColor3f(0.4f, 0.4f, 0.4f);
    glVertex3f(x, y, z);
    glVertex3f(x + width, y, z);
    glVertex3f(x + width, y + height, z);
    glVertex3f(x, y + height, z);

    // 后面
    glColor3f(1.0f, 1.0f, 1.0f);
    glVertex3f(x, y, z + depth);
    glVertex3f(x + width, y, z + depth);
    glVertex3f(x + width, y + height, z + depth);
    glVertex3f(x, y + height, z + depth);

    // 左侧
    glColor3f(0.4f, 0.4f, 0.4f);
    glVertex3f(x, y, z);
    glVertex3f(x, y, z + depth);
    glVertex3f(x, y + height, z + depth);
    glVertex3f(x, y + height, z);

    // 右侧
    glColor3f(0.4f, 0.4f, 0.4f);
    glVertex3f(x + width, y, z);
    glVertex3f(x + width, y, z + depth);
    glVertex3f(x + width, y + height, z + depth);
    glVertex3f(x + width, y + height, z);

    // 顶面
    glColor3f(0.4f, 0.4f, 0.4f);
    glVertex3f(x, y, z);
    glVertex3f(x + width, y, z);
    glVertex3f(x + width, y, z + depth);
    glVertex3f(x, y, z + depth);

    // 底面 
    glColor3f(0.4f, 0.4f, 0.4f);
    glVertex3f(x, y + height, z);
    glVertex3f(x + width, y + height, z);
    glVertex3f(x + width, y + height, z + depth);
    glVertex3f(x, y + height, z + depth);

    glEnd();
}

该函数将立方体绘制到屏幕上。我们需要设定立方体的位置(x,y,z),宽度,高度和深度。

步骤5 - 绘制房屋

我们可以使用以下代码绘制房屋:

void draw_house() 
{
    // 前墙
    draw_cube(-1.0f, -0.5f, 1.0f, 2.0f, 1.0f, 0.1f);

    // 后墙
    draw_cube(-1.0f, -0.5f, -1.1f, 2.0f, 1.0f, 0.1f);

    // 左侧墙
    draw_cube(-1.1f, -0.5f, -1.0f, 0.1f, 1.0f, 2.0f);

    // 右侧墙
    draw_cube(1.0f, -0.5f, -1.0f, 0.1f, 1.0f, 2.0f);

    // 屋顶 
    glBegin(GL_TRIANGLES);
    glColor3f(0.4f, 0.4f, 0.4f);
    glVertex3f(-1.1f, 0.5f, -1.0f);
    glVertex3f(1.1f, 0.5f, -1.0f);
    glVertex3f(0.0f, 1.2f, -1.0f);
    glEnd();
}

该函数使用draw_cube函数绘制房屋的前,后,左,右侧墙和屋顶。

步骤6 - 绘制地面

我们可以使用以下代码绘制地面:

void draw_ground() 
{
    glBegin(GL_QUADS);
    glColor3f(0.0f, 0.6f, 0.0f);
    glVertex3f(-2.0f, -0.5f, -2.0f);
    glVertex3f(2.0f, -0.5f, -2.0f);
    glVertex3f(2.0f, -0.5f, 2.0f);
    glVertex3f(-2.0f, -0.5f, 2.0f);
    glEnd();
}
步骤7 - 整合所有的可绘制元素

我们可以使用以下代码将所有可绘制元素整合到一起:

void display() 
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glTranslatef(0.0f, 0.0f, -5.0f);

    draw_ground();
    draw_house();

    glFlush();
}
步骤8 - 完全代码展示

完整代码如下:

#include <GL/glut.h>
#include <GL/gl.h>
#include <GL/glu.h>

void draw_cube(float x, float y, float z, float width, float height, float depth) 
{
    glBegin(GL_QUADS);

    // 前面
    glColor3f(0.4f, 0.4f, 0.4f);
    glVertex3f(x, y, z);
    glVertex3f(x + width, y, z);
    glVertex3f(x + width, y + height, z);
    glVertex3f(x, y + height, z);

    // 后面
    glColor3f(1.0f, 1.0f, 1.0f);
    glVertex3f(x, y, z + depth);
    glVertex3f(x + width, y, z + depth);
    glVertex3f(x + width, y + height, z + depth);
    glVertex3f(x, y + height, z + depth);

    // 左侧
    glColor3f(0.4f, 0.4f, 0.4f);
    glVertex3f(x, y, z);
    glVertex3f(x, y, z + depth);
    glVertex3f(x, y + height, z + depth);
    glVertex3f(x, y + height, z);

    // 右侧
    glColor3f(0.4f, 0.4f, 0.4f);
    glVertex3f(x + width, y, z);
    glVertex3f(x + width, y, z + depth);
    glVertex3f(x + width, y + height, z + depth);
    glVertex3f(x + width, y + height, z);

    // 顶面
    glColor3f(0.4f, 0.4f, 0.4f);
    glVertex3f(x, y, z);
    glVertex3f(x + width, y, z);
    glVertex3f(x + width, y, z + depth);
    glVertex3f(x, y, z + depth);

    // 底面 
    glColor3f(0.4f, 0.4f, 0.4f);
    glVertex3f(x, y + height, z);
    glVertex3f(x + width, y + height, z);
    glVertex3f(x + width, y + height, z + depth);
    glVertex3f(x, y + height, z + depth);

    glEnd();
}

void draw_house() 
{
    // 前墙
    draw_cube(-1.0f, -0.5f, 1.0f, 2.0f, 1.0f, 0.1f);

    // 后墙
    draw_cube(-1.0f, -0.5f, -1.1f, 2.0f, 1.0f, 0.1f);

    // 左侧墙
    draw_cube(-1.1f, -0.5f, -1.0f, 0.1f, 1.0f, 2.0f);

    // 右侧墙
    draw_cube(1.0f, -0.5f, -1.0f, 0.1f, 1.0f, 2.0f);

    // 屋顶 
    glBegin(GL_TRIANGLES);
    glColor3f(0.4f, 0.4f, 0.4f);
    glVertex3f(-1.1f, 0.5f, -1.0f);
    glVertex3f(1.1f, 0.5f, -1.0f);
    glVertex3f(0.0f, 1.2f, -1.0f);
    glEnd();
}

void draw_ground() 
{
    glBegin(GL_QUADS);
    glColor3f(0.0f, 0.6f, 0.0f);
    glVertex3f(-2.0f, -0.5f, -2.0f);
    glVertex3f(2.0f, -0.5f, -2.0f);
    glVertex3f(2.0f, -0.5f, 2.0f);
    glVertex3f(-2.0f, -0.5f, 2.0f);
    glEnd();
}

void display() 
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glTranslatef(0.0f, 0.0f, -5.0f);

    draw_ground();
    draw_house();

    glFlush();
}

void init() 
{
    glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
    glEnable(GL_DEPTH_TEST);
}

int main(int argc, char** argv) 
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(800, 600);
    glutCreateWindow("OpenGL:绘制房屋");
    init();
    glutDisplayFunc(display);
    glutMainLoop();
    return 0;
}
总结

在本教程中,我们学习了如何使用OpenGL和GLUT绘制一个简单的房屋。现在您可以自己尝试绘制其他的3D模型,并探索OpenGL的其他功能。