2. 项目搭建
2026/4/14大约 3 分钟
项目搭建
本章搭建飞行模拟器的项目框架,包括推荐的目录结构、物理设置,以及如何在 Godot 中创建第一个可以在天上飞的小飞机场景。
本章你将学到
- 飞行模拟器的项目配置要点
- 目录结构规划
- 飞机场景的节点组成
- 机场场景的基本搭建
推荐目录结构
res://
├── scenes/
│ ├── aircraft/ # 各型飞机
│ │ ├── cessna_172/ # 小型螺旋桨飞机(入门机型)
│ │ ├── boeing_737/ # 中型客机
│ │ └── components/ # 共用部件(起落架、引擎等)
│ ├── airports/ # 机场场景
│ │ ├── airport_base.tscn # 机场基础模板
│ │ └── specific/ # 各个具体机场
│ ├── world/ # 世界场景
│ │ ├── terrain/ # 地形
│ │ ├── weather/ # 天气系统
│ │ └── time_of_day/ # 昼夜系统
│ └── ui/ # 驾驶舱仪表盘、菜单
├── scripts/
│ ├── aircraft/ # 飞行物理、系统脚本
│ ├── airport/ # 机场管理、ATC通信
│ ├── navigation/ # 导航系统
│ ├── weather/ # 天气模拟
│ └── building/ # 飞行建设系统
├── assets/
│ ├── models/
│ ├── textures/
│ └── sounds/
│ ├── engines/ # 各型发动机音效
│ ├── cockpit/ # 驾驶舱音效(警报、开关声)
│ └── environment/ # 环境音(风、雨)
└── autoloads/
├── FlightManager.gd # 飞行状态全局管理
├── WeatherSystem.gd # 天气系统单例
└── BuildingManager.gd # 飞行建设管理单例飞机场景节点结构
Cessna172 (RigidBody3D)
├── AircraftModel (Node3D)
│ ├── Fuselage (MeshInstance3D)
│ ├── Wings (MeshInstance3D)
│ ├── Propeller (MeshInstance3D) ← 螺旋桨(旋转动画)
│ └── LandingGear (Node3D)
│ ├── GearFront (MeshInstance3D)
│ ├── GearLeft (MeshInstance3D)
│ └── GearRight (MeshInstance3D)
├── Cockpit (Node3D) ← 驾驶舱(第一人称视角)
│ ├── CockpitCamera (Camera3D)
│ └── Instruments (Control) ← 2D仪表盘叠加层
├── EngineSystem (Node3D)
│ ├── PropellerSpin (AnimationPlayer)
│ └── EngineAudio (AudioStreamPlayer3D)
├── AerodynamicsBody (Node3D) ← 气动力计算节点
├── CollisionShape3D
└── WheelColliders (Node3D) ← 轮胎碰撞(用于地面滑行)
├── FrontWheel (VehicleWheel3D)
├── LeftWheel (VehicleWheel3D)
└── RightWheel (VehicleWheel3D)机场场景搭建
一个基本机场包含以下元素:
| 元素 | 说明 | 在 Godot 中的实现 |
|---|---|---|
| 跑道 | 硬化地面,飞机起降用 | MeshInstance3D + StaticBody3D |
| 停机坪 | 飞机停放区 | MeshInstance3D |
| 塔台 | 场景标志性建筑 | 3D模型 |
| 机库 | 飞机存放维修 | 3D模型 + 开门动画 |
| 跑道灯 | 夜间飞行指引 | OmniLight3D |
| 导航标志 | 风向袋、跑道编号 | Billboard MeshInstance3D |
项目设置
物理设置
在项目设置中调整:
| 设置 | 值 | 原因 |
|---|---|---|
| 重力 | 9.8 | 标准重力加速度 |
| 物理帧率 | 60 | 飞行物理需要高帧率才稳定 |
| 默认线速度阻尼 | 0.0 | 飞机自己处理空气阻力 |
世界坐标比例
飞行模拟器涉及非常大的距离,需要特别注意:
大世界精度问题
Godot(以及大多数游戏引擎)使用32位浮点数来存储坐标。当坐标超过10,000米时,精度开始下降,会导致物体抖动。
解决方案:使用"原点重置"技术——当飞机离世界原点太远时,把世界整体平移,让飞机始终在原点附近。
extends Node3D
## 世界原点重置管理器
## 防止飞机飞远后坐标精度丢失
class_name WorldOriginManager
@export var reset_threshold: float = 5000.0 ## 超过此距离触发重置
@export var player_aircraft: RigidBody3D
func _physics_process(_delta: float) -> void:
var player_pos := player_aircraft.global_position
# 只检查水平距离(高度不是问题)
var horizontal_dist := Vector2(player_pos.x, player_pos.z).length()
if horizontal_dist > reset_threshold:
_reset_origin(player_pos)
func _reset_origin(offset: Vector3) -> void:
## 把所有场景物体都移动相同偏移量,让飞机回到原点附近
var shift := Vector3(offset.x, 0, offset.z) ## 只平移水平分量
for node in get_tree().get_nodes_in_group("world_objects"):
node.global_position -= shift
# 飞机本身也要移动
player_aircraft.global_position -= shift下一步
项目框架搭好后,深入实现 真实飞行物理。
