Hacker News 中文摘要

RSS订阅

将Fortran F-16模拟器移植到Unity3D -- Translating a Fortran F-16 Simulator to Unity3D

文章摘要

作者将教科书《Aircraft Control and Simulation》中的F-16模拟器Fortran代码移植到Unity3D平台,基于风洞数据建立了飞行模型,包含多个查找表和数学方程。项目已在Github开源,并提供了可玩版本和演示视频。

文章总结

将Fortran F-16模拟器移植到Unity3D

项目概述

我最近购买了《Aircraft Control and Simulation》教科书,书中包含了一个基于风洞数据的F-16飞行模型。这个模型由十几个查找表和数学方程组成,但全部是用Fortran编写的。我决定将这个模拟器移植到Unity3D中。

技术实现

坐标系转换

航空航天工业使用右手坐标系(X向前,Y向右,Z向下),与Unity的坐标系不同。我编写了转换函数来处理坐标系转换:

csharp public static Vector3 ConvertVectorToAerospace(Vector3 vector) { return new Vector3(vector.z, vector.x, -vector.y); }

单位转换

美国航空航天领域使用英制单位(英尺、磅、节等),而Unity使用公制单位。我添加了单位转换函数来处理所有输入输出。

空气数据计算

模拟器需要计算动态压力和马赫数等空气数据。原始Fortran代码如下:

fortran SUBROUTINE ADC(VT,ALT,AMACH,QBAR) DATA R0/2.377E-3/ TFAC = 1.0 - 0.703E-5*ALT T = 519.0*TFAC IF(ALT.GE.35000.0) T=390.0 RHO = R0*(TFAC**4.14) AMACH=VT/SQRT(1.4*1716.3*T) QBAR = 0.5*RHO*VT*VT RETURN END

查找表插值

飞行模型广泛使用一维和二维查找表。我实现了线性插值和双线性插值算法来处理这些表格数据。

发动机模型

发动机推力通过三线性插值计算,考虑了油门位置、高度和马赫数。推力输出在怠速、军用功率和最大功率之间插值。

气动力计算

与之前的项目不同,这个模型计算的是法向力而非升力。法向力垂直于机头方向,与升力在低攻角时相似但在高攻角时差异显著。

力矩计算

模型使用查找表计算三个轴向的力矩,并考虑了阻尼效应。

飞行控制系统

由于F-16设计具有放松的静态稳定性,手动飞行几乎不可能。我实现了PID控制器来稳定飞机:

  1. 三个独立的PID控制器分别控制俯仰、偏航和滚转
  2. 使用增益调度根据空速调整滚转控制器的参数
  3. 实现了G限制器和攻角限制器来防止过度机动
  4. 添加了杆推器在接近失速时自动推杆

测试与限制

测试方法

  1. 使用教科书提供的测试用例进行单元测试
  2. 通过实际飞行测试感受飞行特性

模型限制

  1. 攻角范围有限(-10°到45°)
  2. 没有模拟襟翼和缝翼
  3. 起落架模拟简单
  4. 跨音速效应未建模

结论

这个项目展示了如何将专业的飞行模型从Fortran移植到Unity3D。虽然模型有一些限制,但它接近专业级模拟器的实现方式。通过添加飞行控制系统,即使是不稳定的飞机也能变得可飞。

完整的项目代码已开源在GitHub上,你也可以在itch.io上试玩这个模拟器。


注:本文保留了原文的技术细节和关键代码,同时简化了部分专业术语的解释,删除了重复的代码示例和与主题无关的内容。文章结构按照技术实现的逻辑顺序重新组织,使内容更加紧凑和易读。

评论总结

这篇评论总结涵盖了多个观点,主要围绕物理单位、编程语言特性和游戏开发等方面:

  1. 对物理单位的兴趣与惊讶

    • 多位用户对"slug"(斯勒格,英制质量单位)表示惊讶和兴趣(评论1、8、10)
      *"I had no idea slugs even existed"(评论1)
      *"I'm absolutely flabbergasted that this exists"(评论10)
  2. 关于航海英里的解释

    • 用户jan_g解释了1海里等于地球纬度1分的弧长(评论2)
      *"1 nautical mile equals to one minute in the 90 degrees hemisphere arc"(评论2)
  3. Fortran语言特性讨论

    • 用户赞赏Fortran支持任意起始索引的数组功能(评论3、6)
      *"That is such a useful feature!"(评论3)
      *"FORmula TRANslator..."(评论6)
  4. 游戏开发中的物理模拟

    • 用户讨论查找表在游戏物理模拟中的实用性(评论4)
      *"lookup tables can be a very powerful way for artists to interact with the physics"(评论4)
    • 也有用户质疑物理单位在计算机模拟中的重要性(评论5)
      *"As long as the simulation is internally consistent... nominal units are important at all?"(评论5)
  5. 怀旧与技术发展

    • 用户分享早期飞行模拟游戏需要数学协处理器的回忆(评论9)
      *"needed a math (FP) co-processor to play"(评论9)
    • 用户回忆母亲作为Fortran程序员的经历(评论11)
      *"My Mom was a FORTRAN programmer... doing things like that F16 simulator"(评论11)
  6. 相关项目分享

    • 用户分享了Clojure实现的太空模拟器(评论7)
      *"Here is Clojure implementation of Space Simulator"(评论7)