3DWorld博客:https://3dworldgen.blogspot.com
3DWorld是一个跨平台的基于OpenGL的3D游戏引擎,自2001年我在加州大学伯克利分校上CS184计算机图形学课程以来,我一直在开发它。 它具有以下特性:
- 3D图形函数、类和OpenGL封装
- 具有热重载功能的着色器生成器/处理器
- 地形、植被、建筑等的程序化内容生成
- 包含星系、恒星、行星、卫星等的程序化宇宙生成器
- 具有实时用户编辑功能的程序化体素3D地形生成
- 地形生成器,包括各种噪声函数、侵蚀、实时用户编辑、高度图读写
- 程序化建筑(内部和外部)、道路和城市生成
- 基本物体类型和其他物体的物理模拟(>10K动态物体)
- 实时昼夜循环,包括天气(雨、雪、冰雹、风、闪电)
- 基于物理的材质,具有反射和折射效果
- 动态阴影、环境遮蔽、最多1024个动态光源、后处理效果
- 骨骼动画和程序化动画
- 内置第一人称射击游戏"笑脸杀手"
- 内置太空船+星球殖民游戏
- 建筑物品收集和僵尸游戏模式
- FPS游戏中玩家、建筑游戏和宇宙游戏中飞船的电脑AI
- Lightwave对象文件、3DS格式的导入器,以及用于其他文件格式的Assimp
- 支持读取的纹理格式:JPEG、PNG、BMP、TIFF、TGA、DDS
- 针对大型模型(>1GB顶点/纹理数据)的快速加载和实时渲染进行了优化
我在第6607次提交时将项目从svn转换为git。 大部分代码都是用C++编写的,着色器使用GLSL。 这个项目旨在成为跨平台项目。 包含了Microsoft Visual Studio 2019和2022的项目文件。 还包含一个linux/gcc的makefile,但更具实验性。详情请参阅README.linux。 该项目应该可以在linux上使用gcc构建,但可能需要一些工作,我已经有一段时间没有尝试过了。 我有一个旧的makefile,虽然已经过时,但可能不需要太多工作就能修复并使其可用。
请注意,这是一个大型仓库,目前约1GB。 我包含了源代码、配置文件、纹理、声音、小型模型、光照文件、场景数据、高度图和项目文件。 这个仓库不包含一些场景中使用的大型模型文件,你需要单独下载这些。 这意味着某些场景配置文件可能无法正常工作,因为它们找不到引用的数据。 当前的依赖列表是:
- OpenGL 4.5(应该随Windows 7/8/10最新图形驱动程序一起提供)
- OpenAL 1.1(系统安装:https://www.openal.org/downloads/ 或者你可以尝试更新的openal-soft:https://github.com/kcat/openal-soft)
- freeglut-2.8.1(当前3.0版本可能也能正常工作:https://sourceforge.net/projects/freeglut/)
- freealut-1.1.0(这里有一个版本:https://github.com/vancegroup/freealut)
- zlib-1.2.1(你可以从这里下载更新的版本:https://zlib.net/)
- glew-2.0.0(2.1.0可能也能正常工作:http://glew.sourceforge.net/)
- gli(最新版本:https://github.com/g-truc/gli / 仅头文件,包含在dependencies目录中)
- glm-0.9.9.0(最新版本:https://glm.g-truc.net/0.9.9/index.html 或 https://github.com/g-truc/glm / 仅头文件,包含在dependencies目录中)
- libpng-1.2.20(我的版本非常旧;最新版本:https://libpng.sourceforge.io/index.html);在大多数情况下可以用stb_image替代,除了地图图像导出。
- libtiff-4.0.3(最新版本:http://www.simplesystems.org/libtiff/)
- Assimp(可选)
- libtarga(包含源代码)
- STB头文件:stb_image、stb_image_write、stb_dxt(包含源代码)
我在dependencies目录中包含了这些库的精简版本。 我移除了所有3DWorld不需要的大文件,在某些情况下甚至包括示例/测试/文档。 这些是在Windows 10上使用MS Visual Studio 2022 Community构建的。 如果你想使用这些,你需要将目录复制到根目录,并为其他版本的Visual Studio重新构建所需的库。
请注意,许多这些依赖项都比较旧,可以替换为更新的库。我一直专注于添加内容,对此不太感兴趣。 Freeglut可能应该替换为SDL,最后4个图像库可以替换为STB或DevIL。 如果你想构建3DWorld,你可以使用dependencies/文件夹中的项目,或者自行下载并构建它们,然后更改项目设置来使用它们。 我目前使用32位的MS Visual Studio 2022社区版作为3DWorld的构建目标,但如果你使用3DWorld_msvs2019.vcxproj,它也应该可以在MSVS 2019上工作。 如果你将lib64/文件夹中的DLL复制到仓库根目录并做一些其他项目设置更改,它应该可以在64位模式下编译和运行。
如果你使用Linux,可以尝试使用提供的makefile进行构建。README.linux文件应该会有帮助。 我已经在使用gcc 7的Ubuntu 18.04和使用gcc 9的Ubuntu 20.04上成功构建并基本运行了3DWorld。
3DWorld在命令行中接受一个配置文件名。如果没有找到,它会读取defaults.txt并使用其中列出的任何配置文件。 这些配置文件中包括了一些模型,如Sponza Atrium、Stanford Dragon、跑车等。 这些文件太大,无法存储在git仓库中。我已尝试让3DWorld在找不到模型时生成非致命错误。 许多较大的模型可以在McGuire计算机图形档案中找到: http://casual-effects.com/data/
我已经将那些太大而无法放入GitHub仓库的3D模型打包并上传到Google Drive(现在是第6版): https://drive.google.com/file/d/1crN9rqT-LSvYyTZTw5wtkhwsubE651ex/view?usp=sharing 其中一些模型以3DWorld的内部格式存储,不应在其他项目中重复使用。其他模型来自Mixamo等网站。
系统要求:
- Windows 7/8/10/11(可在Windows 7上运行,但我只在8、10和11上构建过)。使用makefile和gcc时可在Linux上运行。
- Microsoft Visual Studio 2019或2022。需要专业版或社区版以支持OpenMP。你也可以尝试在Linux上使用gcc。
- 相对较新一代的Nvidia或ATI GPU(在我的Intel集成显卡笔记本上可以运行,但帧率只有12-20 FPS)
- 对于较大的场景,至少需要4GB系统内存
- 对于较大的场景,至少需要4GB GPU内存;我的GPU有12GB内存
故障排除: 似乎有些系统需要OpenGL核心上下文。可以通过在配置文件中添加"use_core_context 1"来选择此选项。 这也可以在scene_config/config_post.txt中启用,该文件在读取所有其他顶级配置文件后应用。 在某些情况下,使用核心上下文可能会较慢,这就是为什么我默认没有启用它。
常用按键(更多按键绑定请参见readme-keys.txt):
- a,s,d,w:移动
- q,e:切换武器(游戏模式)
- 'space':跳跃/开火
- 'esc':退出
- 'tab':屏幕菜单(用方向键导航,'X'切换菜单)
- b:启用物体/物理/AI(用于地面模式和宇宙模式游戏)
- F1:在地面/宇宙/瓦片地形模式之间切换
- F2:切换游戏模式
- m:切换全屏模式
- h:切换飞行移动
- v:更改相机模式(水晶球/轨道 vs. 第一人称)
- V:切换鼠标视角
- K:切换俯视地图模式
- x:暂停
- 鼠标左键:转向/动作
- 鼠标右键:开火
我目前将这个仓库作为教育目的在GPL许可下公开。 它不是一个商业工具,我也不是为了赚钱。 在这个早期阶段,我也不打算让其他人参与项目工作,尽管我接受反馈和建议。 如果我决定把它做成一个真正的游戏,情况可能会有所改变。 如果你想在你的项目中使用这里的某些内容,请告诉我。
3DWorld没有进一步的文档。 不过,我确实有一个博客,其中包括算法描述和大量截图: https://3dworldgen.blogspot.com
以下是一些来自我博客的截图链接:
[图片1]
这是一个建筑物的零售区,有成排的货架。建筑物可以包含数万个玩家可以拿起和携带的交互对象。(config_heightmap.txt)
[图片2]
放置在其他房间的摄像头在安全监视器上显示实时视频流。(config_heightmap.txt)
[图片3]
僵尸(具有寻路和其他AI行为)在室内游泳池周围行走并掉入其中。水面有波纹、水花、反射和折射效果。(config_heightmap.txt)
[图片4] 停车场内停放着汽车,天花板上安装有喷水管道。(config_heightmap.txt)
程序生成的建筑地下室,有人、间接照明和天花板上的管道。(config_heightmap.txt)
程序生成的住宅区,背景是办公楼。人和车辆分布在人行道上和建筑物内。(config_heightmap.txt)
程序生成的建筑内部 - 一个图书馆,里面的书籍也是程序生成的。(config_heightmap.txt)
程序生成的房屋和办公楼,包括完整的内部结构。(config_heightmap.txt)
夜景中的反射(金属)、折射(玻璃)、发光和半透明球体,带有间接照明。实时绘制;球体可以交互式移动。(config_white_plane.txt)
程序生成的城市,包括建筑、道路、汽车和行人。(config_heightmap.txt)
夜晚的程序生成城市,前景是一座桥。(config_heightmap.txt)
早期程序生成的城市,有松树。
早期程序生成的城市。
使用域扭曲噪声和水力侵蚀模拟生成的地形,城市尚未放置。(config_heightmap.txt)
平铺地形模式,包括河流、树木、草地等。(config_t.txt)
实时交互式破坏性火灾/烟雾模拟,涉及树木、植物和草地。(config_trees.txt)
程序生成的宇宙太阳系,带有小行星带。(universe/config_universe.txt)
Crytek Sponza中庭场景,带有动态投射阴影的光源和间接照明。(sponza/config_sponza2.txt)
在平铺地形模式(普吉特海湾高度图)中放置了10,000个高度详细的博物馆模型实例,并在实时中绘制,包括阴影和间接照明。(config_museum_tt_model.txt)
Crytek Sponza中庭,带有反光地板和200个实时动态点光源。(sponza/config_sponza2.txt)
办公楼庭院中的多个反射/折射球体和立方体,具有基于密度的光衰减效果。(mapx/config_mapx.txt)
圣米格尔场景,带有动态降雪和使用自定义着色器渲染的路径追踪雪覆盖图。(config_san_miguel.txt)
圣米格尔场景,使用预计算的路径追踪间接照明、法线贴图和立方体映射反射表面进行实时渲染。(config_san_miguel.txt)
200万棵程序生成和放置的松树(50万棵可见),在分块地形模式下使用实例化广告牌实时绘制。(config_t.txt)
在mapx场景中互动堆叠10,000个动态箱子。堆叠可以移动和推倒,场景可以保存/重新加载/编辑。(mapx/config_mapx.txt)
程序生成的带有小行星环的行星。(universe/config_universe.txt)
小行星带,包含10,000个动态(旋转和绕轨道运行)小行星、100,000个点精灵粒子,以及用于尘埃的体积广告牌云。(universe/config_universe.txt)
分块地形模式,展示各种形式的程序生成植被,包括草、花、松树、棕榈树和落叶树。这些实际上是能投射阴影的多边形模型。(config_t.txt)
在Crytek Sponza场景中,通过基于噪声的体积烟雾实现实时、动态光束。(sponza/config_sponza2.txt)
Crytek Sponza场景中的反光金属地板,带有间接阳光和天空照明。(sponza/config_sponza2.txt)
在办公楼大厅的动态场景中,使用立方体贴图反射纹理实时绘制的反光球体、圆环和立方体。材质是使用基于物理的模型混合的金属和电介质。(mapx/config_mapx.txt)
博物馆场景,具有间接照明、反射表面和阴影映射。这个模型采用程序化纹理。(config_museum.txt)
通过投放10亿个雪粒子并积累雪量生成的积雪房屋场景。雪是预计算的,但可以实时渲染。(house/config_house_winter.txt)
雨水模拟和渲染,包括每个雨滴的碰撞检测和湿润/反光表面。(house/config_house.txt)
来自重叠聚光灯的间接照明和阴影应用于动态物体。(mapx/config_mapx.txt)
在分块地形模式下使用硬件曲面细分的水波模拟。(config_t.txt)
程序生成的3D体素冰洞,具有间接照明效果。这种地形可以通过笔刷和武器射击在实时中进行编辑。(config_ice_caves.txt)
完全在片段着色器中绘制的程序生成行星,无需使用纹理。这包括地形生成(冰、雪、岩石、森林、沙漠、泥土)、水、云和大气层。(universe/config_universe.txt)