第2章:场景文件结构
场景文件的结构,说白了就是FlightGear怎么组织它的世界。我刚开始接触时也被那一堆文件夹搞得头晕,后来摸清了规律,才发现这套设计其实挺聪明的。
2.1 场景目录结构解析
先看看FlightGear的场景目录长什么样。你安装好FlightGear后,找到它的根目录,里面有个叫Scenery的文件夹。嗯,这就是我们的大本营。
FlightGear/
├── Scenery/
│ ├── Objects/ # 3D模型文件
│ ├── Terrain/ # 地形数据
│ ├── Models/ # 模型定义
│ └── Materials/ # 材质定义
├── Airport/ # 机场数据
├── Navaids/ # 导航设备
└── Models/ # 通用模型库
我个人习惯把场景目录想象成一个三层结构:
- 第一层:按功能分类(地形、物体、机场)
- 第二层:按地理位置分块(经纬度网格)
- 第三层:具体的数据文件(XML、3D模型)
为什么会这样设计?因为FlightGear要加载整个世界,不可能把所有数据塞一个文件夹里。你想想看,光地球的地形数据就有几百GB,不分块根本没法玩。
核心概念:场景数据按经纬度网格存储,每个网格是一个独立的文件夹。比如北纬30度、东经120度附近的数据,会放在 Scenery/Terrain/30/120/ 目录下。
我在项目中遇到过一个问题:自己做的机场模型加载不出来。查了半天,原来是模型文件放错了目录层级。记住,自定义场景一定要放在 Scenery/Objects/ 下,别乱放。
2.2 XML配置文件基础
XML是FlightGear的"通用语言"。场景里的一切——从一棵树到一座城市——都是用XML描述的。
来看一个最简单的例子:
<PropertyList>
<name>我的小机场</name>
<type>airport</type>
<position>
<latitude>39.9042</latitude>
<longitude>116.4074</longitude>
<elevation>50</elevation>
</position>
</PropertyList>
这段代码定义了一个机场的位置。你看,结构很清晰:
<PropertyList>是根标签,所有场景文件都用它- 每个标签代表一个属性,可以嵌套
- 标签名就是属性名,标签内容就是属性值
小技巧:FlightGear的XML不区分标签顺序。你可以先写位置再写名称,或者反过来,效果一样。但为了可读性,我建议按逻辑顺序排列。
XML里有个坑,我曾经踩过:标签名大小写敏感。<Latitude> 和 <latitude> 是两个不同的属性。FlightGear默认用小写,你最好也保持一致。
2.3 属性树概念
属性树是FlightGear最核心的设计之一。说白了,它就是一个巨大的"配置字典",所有东西都在这个树里。
想象一下:
/
├── sim/
│ ├── time/
│ │ ├── elapsed-sec
│ │ └── time-of-day
│ ├── aircraft/
│ │ ├── model
│ │ └── livery
│ └── view/
│ ├── x
│ ├── y
│ └── z
├── environment/
│ ├── weather/
│ │ ├── temperature
│ │ └── wind-speed
│ └── lighting/
│ └── ambient
└── systems/
├── engine/
│ ├── rpm
│ └── throttle
└── electrical/
└── battery-voltage
这就是属性树的简化版。每个节点都有一个路径,比如 /sim/time/elapsed-sec 表示飞行经过的秒数。
为什么要用树结构?因为方便。你可以通过路径直接访问任何属性,不需要遍历整个文件。FlightGear内部就是靠这个树来实时交换数据的。
关键点:场景文件中的XML配置,最终都会被加载到属性树中。你写的 <position><latitude>39.9</latitude></position>,在属性树里就变成了 /position/latitude = 39.9。
我记得第一次调试场景时,怎么都找不到自己添加的物体。后来用FlightGear内置的"属性浏览器"一看,原来路径写错了。嗯,从那以后我养成了习惯:每次写完XML,先用属性浏览器检查一遍。
注意:属性树的路径是区分大小写的。/Position/Latitude 和 /position/latitude 是两个不同的节点。FlightGear官方推荐全部用小写。
下面这张图展示了场景文件、XML配置和属性树之间的关系:
总结一下今天的内容:
- 场景目录按经纬度网格组织,别放错位置
- XML配置用
<PropertyList>根标签,大小写要统一 - 属性树是FlightGear的"中央数据库",所有配置最终都挂在这棵树上
下次你打开FlightGear时,可以试试用内置的"属性浏览器"(默认快捷键是 Ctrl+P)看看属性树长什么样。相信我,亲手摸一遍比看十遍文档都管用。