65.9K
CodeProject 正在变化。 阅读更多。
Home

我的第一个 OpenGL 项目:3D 房屋

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.57/5 (6投票s)

2015年6月16日

CPOL

3分钟阅读

viewsIcon

64911

downloadIcon

6333

启发我开始 3D 编程的项目

引言

八年前,我尝试进入 3D 编程世界。我当时在学习 NEHE 教程,但由于其复杂性,我放弃了 3 次。这些教程是用 C++ 编写的,有时很难理解。然后我发现了这个项目。我不得不说这是我见过的最完整的从头开始学习 3D 编程的项目之一。

在这个项目中,您会看到一栋内部所有东西都齐全的房子。但令人惊奇的是,所有东西都是通过代码完成的。这意味着该项目不加载任何 3D 对象。它只是在运行时创建它们。没有使用 3D 引擎,因此您可以了解用于创建相机、对象交互、碰撞等的代码的大部分内容。程序员只是通过组合简单的 OpenGL 图元来创建所有对象。

项目概述

项目语言是使用 TAO 命名空间以 C# 编写的。TAO 是一个将所有 OpenGL 函数映射到 .NET 的库。这样,您将从 .NET 沙箱中使用 OpenGL。该项目非常模块化。这意味着每个对象几乎都是独立的。每个对象实际上都包含它自己的工作逻辑,因此您不会因项目中的太多依赖关系而迷失方向。主类是 main.cs,因此您可以从那里开始探索该项目。

这是一个 main.cs 的代码示例。您可以看到如何在运行时将对象添加到场景中。

public MainClass(string[] args)
        {
            GlControl ViewPort = new GlControl(Width,Height);
            GlObjectList world = new GlObjectList();
            world.Add(new LightSource());
#if !testingObjects
            world.Add(new TranslatedObject(new Point3D(0,-10,0),new SkyBox()));
            GlObjectList casa = new GlObjectList();
            casa.Add(new Casa2());

            casa.Add(new Librero(new Point3D(210,0,-318),0));
            casa.Add(new Librero(new Point3D(210,Librero.Height+.3,-316),-3));
            casa.Add(new Lamp(new Point3D(60,270,190),70));
            casa.Add(new Refrigerador(new Point3D(-145,0,120),180));
            Plantilla obj = new Mesita(new Point3D(80,0,40),90);
            casa.Add(obj);
            casa.Add(new TV(new Point3D(80,obj.Height+.2,60),0));
            casa.Add(new Cama(new Point3D(370,0,-250),0,100,70));
            casa.Add(new Cama(new Point3D(370,0,-480),0,100,60));
            casa.Add(new Cama(new Point3D(-210,0,-420),0,90,40));
            casa.Add(new Estante(new Point3D(-210,170,-108)));
            obj = new Mesa(new Point3D(380,0,200));
            casa.Add(obj);
            casa.Add(new Silla(new Point3D(440,0,160)));
            casa.Add(new Silla(new Point3D(440,0,240)));
            casa.Add(new Silla(new Point3D(330,0,160),180));
            casa.Add(new Silla(new Point3D(330,0,240),180));
            casa.Add(new Silla(new Point3D(385,0,110),90));
            casa.Add(new Silla(new Point3D(385,0,290),-90));
            casa.Add(new Plato(new Point3D(380,obj.Height+.2,200)));
            casa.Add(new Vaso(new Point3D(380,obj.Height+.2,230)));
            casa.Add(new MesitaDeNoche(new Point3D(455,0,-140),-90));
            casa.Add(new MesitaDeNoche(new Point3D(455,0,-380),-90));
            casa.Add(new MesitaDeNoche(new Point3D(455,0,-580),-90));
            casa.Add(new MesitaDeNoche(new Point3D(-280,0,-340),90));
            obj = new EstanteHorizontal(new Point3D(330,0,-70),180);
            casa.Add(obj);

            casa.Add(new Butaca(new Point3D(-30,0,200),90,2));
            casa.Add(new Butaca(new Point3D(200,0,270),250,1));
            casa.Add(new Butaca(new Point3D(200,0,110),-70,1));

            casa.Add(new MesetaConFregadero(new Point3D(-307,0,-64),0));            

            casa.Add(new Clock(new Point3D(485,200,325),270));
            GlObject c = new TranslatedObject(new Point3D(0,0,-70),casa);
            world.Add(c);
#endif

            observer=new Avatar(ViewPort, world);
            Glut.glutDisplayFunc(new Glut.DisplayCallback(observer.Look));
            Glut.glutIdleFunc(new Glut.IdleCallback(observer.Look));
            Glut.glutMainLoop();
        }

该项目使用 FPS 摄像机。您将使用鼠标更改摄像机方向,并使用鼠标左键/右键向前和向后移动。要与房屋门等对象进行交互,请按空格键。

此外,您可以按 G 键并激活幽灵模式。在此模式下,碰撞将不起作用,您可以穿过房屋墙壁。

有趣的物体

时钟

进入房间后,您会发现墙上挂着一个时钟。如果您注意,时钟将显示您的计算机时间。

OpenGL 茶壶

进入厨房,您会发现经典的 OpenGL 茶壶。此对象已硬编码到 GLUT 库中,就像 OpenGL 的符号一样。

打开门

您将不得不与门互动。它们会打开和关闭。好处是没有 3D 引擎在后台,因此您可以了解它的实际工作方式。

房屋家具

还可以看到桌子、椅子、床等其他房屋物品。如果您查看代码,您将了解它们是如何通过组合简单的 OpenGL 图元来构建的。

天空盒

如果您在房子周围走动,您会看到天空和地面。从这个项目开始,我学习了在 3D 编程中渲染环境的基础知识。这是一个纹理立方体(天空盒)和一个用于地面的平面。

吊灯

这个吊灯有一条链子,链子是通过使用 OpenGL 图元的代码制成的。看看它是如何完成的非常有趣。

此项目涵盖的 OpenGL 主题

这是本项目涉及的所有基础知识的列表。每个的解释都超出了本文的逻辑范围。我建议您开始在互联网上查找。

  • FPS 摄像机
  • CSG(构造实体几何)
  • 透明度
  • 碰撞
  • 天空盒技术
  • 向量处理
  • 纹理加载和映射。
  • OpenGL 图元
  • 对象交互

关注点

您可以从这个项目中学习很多东西。您可以从注释添加到场景中的对象并查看结果开始。如果您有点自信,您可以开始添加自己的对象。该项目以非常模块化的方式编写,使您能够在不损害整个结构设计的情况下增加复杂性。
我希望这将激发您开始进入这个神奇的世界。

历史

  • 2015 年 6 月 16 日:第一个版本
© . All rights reserved.