paint-brush
为《塞尔达传说 - 黄昏公主》构建关卡查看器经过@hackerclz1yf3a00000356r1e6xb368
新歷史

为《塞尔达传说 - 黄昏公主》构建关卡查看器

经过 Tommy6m2024/08/03
Read on Terminal Reader

太長; 讀書

我开始为《黄昏公主》(任天堂 GameCube)编写一个网络 BMD 查看器,因为我喜欢这个游戏,而且作为游戏制作人,我对分析关卡和沉浸在关卡制作细节中很着迷。
featured image - 为《塞尔达传说 - 黄昏公主》构建关卡查看器
Tommy HackerNoon profile picture
0-item


这个项目绝对是我最先进的项目之一。我开始为《黄昏公主》(任天堂 GameCube)编写一个 Web BMD 查看器,因为我喜欢这个游戏,而且作为游戏制作人,我对分析关卡和深入了解关卡制作细节非常着迷。这个项目让我可以探索这种激情,并更深入地了解我所爱的游戏。这是一个充满挑战和回报的学习经历。我很兴奋地看到这个项目将带我走向何方,以及我将在此过程中获得哪些新发现。到目前为止,这个项目花费了我数月的研究时间。这项研究基于 20 多个其他人的工作,他们调查并分享了他们对 rarc、bmd、gcm yaz0、j3d、tev 等的知识和发现。我遇到了一些人,我记下来给他们致谢:


感谢:(“LordNed”、“thakis”、“Jasper St. Pierre”、“Kiwi”、“Dolphin Emulator Team”、“Gamma”、“Zan”)——感谢他们的开拓性努力!

水、雾、动画纹理是当前路线图上的功能

示范

该程序使用 three.js 和 webGL 编写而成。它在 chrome 浏览器中以恒定的 60fps 运行。遗憾的是,我无法与您分享交互式查看器(模型、房间等),因为我不想看到研究的合理使用限制有多大。请欣赏我的蒙太奇:


https://api.fenixfox-studios.com/assets/d43523dd-5cbe-4da4-9c7d-2d275690050a

规格

BMD 和 BDL 是任天堂用于在其 GameCube 和 Wii 游戏中存储模型数据的文件格式。它们是任天堂 J3DGraph 库的一部分,而 J3DGraph 库是更大的 JSYSTEM 工具包的组件。BMD 首次出现在游戏《路易吉洋楼》中。它是《超级马里奥阳光》中唯一使用的模型格式。《风之杖》进一步引入了 BDL 格式,它是 BMD 的扩展,并增加了一个用于材料 FIFO 指令的附加部分,称为 MDL3。MDL3 用于提高渲染效率。《超级马里奥银河 2》是最后一款使用此模型格式的游戏。


JSYSTEM 是任天堂用来为其游戏机创建游戏的专有游戏开发工具包。它包括用于 3D 建模、动画和物理等任务的各种库和工具。J3DGraph 是 JSYSTEM 中的一个库,提供处理 3D 图形的功能,并负责 BMD 和 BDL 文件格式。BMD 代表二进制模型,BDL 代表二进制显示列表。


JSYSTEM 工具包是逆向工程师和游戏模组制作者在 21 世纪初发现的,当时他们开始分析和反编译任天堂 GameCube 和 Wii 游戏的代码。他们发现许多游戏共享类似的代码结构和库,这让他们怀疑存在一个共同的开发工具包。经过大量研究和实验,他们能够从游戏中识别和提取 JSYSTEM 库,并开始记录和逆向工程其各种组件,包括 J3DGraph 库以及 BMD 和 BDL 文件格式。


随着对 JSYSTEM 的了解不断加深,模组制作者开始开发自己的工具来处理 JSYSTEM 格式,并开始使用 JSYSTEM 库创建自己的自定义模型、纹理,甚至创建新游戏。这促成了一个充满活力的模组制作社区的诞生,这个社区至今仍然存在,许多模组制作者在网上分享他们的发现和工具。

发展

一开始,我对实际的 *.dol 或 *.gcm 容器格式并不感兴趣,因为其他人已经提供了出色的即用型工具(后来我自己创建了 gcm reader)。经过一番搜索,我发现一些文件夹看起来可能包含一些有趣的东西,比如房间和其他元素。大型区域(例如 Faron Woods)被分成几块并保存到单独的文件中,这些文件稍后将合并以形成完整的区域。


但我想从简单的开始。也许可以做一些简单的事情!解压文件夹中的大部分内容后,我按大小对文件进行排序,找到了一个非常简单的对象。当我在HexWorkshop检查文件时,我偶然发现了 VTX、INF、DRW 和 SHP 等标记。从顶点位置,我可以看出这是一个带有简单门把手的扁平盒子。我很快意识到这是湖床神庙的门。


我知道该物体可能是什么样子,也知道在哪里寻找基本信息,例如顶点坐标以及纹理信息。


BMD 格式文档


您必须小心,因为有些信息根本不适合您的情况。某些属性与文档中所述不同。但拥有这样的格式表就是您提取 3D 模型及其纹理所需的一切!


在我成功提取至少一个简单物体后,我认为是时候进一步挖掘并解决整个区域了!使用我刚刚编写的相同算法,我选择了名为 R00_00 的文件。我希望它是 Ordon Village 或 Faron Woods。但这并不重要,因为我得到的只是一堆垃圾。显然是顶点顺序错误的情况。你能通过查看这张图片判断它是哪个房间吗?


我慢慢地观察着周围的地形。悬崖和墓碑开始随处可见。很明显,我看到的是卡卡里科墓地地区。


经过相当长一段时间后,我才得出这个结果:某些物体缺失、一些面被颠倒,并且似乎没有一个纹理被正确应用。


该解决方案有些令人困惑。尽管某些形状定义了特定的材质索引,但它们并没有直接的 1:1 关系。相反,您必须查看 BMD 文件的 INF 部分中定义的场景层次结构。此层次结构由一棵节点树组成,这些节点可以表示形状或材质。通常,层次结构从材质开始,然后是一些形状。例如,您可能会看到类似 (mat1、shp2、shp5、shp6、mat2、shp1、shp12...) 的内容。在这种情况下,形状 2、5 和 6 都将使用材质 1,依此类推。



好吧,很棒,但是玩过这款游戏的每个人都会注意到材质看起来不对劲。颜色不对劲,材质之间没有混合,而且整体看起来很暗。此时,我本应该深入探讨这一切中最令人兴奋的部分。GameCube 使用 TEV 阶段或纹理环境阶段来处理这些任务。TEV 阶段负责混合纹理、管理颜色和应用透明效果。请注意,GameCube 并不像我们今天所知道的那样真正支持透明效果,而是先渲染两个渲染通道并首先渲染远处的物体。有一些 GitHub 存储库、一些文章和一些论坛主题。尽可能多地获取信息!


我需要添加的另一个重要部分是大气效果,如雾、光晕和云。到目前为止,我无法成功创建雾和光晕效果,但我找到了云阴影并将它们放在混合 TEV 阶段。我仍在寻找云的正确 UV 坐标。


那个房间的最终效果是这样的:(其实花了挺长一段时间才实现的)


结论

这个项目是一段不可思议的旅程。花时间研究聪明人如何解决过去的技术限制,让我领略了《黄昏公主》的复杂之美。我取得了很大的进展,但仍有大量的事情需要探索和实现。我计划继续开发这个查看器,添加雾、BTK(纹理动画)和其他大气效果等功能,使其尽可能准确和身临其境。