第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配置和属性树之间的关系:

场景文件结构关系图 场景文件 Scenery/Objects/ Scenery/Terrain/ Airport/ 解析 XML配置文件 <PropertyList> <name>...</name> <position>...</position> 加载 属性树 /position/latitude /position/longitude /position/elevation 场景文件 → XML解析 → 属性树加载 属性树展开示例 / ├── position/ │ ├── latitude = 39.9042 │ ├── longitude = 116.4074 │ └── elevation = 50

总结一下今天的内容:

  • 场景目录按经纬度网格组织,别放错位置
  • XML配置<PropertyList> 根标签,大小写要统一
  • 属性树是FlightGear的"中央数据库",所有配置最终都挂在这棵树上

下次你打开FlightGear时,可以试试用内置的"属性浏览器"(默认快捷键是 Ctrl+P)看看属性树长什么样。相信我,亲手摸一遍比看十遍文档都管用。

专注资料整理