File: acmdoc-inside.html

package info (click to toggle)
acm 6.0%2B20200416-1.2
  • links: PTS
  • area: main
  • in suites: forky, sid, trixie
  • size: 5,972 kB
  • sloc: ansic: 49,164; tcl: 941; makefile: 644; sh: 594
file content (2192 lines) | stat: -rw-r--r-- 63,764 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
<html>
<head>
<link rel="stylesheet" href="acmdoc-styles.css">
<title>ACM - Inside the program</title>
</head>
<body>
<h1>ACM - Inside the program</h1>
<p align=right>
	by Riley Rainey
	<br>updated by Umberto Salsi
</p>


<h2>Contents</h2>
<a href="acmdoc.html">Back to general contents</a>
<blockquote>
<a href="#geodeticcoordinatesandthewgs84ellipsoid">Geodetic coordinates and the WGS-84 ellipsoid</a><br>
<a href="#definingnewzones">Defining new zones</a><br>
<a href="#definingnewscenes">Defining new scenes</a><br>
<a href="#definingnewaircraft">Defining new aircraft</a><br>
<blockquote style="margin-top: 0; margin-bottom: 0;">
<a href="#frameandaerodynamics">Frame and aerodynamics</a><br>
<a href="#engine">Engine</a><br>
<a href="#landinggear">Landing gear</a><br>
<a href="#armament">Armament</a><br>
</blockquote>
<a href="#definingnewobjects">Defining new objects</a><br>
<a href="#ieee12781discompliance">IEEE 1278.1 (DIS) compliance</a><br>
<a href="#suggestedfurtherreading">Suggested further reading</a><br>
</blockquote>


<a name="geodeticcoordinatesandthewgs84ellipsoid"></a>
<h2>Geodetic coordinates and the WGS-84 ellipsoid</h2>

<p>
	The WGS-84 defines a reference shape for the Earth which is very close to the real shape of our planet; the concepts of local vertical, local horizontal plane, altitude and longitude are all referred to this ideal shape named <i>geodetic ellipsoid</i>. The figure below illustrates the right-handed Cartesian reference centered on the geodetic ellipsoid:
</p>


<center style="margin: 2em;">
	<img src="acmdoc-ellipsoid.svg">
	<br><b>The WGS-84 geodetic ellipsoid. In this figure, P=[x,0,z].</b>
</center>

<p>
	The surface of this ellipsoid are the solutions of the equation
	x<sup>2</sup>/a<sup>2</sup> + y<sup>2</sup>/a<sup>2</sup> + z<sup>2</sup>/b<sup>2</sup> = 1 where "a" is the length of the major semi-axis (or equatorial semi-axis) and "b" is the length of the minor semi-axis (or polar semi-axis):
</p>

<blockquote>
	a = 6378137.0000 m<br>
	b = 6356752.3142 m
</blockquote>

<p>
	These values, although very close to the real size of the Earth, are by definition of the WGS-84 model. Although very accurate measurements of the Earth are available and the actual shape of the Earth, named <i>geoid</i>, is known with very high precision, such an accuracy does not make much difference in most practical applications and is negligible. So in general any measurement of latitude, longitude and altitude, if not otherwise stated, is to be intended as <i>geodetic</i>, that is refereed to the WGS-84 ellipsoid.
</p>

<p>
The north pole is located at Cartesian coordinates [0,0,b] and the south pole is located at [0,0,-b]. The rightmost point [a,0,0] has latitude zero and longitude zero; the Greenwich meridian crosses this point joining the two poles.
</p>

<p>
	For any point P=[x,y,z] in the Cartesian reference, a corresponding mapping to the geographic coordinates [lat,lon,alt] has to be defined. First, the <u>local vertical</u> is the line crossing P and perpendicular to the surface of the ellipsoid in its point A; the tangent plane to this point is the local horizontal plane at altitude zero. The local vertical line is the local plumb line. Note that the vertical line in this model, just like on our real planet, does not cross the center of the ellipsoid but intersects the x axis at some point B.
</p>

<p>
	The <b>latitude</b> is defined as the angle between the local vertical and the xy plane. Calculating this latitude given the Cartesian coordinates is not simple; curious may look at the module <tt>src/dis/dis/earth</tt> in the sources of ACM. Latitudes range from 90S at the south pole, up to 90N at the north pole. The 0N latitude (or 0S if you prefer) is the equator.
</p>

<p>
The <b>longitude</b> is defined as the angle between the point P and the xz plane measured around the z axis: lon=atan(y/x). No surprises here. Longitudes range from 180 degrees west up to 180 degrees east; obviously the 180W meridian coincides with the 180E meridian. The 0E meridian (or 0W if you prefer) is named Greenwich meridian.
</p>

<p>
	The <b>mean sea level</b> (MSL) is the surface of the ellipsoid; <b>altitudes</b> are measured as distance of the point P from the local horizon beneath it. All altitudes under ACM are intended referred to this MSL.
</p>

<p>
The <b>local terrain altitude</b> (measured vs. the MSL, of course) varies from point to point. ACM looks at the altitude of the nearest runway within 100 NM to determine the terrain altitude; if none found, it assumes zero. Negative altitudes are also possible.
</p>


<a name='definingnewzones'></a>
<h2>Defining new zones</h2>

<p>
	A <b>zone</b> is a range of longitude and latitude bound to the <b>scenery</b> file where the items inside the zone are listed. Sceneries are dynamically loaded and un-loaded by the program as necessary as the plane moves around the globe.
</p>

<p>
As the program starts and initializes, it looks for a zones file named <tt>zones.txt</tt> normally located under the <tt>objects/</tt> directory. The zones files lists all the zones that are available to the program along with the range of geodetic coordinates the scene covers, for example:
</p>

<blockquote><pre>
# zones.txt file:
35N  40N  125W  120W  zones/usa/sfrancisco.txt
30N  35N  120W  115W  zones/usa/losangeles.txt
35N  40N  120W  115W  zones/usa/lasvegaswest.txt
#35N  40N  115W  110W  zones/usa/lasvegaseast.txt
30N  35N  115W  110W  zones/usa/tucson.txt
30N  35N  100W  095W  zones/usa/dallas.txt
40N  45N  075W  070W  zones/usa/newyork.txt
35N  47N  006E  019E  zones/europe/italy.txt
30N  35N  040E  045E  zones/middleeast/iraq.txt
</pre></blockquote>

<p>
	The Italy scenery file has been compiled by hand.
	The Iraq scenery only contains some sample runways and it is otherwise incomplete.
	All the USA sceneries have been generated automatically from the FAA data base using the the program available under <tt>tools/faaairports</tt>; further zones covering the USA territory can be added in the same way.
</p>

<p>
The image below summarizes the currently defines zones, but other might be added in future release and others can be added by the player itself:
</p>

<center style='margin: 2em;'>
<img src="acmdoc-zones.jpeg">
<br><b>Zones defined by the sample zones file contents above.</b>
</center>

<p>
	As the simulated aircraft flies, any zone within 200 NM from the aircraft is loaded and made available to the simulation, so runways, radio stations and features therein defined enter the simulation: runways can be seen, radio stations can be tuned, etc. Zones left behind or too far away are un-loaded from memory.
</p>

<p>
The zones file is a simple text file organized by lines, each line representing a zone with 5 fields:
</p>

<ol>
<li>Minimum latitude covered.</li>
<li>Maximum latitude covered.</li>
<li>Minimum longitude covered.</li>
<li>Maximum longitude covered.</li>
<li>File name of the scenery as path relative to this file. Example:
	"<tt>../../myscene.txt</tt>". The extension of the file does not
	really matter. White spaces are not allowed inside the path.</li>
</ol>

<p>
Latitude and longitudes can be indicated in several ways, here are some
examples:
</p>

<blockquote><pre>
10N     10-20-30.400S     30.500S
10E     10-20-30.400W     30.500W
</pre></blockquote>

<p>
Fields must be separated by at least one white space. Apart from that, white
spaces are ignored. Empty lines and lines beginning with '#' are ignored.
</p>

<p>
Notes and restrictions
</p>

<ul>
	<li>The program gives error is the latitude or longitude fields are
	not valid or out of the range.</li>
	<li>The program gives error if the file path of a scenery file cannot
		be resolved. The existence and readability of each scenery file
	is checked as the program starts; their content is checked only whenever
	the scenery file is loaded.</li>
	<li>The program gives error if any two zones overlap.</li>
	<li>The right and upper edge of the range does not belong to the zone, so a new zone can safely be defined next to the other.</li>
	<li>Items defined in the scenery of a zone must lie inside the range of
	geographical coordinates of the zone. The points in the right and upper edges does not belong to the zone. The program gives a non-fatal error if an item lies outside the zone. For runways, the reference point is their center; for ILS, the reference point is the locator.</li>
</ul>

<p>
	Note that for extended items, some of their points may lie outside the zone. For example, although the center of the runway must be in, one or both of its ends can be out; the locator of the ILS must be in, but the corresponding glide slope antenna can be out.
</p>

<p>
	Note that the maximum latitude is 90N, the north pole; if a zone extends
	up to this limit, its upper edge is a point. Due to the rules above, the north pole does not belong to the zone, and there is no way to put an
	item at that exact location; this does not seem to be a severe
	limitation, though.
</p>

<blockquote style="border-style: solid; padding: 0.5em">
	<b>Don't try to fly over the poles!</b>
	There is a know bug in the program that prevents to fly over the poles.
	Near to these locations (below 1 NM), the computation of the aircraft's next step fails and the aircraft tilts unpredictably, mostly crashing -- look at the comments in the <tt>src/dis/dis/earth</tt> for more.
</blockquote>

<p>
There is no limit to the number of zones that can be defined. If each zone covers a 5x5 DEG range of latitude and longitude, considering only the range of latitudes [80S,80N], and since 70% of the Earth is covered by water, one may expect the maximum number of zone that might be needed to cover all the globe be about 692.
</p>


<a name=definingnewscenes></a>
<h2>Defining new scenes</h2>

<p>
The scene file defines the contents of a zone. It should be stored as a ASCII
text file. Every record occupies exactly one line, with leading and trailing
spaces ignored. Fields in a record are separated by one or more spaces or
tabulation characters. Empty lines and lines beginning with the character '#'
are ignored.
</p>

<h3>Team Locations</h3>

<p>
Friendly and Opposing DIS participants may have a resupply base where to get fuel, munitions a repairs. Servicing starts as the aircraft stops close enough to the specified location. Typically, these location will be positioned and oriented at the end of a runway at the player's air force base airport. Example:
</p>

<blockquote>
<pre>
# Friendly air force base:
TEAM1_LOC 32-58-18.798N 096-50-16.604W 0 0
# Opposing air force base:
TEAM2_LOC 33-58-00.000N 097-50-00.000W 0 0
</pre>
</blockquote>

Fields:

<blockquote>
0 Type: TEAM1_LOC, TEAM2_LOC<br>
1 Latitude<br>
2 Longitude<br>
3 Initial Altitude MSL (ft) (this value ignored)<br>
4 Initial Heading (degrees, true) (this value ignored)
</blockquote>



<h3>Ground Color</h3>

<p>
An X11-style <code>#<i>RRGGBB</i></code> color specification defining
the color of the ground.  Red, green and blue color components are
hexadecimal value from 00 to FF.  Example:
</p>

<blockquote>
<code>
GROUND_COLOR #305030
</code>
</blockquote>

Fields:
<blockquote>
0 Type: GROUND_COLOR<br>
1 Color
</blockquote>


<h3>Runway record</h3>

<p>
The record entry of the ACM scene describing a runway can take two forms,
depending on the available informations: the old one (RWY) and the new
one (RWY2). The RWY format requires the geographic coordinates of both
the ends of the runway. The RWY2 requires only the center of the runway
and its true heading.  The syntax of the runway identifier (field no. 2)
must be of the form:
</p>

<blockquote>
<i>H</i>[<i>S</i>]<b>/</b><i>H</i>[<i>S</i>]
</blockquote>

<p>
where <i>H</i> is the heading (an integral number between 1 and 36)
and <i>S</i> is a capital letter ("L", "C" or "R"). The <i>S</i> part
of the identifier is optional.
A leading "0" in an identifier is allowed.
The runway identifiers can be specified in any order.
</p>



Example of the RWY record format:

<blockquote>
<code>
RWY ADS 15/33  644 7202 100 32-58-40.245N 096-50-25.820W 32-57-33.383N 096-49-56.608W
</code>
</blockquote>

Fields of the RWY record:
<blockquote>
0 Record Identifier: RWY<br>
1 Three/Four letter airport code<br>
2 Runway identifier<br>
3 Runway Altitude (ft, MSL)<br>
4 Runway Length (ft)<br>
5 Runway Width (ft)<br>
6 Near End Latitude<br>
7 Near End Longitude<br>
8 Reciprocal End Latitude<br>
9 Reciprocal End Longitude<br>
</blockquote>


Example of the RWY2 record format (same runway):

<blockquote>
<code>
RWY2 ADS 15/33 644 7202 100 32-58-06.81N 096-50-11.21W 160.0
</code>
</blockquote>

Fields of the RWY2 record:
<blockquote>
0 Record Identifier: RWY2<br>
1 Three/Four letter airport code<br>
2 Runway identifier<br>
3 Runway Altitude of the Center (ft, MSL)<br>
4 Runway Length (ft)<br>
5 Runway Width (ft)<br>
6 Latitude of the Center<br>
7 Longitude of the Center<br>
8 Runway geographical heading (DEG)
</blockquote>

<p>
The model of the terrain simulated by ACM is very simple and efficient:
the elevation of the nearest runway gives the local terrain altitude,
the distance being calculated relatively to the center of the runway.
Nevertheless, this behavior has a strange implication: between two runways
at different altitudes there is a <i>step line</i> where the local
altitude suddenly change.  Crossing this step line taxing on the ground,
the aircraft would crash its landing gear.
</p>

<p>
In the figure below the terrain to the left side of the step line has
elevation 500 feet, while the terrain in the other side has elevation
510 feet. Unfortunately in this case we have a problem, since the step
line crosses both the runways.
</p>

<pre>

</pre>
<center>
<img src="acmdoc_html-runway_step.png">
<p>
<b>The problem of the step line crossing the runways.</b>
</center>
<pre>

</pre>

<p>
The only practical solution to this problem is to keep all the runways
of a given airport at the same exact altitude.
</p>


<h3>Navaid Record</h3>

<p>
A "NAV" record may be a VOR, a DME or a NDB.  The TACAN stations of the
ACM world behave simply as VOR/DME stations.
VOR and ILS stations frequency ranges from 108.00 MHz up to 117.95 MHz.
</p>

<p>
OMARKER, MMARKER and IMARKER are just like NDB stations but with limited
range (20 NM rather than 100 NM).  NDB station frequency ranges from 200
KHz up to 529 KHz. This latter upper limit is a rather arbitrary value
set in ACM, but most of the stations do not exceed 415 KHz.
</p>

Example:

<blockquote>
<pre>
NAV TTT VOR/DME 32-52-08.98N 097-02-25.81W 540 113.10 -
NAV FWH TACAN   32-46-17.46N 097-26-22.07W 663 108.7  024X
NAV RBD NDB     32-40-36.98N 096-52-15.91W 670 287    -
</pre>
</blockquote>

Fields:

<blockquote>
0 Record Identifier: NAV<br>
1 Up to four letters identifier<br>
2 NAVAID Type: VOR, DME, VOR/DME, VORTAC (=VOR+DME), TACAN (=VOR+DME), NDB,
	OMARKER (=NDB), MMARKER (=NDB), IMARKER (=NDB)<br>
3 Transmitter Latitude<br>
4 Transmitter Longitude<br>
5 Transmitter Altitude (ft, MSL)<br>
6 VHF Frequency (MHz for VOR/DME/ILS stations and KHz for NDB)<br>
7 TACAN channel number, or '-' if not available. Ignored by ACM anyway.
</blockquote>



<h3>ILS Record</h3>

<p>
An ILS (instrumental landing system) is a LOCALIZER antenna (emitting the signal
giving the right heading toward the runway) that may include also a glide slope
antenna (GS, giving the deviation from the glide plane) and a DME antenna.
</p>

<pre>

</pre>
<center>
<img src="acmdoc_html-ils.png">
<p>
<b>Typical ILS arrangement around the runway.</b>
</center>
<pre>

</pre>

<p>
In the real world, each antenna has its latitude, longitude and elevation,
but under ACM the simplified ILS record does not allow to specify the
location of the DME antenna and provides only one elevation field whose value is
shared among the LOCALIZER, the GS and the DME antenna; the distance displayed
by ACM actually is the distance from the LOCALIZER.
The recommended workaround is to indicate the elevation of the GS antenna to allow
precise landing at the expected distance from the threshold;
if not available, the elevation of the DME antenna should be indicated for closer
match between displayed distance and the expected value;
finally, the elevation of the LOCALIZER antenna can be indicated.
Limitations and recommendations are detailed below.
</p>

<p>
<b>The LOCALIZER antenna</b> is normally located near the reciprocal end of the runway
and the signal is normally aligned with the centerline of the runway.
The exceptions are the LDA and SDF antennas which may deviate from the centerline
of the runway or even be completely unrelated with any runway at all.
</p>

<p>
<b>The GS antenna,</b> when available, is normally located near the side of the runway threshold.
The elevation of this antenna is critical in order to land at the specified
spot on the runway, so its value should be indicated when available.
</p>

<p>
<b>The DME antenna,</b> when available, is always assumed to be
coincident with the LOCALIZER antenna; there is no way to specify another
location, so the distance displayed in the program may differ from the
official navigation charts.
</p>

<pre>

</pre>
<center>
<table border='1' width='70%' cellpadding='5' cellspacing='0'>
	<tr>
		<th>Type</th>
		<th>Description</th>
	</tr>
	<tr>
		<td valign='top'>
			LOCALIZER<br>
			LDA<br>
			SDF
		</td>
		<td valign='top'>
			LOCALIZER antenna only available. LDA and SDF are handled just like
			a LOCALIZER, the only difference is that the chart generator program
			is advised a corresponding runway end may not be available for this ILS
			and so no error should be emitted. The elevation field should be set
			with the elevation of the locator antenna.
		</td>
	</tr>
	<tr>
		<td valign='top'>
			ILS<br>
			LOC/GS
		</td>
		<td valign='top'>
			LOCALIZER and GS antennas both available. The elevation field should
			specify the elevation of the GS antenna, when available.
		</td>
	</tr>
	<tr>
		<td valign='top'>
			LOC/DME<br>
			LDA/DME<br>
			SDF/DME
		</td>
		<td valign='top'>
			LOCALIZER and DME antennas both available. LDA and SDF are handled just like
			a LOCALIZER, the only difference is that the chart generator program
			is advised a corresponding runway end may not be available for this ILS
			and so no error should be emitted. The elevation field should
			specify the elevation of the DME antenna, when available, or the
			elevation of the LOCALIZER otherwise.
		</td>
	</tr>
	<tr>
		<td valign='top'>
			ILS/DME
		</td>
		<td valign='top'>
			LOCALIZER, GS and DME antennas available. The elevation field should
			specify the elevation of the GS antenna when available, or the
			elevation of the DME or of the LOCALIZER (in this order of preference).
		</td>
	</tr>
</table>
	<b>Types of ILS record.</b>
</center>
<pre>

</pre>
	



Example:
<blockquote>
<code>
ILS 30 ILS IAIW 108.9 34-18-47.161N 097-01-38.280W 34-17-59.533N
097-00-35.018W 729.2 4.92 315.5 3.00
</code>
</blockquote>

Fields:

<blockquote>
0 Record Identifier: 'ILS'<br>
1 Runway Identifier:<br>
2 ILS Type: see table above<br>
3 Four letter Identifier<br>
4 VHF Frequency (MHz)<br>
5 Localizer Transmitter Latitude<br>
6 Localizer Transmitter Longitude<br>
7 Glide Slope Transmitter Latitude ('-' for Localizer-only approaches)<br>
8 Glide Slope Transmitter Longitude ('-' for Localizer-only
approaches)<br>
9 Glide slope antenna elevation when available, or localizer antenna elevation
(ft, MSL)<br>
10 Localizer beam width (DEG)<br>
11 Localizer geographic bearing (DEG)<br>
12 Glide slope angle (DEG) ('-' for Localizer-only
approaches)
</blockquote>


<h3>Features</h3>

Use feature records to place objects in an ACM scene.  Example:

<blockquote>
<code>FEATURE features/tower.obv 32-58-04.800N 096-50-16.800W 644 0
</code>
</blockquote>

Fields:

<blockquote>
0 Record identifier: FEATURE<br>
1 Object filename, either absolute or relative to the scene file<br>
2 Latitude<br>
3 Longitude<br>
4 Altitude (ft, MSL)<br>
5 Orientation angle (degrees, true)
</blockquote>




<a name=definingnewaircraft></a>
<h2>Defining new aircraft</h2>

<p>
	The ACM program loads all the aircraft models defined in the <tt>aircraft.txt</tt> file; this file is searched in all the specified object directories. Lines beginning with <tt>#</tt> are ignored by the program and can be used to add comments.
</p>

<p>
	The inventory file may contain several include and aircraft records. The include record has syntax
</p>

<blockquote>
	<tt>include "some/other/file"</tt>
</blockquote>

<p>
	and allows to include the content of other inventory files in a more structured way. The path can be relative to the current inventory file. The aircraft record is described below in detail.
</p>

<p>
The stout-of-heart may be interested in creating new aircraft types. Some
of this information must be generated by hand, but I did create a program
to help me generate aircraft objects: GEDIT. GEDIT is a rudimentary
Motif program that allows you to create 3-dimensional objects. It is
available in the directory <code>gedit</code> of the distributed package.
</p>

<p>
The syntax of the aircraft record is more articulated. The program does not complain about missing numeric values,
and they are assumed to be zero.
</p>

<blockquote><pre>
# Aircraft Inventory for ACM-6
# See ACM-Bibliography for further information about the sources of this
# information.
# MiG-29 Fulcrum
# MiG-29M information was derived from two sources: [Spick87] and [AirI Aug92].

aircraft "MiG-29" {
    Description "Mikoyan-Guryevich MiG-29M Fulcrum"
    Object "mig29.obj"
</pre></blockquote>


<p>
The visual description of an ACM aircraft is stored separately in
V-library format and specified in the <tt>Object</tt> field. The name of the file may include a relative path which is resolved against the directory of the current file. This file describes a set of polygons that roughly
approximates the shape of the actual aircraft. I used GEDIT to create
most of the ACM aircraft objects. If not available, you may leave this parameter commented-out, but the UFO object will be displayed instead...
</p>


<a name="frameandaerodynamics"><h3>Frame and aerodynamics</h3></a>

<blockquote><pre>
    WingArea     400.0     # (wingS) Wing surface area (ft<sup>2</sup>)
    WingHalfSpan 18.87     # (wings) Wing half-span (ft)
    WingHeight    0.0      # (wingh) Height of the wing aerodynamic center
                           #    above the CM (ft)
    Chord        9.61      # (c) Mean geometric chord of wing (ft)
    AspectRatio  3.56      # (aspectRatio) aspect ratio
    EmptyWeight  22500.0   # (emptyWeight) Empty mass (lb)
</pre></blockquote>


<p>
These values are usually quoted with an aircraft's performance figures.
The <code>WingHeight</code> is used to estimate the ground effect, and
its value is positive for wings above the center of mass.
</p>

<blockquote><pre>
    # Max. wing load (lb):
    MaxLoadZPositive    273000  # 10*(EmptyWeight+50%*MaxFuel) (+10 g)
    MaxLoadZNegative    137000  # 5*(EmptyWeight+50%*MaxFuel) (-5 g)
</pre></blockquote>

<p>
The maximum vertical load, either positive climbing (<code>MaxLoadZPositive</code>)
or negative diving (<code>MaxLoadZNegative</code>). If the weight the wings have
to sustain is greater than that, the structure suddenly breaks and the
aircraft gets destroyed.
</p>

<p>
For <b>civil aircraft</b> you may guess these values as 2.5*MTOW and
1.0*MTOW. <b>Military aircraft,</b> and fighters expecially, are reported to
sustain up to some number N of positive "g" and some other number Q of
negative "g". If not indicated, you should suppose at least 60% of the fuel
contributing to the mass:
</p>

<blockquote>
MaxLoadZPositive = N * (EmptyWeight + 60%*MaxFuel)<br>
MaxLoadZNegative = Q * (EmptyWeight + 60%*MaxFuel)
</blockquote>

<p>
where typical values for N range from 7 to 10, and Q=3.
</p>


<pre>

</pre>
<center>
<img src="acmdoc_html-reference-frame.png">
<p>
<b>The reference frame of the aircraft, with main inertial axes<br>
and center of mass (CM) indicated.</b>
</p>
</center>
<pre>

</pre>


<blockquote><pre>
    # (I(x,y,z)) Moments of inertia (lb ft<sup>2</sup>)
    Ixx 10000
    Iyy 75000
    Izz 80000
</pre></blockquote>

<p>
These are hard values to simple guess. I have grabbed values where they
were available and simply guessed sometimes, too.  Moments of inertia
in an actual aircraft are not constant. Most notably, as an aircraft
burns fuel, it's weight distribution, center-of-gravity, and moments of
inertia change. In ACM, however, moments of inertia and CM do not change.
</p>

<blockquote><pre>
    # (cFlap) Lift due to flaps (yields Clift of 1.0 at max extension)
    CFlap 0.64279
    BetaStall     15.0    # (deg) Stall angle for rudder
    CFlapDrag     0.0467  # (cFlapDrag) Drag due to Flaps
    CGearDrag     0.03    # (cGearDrag) Drag due to Gear
    CSpeedBrake   0.03    # (cSpeedBrake) Drag due to Speed Brake
                          # at 90 degrees


    # (CDb) Drag Characteristic equation [Wave+body]
    # independent variable is mach number

    CDb {                 # (CDb) Drag Characteristic equation [Wave+body]
        # independent variable is mach number
        0.0, 0.020,
        0.2, 0.020,
        0.95, 0.015,
        1.05, 0.045,
        2.00, 0.030,
        10.0, 0.030
    }
</pre></blockquote>


<p>
In ACM, wave/body drag coefficient is a function of the airspeed expressed
as a Mach number. Less drag makes for a faster aircraft.  This function
generally has a maximum near Mach 1.0. You probably should not change
this table unless you really know what you're doing.
<br>
For the CFlap coefficient see below.
</p>

<blockquote><pre>
    CLift {               # (CLift) Lift-slope curve (vs alpha)
        -3.0, 0.0,
        -1.05, 0.0,
        -0.576, -2.199,
        -0.556, -2.23,
        -0.524, -2.199,
        0.524, 2.199,
        0.556, 2.23,
        0.576, 2.199,
        1.05, 0.0,
        2.0, 0.0
    }
</pre></blockquote>


<p>
In ACM, the coefficient of lift is purely a function of angle of attack (alpha).
The CLift table gives the coefficient of lift for some values
of the AoA "alpha". In the example above, the maximum coefficient of lift is
2.23 at 0.556 RAD = 32 DEG of AoA. Above this angle, the lift drops abruptly
and the plane stalls. The coefficient of lift also depends on the current
flap deflection angle according to the function:
</p>

<blockquote>
C<sub>L</sub> = CLift(<i>alpha</i>) + sin(<i>flaps</i>) * CFlap
</blockquote>

<p>
being CLift(<i>alpha</i>) the interpolated value given by the <tt>CLift</tt>
table above.
The total lift force is given by the equation:
</p>

<blockquote>
<i>L</i> = 1/2 r WingArea V<sup>2</sup> C<sub>L</sub>
</blockquote>

<p>
where r is the air density (r=1.225 Kg/m<sup>3</sup> at sea level), V is the
airspeed and C<sub>L</sub> is the coefficient of lift.
</p>

<blockquote><pre>
    CnBeta { # (CnBeta) Yaw moment due to sideslip equation
        0, -0.08125,
        0.523540, -0.078125,
        0.785340, -0.0609375,
        1.047198, 0.125,
        1.58, 0.0
    }
</pre></blockquote>

<p>
In ACM negative yaw due to sideslip means that the aircraft is
"weathercock stable", that is, the aircraft tends to yaw in a way that
reduces the sideslip component.
</p>


<blockquote><pre>
    ClBeta { # (ClBeta) Roll moment due to sideslip equation
        0, -0.0125,
        0.43633, -0.015,
        0.78540, 0.125,
        1.58, 0.0,
        3.142, 0.125,
    }
</pre></blockquote>



<p>
A negative value means that the aircraft will roll in the opposite direction
of the sideslip component, tending to make the aircraft more stable.
</p>


<blockquote><pre>
    CDBOrigin   0       # (CDBOrigin, CDBFactor) Drag due to sideslip
    CDBFactor   0.5
    CDBPhase    0       # (CDBPhase) sideslip drag phase (deg)
</pre></blockquote>

CDB values define the body drag added by sideslip on the aircraft.

<blockquote><pre>
    CYBeta      -0.85   # (CYbeta) Side-force from side-slip [dCY/dBeta]
</pre></blockquote>

<p>
CYBeta is the "lift" due to sideslip. This is the factor that allows
to roll 90 degrees from level, kick the rudder a lot, and still stay
level. Not all simulators take this into account.
</p>

<blockquote><pre>
    EffElevator   0.60 # (effElevator) Elevator effectiveness
    CmAlpha      -0.30 # (cmSlope) CmAlpha curve slope
    EffRudder     0.35 # (effRudder) Rudder effectiveness
    MaxRudder     20   # (maxRudder) max Rudder (deg)
    MaxAileron    20   # (maxAileron) max Aileron (deg)
    MaxFlap       20   # (maxFlap) max flap setting (deg)

    # (flapRate) flap extension rate (about 2 secs to fully extend flaps)
    FlapRate      10   # (deg/s)

    MaxSpeedBrake 80   # (maxSpeedBrake) max Speed Brake setting (deg)

    # (speedBrakeRate) rate of speed brake extension (2 secs to full ext)
    SpeedBrakeRate 40  # (deg/s)

    # (speedBrakeIncr) speed Brake increment per keystroke
    SpeedBrakeIncr 80  # (deg)
</pre></blockquote>

<p>
These values determine the characteristics of the aircraft's speed
brakes (speed brakes are used in the air, wheel brakes are used on the
ground). MaxSpeedBrake determines the maximum extension of the speed
brake panels. SpeedBrakeIncr determines how far one press of the <b>s</b>
key will increase the speed brake extension. It does not need to be an
even increment of MaxSpeedBrake. SpeedBrakeRate determines how fast
the brakes will deploy or retract.
</p>

<blockquote><pre>
    Clda  0.048 # (Clda) roll moment from aileron offset
    Cldr  0.004 # (Cldr) roll moment from rudder offset
    Clp   -0.27 # (Clp) roll damping
    Cmq   -8.0  # (Cmq) pitch damping factor
    Cnr   -2.0  # (Cnr) yaw damping factor
</pre></blockquote>

<p>
These factors characterize some of the roll, pitch and yaw characteristics
of the aircraft. They are in the NACA form. Damping factors determine how
quickly an aircraft returns to a steady state after some change in control
input. Larger negative damping factors make for a more stable aircraft.
</p>


<blockquote><pre>
    # Speed limits at MTOW. Leave undefined or set to 0 if unknown.
    MTOW  32250.0    # maximum takeoff weight (lb)
    #Vs0     42.0    # stall speed, full flaps (kt)
    #Vs1     50.0    # stall speed, no flaps (kt)
    #Vfe    100.0    # max speed with flaps extended (kt)
    #Vno    145.0    # normal operation speed (kt)
    #Vne    164.0    # never exceed speed (kt)
</pre></blockquote>

<p>
These parameters allow the program to set or calculate several speed limits (IAS).
These speed limits are used to draw the colored arcs on the air speed
indicator. Every arc is displayed only if its start and end are known, and
it is now drawn otherwise.
These speed limits are also considered to simulate structural failures
when exceeded, as detailed below.
Leave commented-out or set to 0 the parameters that are unknown: the program
will try to guess the missing values or simply will left them undefined
if this guess is not possible.
</p>

<p>
<b>MTOW</b> is the maximum take off weight (lb).
</p>

<p>
<b>Vs0</b> is the stall speed at MTOW, full flaps, at sea level.
It is indicated by the beginning of the white arc in the anemometer.
If undefined or set to zero, the program tries to calculate this value
with the following formula:
</p>

<blockquote>
Vs0 = sqrt( 2 MTOW earth_g / (r WingArea C<sub>L</sub>) )
</blockquote>

where:

<blockquote>
earth_g is the gravity acceleration at sea level.<br>
r is the air density at sea level.<br>
C<sub>L</sub> is the lift coefficient calculated with:<br>
C<sub>L</sub> = maxCLift + CFlap sin(MaxFlap)<br>
being maxCLift the maximum coefficient of lift as given by the CLift curve.
</blockquote>

<p>
<b>Vs1</b> is the stall speed at MTOW, without flaps, at sea level.
It is indicated by the end of the short white arc in the anemometer.
If undefined or set to zero, the program calculates this value with
the following formula:
</p>

<blockquote>
Vs1 = sqrt( 2 MTOW earth_g / (r WingArea maxCLift) )
</blockquote>

<p>
<b>Vfe</b> is the maximum speed with flaps extended.
It is indicated by the end of the longer white arc in the anemometer.
Exceeding this speed with flaps deployed, also partially, causes a flaps
failure that makes them unusable.
If undefined or set to 0, the Vfe is unlimited.
</p>

<p>
<b>Vno</b> is the normal operation speed, that is the maximum speed in
turbolent air conditions.
It is indicated by the beginning of the yellow arc in the anemometer.
Flying above this speed in turbulent air, a vertical wind gust of 30 ft/s 
would cause a vertical positive or negative acceleration above the
maximum structural load capacity of the wings.
If undefined or set to 0, the Vno is estimated with the following formula:
</p>

<blockquote>
Vno = 2 earth_g (MaxLoadZNegative + EmptyWeight) / (r WingArea * b * MAX_GUST)
</blockquote>

where:

<blockquote>
b = 6.302 is the slope of the CLift curve in its linear range; this value was
actually calculated for the C-172RG but it is also very close to that of the
other aircraft models, so it is assumed as constant.<br>
MAX_GUST = 30 ft/s is the conventional maximum vertical wind gust intensity
assumed as reference to calculate Vno.
</blockquote>

<p>
<b>Vne</b> is the speed that must never be exceeded.
It is indicated by a short red line.
Flying above this speed limit the aircraft may suffer a catastrophic structural
failure.
If undefined or set to zero, this limit does not apply.
</p>


<blockquote><pre>
    # (viewPoint) pilot's viewing location
    ViewPoint { 14.75, 0, -5.375 }
</pre></blockquote>

<p>
This is the location of the pilot's eye view outside of the cockpit.
</p>


<blockquote><pre>
    # (tailExtent) as we rotate, this part may drag
    TailExtent { -18.165, 0.0, 1.191 }
</pre></blockquote>

<p>
This defines where the aft-most lower part of the aircraft is
located.  This is the part of the aircraft that may scrape the ground as
we rotate. This value is not currently used. Instead we simply limit
up-pitch on the ground to 20 degrees.
</p>


<a name="engine"><h3>Engine</h3></a>

<blockquote><pre>
    EngineType "GenericJetEngine"

    MaxFuel  9750  # (maxFuel) maximum internal fuel (lb)

    # engine lag factor (how fast does it respond to throttle changes
    EngineLag -3.0

    # Engine data based on updated RD-33K engines cited in [AirI Aug89].
    # (maxThrust) max static thrust, military power (lbf)
    MaxThrust 27000

    # (maxABThrust) max static thrust, afterburner on (lbf)
    MaxABThrust 44000

    HasThrustReverser 0 # 0=no (default), 1=yes
</pre></blockquote>


<p>
This section describes the engine and its performances. One among these
types of engine can be chosen:
</p>

<dl>
	
<dt><tt>EngineType "NoEngine"</tt></dt>
<dd>Basically, a glider. The remaining engines parameters are then
ignored. This is the default.</dd>
	
<dt><tt>EngineType "GenericPistonEngine"</tt></dt>
<dd>Propeller driven aircraft with pistons engine. Its
thrust is proportional to the current RPM and to the factor
(&rho;<sub>h</sub>/&rho;<sub>0</sub>)<sup>1.6</sup>, being
&rho;<sub>h</sub> the air density at the current altitude and
&rho;<sub>0</sub> the air density at sea level.</dd>

<dt><tt>EngineType "GenericJetEngine"</tt></dt>
<dd>Jet engine. Its thrust is proportional to the square of the current RPM
and to the ratio between air density at the given altitude and air density
at sea level.</dd>

<dt><tt>EngineType "GenericRocketEngine"</tt></dt>
<dd>Rocket engine. Its thrust is proportional to the indicated fuel pump
RPM. Thrust does not depend on altitude, so this aircraft can fly up to
the edge of the space before loosing directional control.</dd>

</dl>


<p>
Maximum static military and afterburner thrust values can usually be
found in documents that describe aircraft performance.
Setting <code>MaxABThrust</code> to the same value of <code>MaxThrust</code>
disable the AB for those aircraft that lack this device.
For the conversions, remember that 1 pound = 1 lb g = 4.448 N = 0.4536 Kgf.
</p>

<p>
The <code>HasThrustReverser</code> parameter tells if the aircraft has a thrust
reverse device. Set to 1 if available or 0 if not. If this parameter is missing
the default is "no". With thrust reverse deployed and engine at the max power,
the resulting reverse thrust is calculated as 50% of the max forward thrust.
</p>

<blockquote><pre>
    Thrust {        # (Thrust) Mach Number vs. thrust
        0,   1,
        1.7, 1.5,
        2.0, 0.84,
        5,   0.5
    }

    ABThrust {      # (ABThrust) afterburner thrust table
        0,   1,
        0.5, 1,
        1,   1.21,
        1.7, 1.7,
        5,   1.64
    }
</pre></blockquote>

<p>
The Thrust and ABThrust corrects the static thrust value for the
aircraft's Mach number. Unless you have hard information about this,
leave these fields alone. The <code>ABThrust</code> table is ignored when
the AB device is disabled.
</p>

<blockquote><pre>
    # (spFuelConsump) specific fuel consump(lb fuel/lb T x hr)
    SpFuelConsump    0.68

    # (spABFuelConsump) AB specific fuel consump(lb fuel/lb T x hr)
    SpABFuelConsump  2.55
</pre></blockquote>

<p>
These fields define the specific fuel consumption (fuel consumed per
pound of thrust per hour).
</p>


<a name="landinggear"><h3>Landing gear</h3></a>

<blockquote><pre>
    # Landing Gear control parameters
    GearRate   30   # (gearRate) gear extension rate from 0 to 90 DEG (DEG/s)
    MuStatic   0.08 # (muStatic) static coeff of friction no-brakes
    MuKinetic  0.05 # (muKinetic) moving coeff of friction no-brakes
    MuBStatic  0.7  # (muBStatic) static brakes-on
    MuBKinetic 0.6  # (muBKinetic) moving brakes-on
</pre></blockquote>

<p>
These four values characterize the amount of friction that the wheels
generate when in contact with the ground. If F is the force (usually a weight)
that load a wheel, then F*MuStatic is the friction force when the wheel is
at rest; F*MuKinetic when the wheel is rolling. MuBStatic and MuBKinetic
have the same meaning with the only difference that the brakes are on.
The maximum theoretical value of any of these is 1.0.
</p>

<p>
<b>NOTE 1.</b> In our landing gear, only the wheels of the main gear have
brakes; the nose wheel can't brake.
</p>

<p>
<b>NOTE 2.</b> The MuKinetic and MuBKinetic are probably misnomers as
these coefficients are more commonly known as "MuRolling" instead. Proper
"kinetic" coefficients are involved when the wheel skids over the runway,
either longitudinally (blocked brakes) or laterally. In ACM brakes
never block, but still wheels can skid laterally over the runway. The
coefficient involved in the skidding behavior is currently hard-coded
in the <code>gear.c</code> module. Moreover, the gear breaks when the
lateral force applied to the wheel exceeds the empty weight
of the aircraft. This limit too is hard-coded into the source program.
</p>

<blockquote><pre>
    MaxNWDef   72   # (maxNWDef) maximum nosewheel deflection (deg)
</pre></blockquote>

<p>
The <code>MaxNWDef</code> is the maximum deflection angle of the nose wheel. If this figure is available from the characteristics of the airplane, the figure and the formulas below allows to calculate the minimum turning radius.
</p>

<pre>

</pre>
<center>
<img src="acmdoc_html-steer.png">
<p>
<b>Minimum turn radius of turn on the ground.</b>
</p>
</center>
<pre>

</pre>

<p>
	If Q is the distance between the contact point with ground of the nose wheel and the middle point between the contact points of the main landing gear, then this latter middle point draws a circle or radius:
</p>

<blockquote>
	r = Q / tan(MaxNWDef)
</blockquote>

<p>
	while the contact point of the nose wheel draws a circle of radius:
</p>

<blockquote>
	R = Q / sin(MaxNWDef)
</blockquote>


<p>
	Sometimes the maximum deflection of the nose wheel is not reported, but a <b>minimum turning radius</b> is provided instead. Normally this is defined as the radius of the smallest cylinder inside which the aircraft can perform a full 360 degrees turn. From the figure above we see the this value could be estimated as the turn radius of the center of the main landing gear (r) plus the half-wings length:
</p>

<blockquote>
	MinRadius = WingsLength/2 + r
</blockquote>


<p>from which:</p>

<blockquote>
	MaxNWDef = atan( Q / (MinRadius - WingsLength/2) )
</blockquote>


<p>
Several "minimum turning radius" could be indicated for a given aircraft referring to:
	<br>&emsp;1. the pilot using the pedals only;
	<br>&emsp;2. the pilot using both pedals and differential brakes;
	<br>&emsp;3. the pilot using the steering crank handle (where available);
	<br>&emsp;4. the ground crew with the nose wheel hooked-up.
	<br>Obviously, we are interested to the case 1 only.
</p>



<blockquote><pre>
    # (rm) location of right main gear attachments {x,y,z} (ft)
    Rm { -2.2, 4, 1.702 }

    # (rn) location of nose gear attachments {x,y,z} (ft)
    Rn { 9.395000, 0, 1.807 }

    Km    18220.7 # main oleo spring factor (lbf/ft)
    Kn    4278.34 # nose oleo spring factor (lbf/ft)
    Dm    10000   # main oleo damping factor (lbf s/ft)
    Dn    80      # nose oleo damping factor (lbf s/ft)
    Gm    1.5     # main strut length with tire (ft)
    Gn    1.5     # nose strut length with tire (ft)
    CmMax 1.0     # (cmMax) main max oleo extension distance (ft)
    CnMax 1.5     # (cnMax) nose max oleo extension distance (ft)
</pre></blockquote>


<pre>

</pre>
<center>
<img src="acmdoc_html-landing-gear.png">
<p>
<b>Parameters of the landing gear.</b>
</p>
</center>
<pre>

</pre>

<p>
The parameters <code>Rn</code> and <code>Rm</code> give the positions of the
nose and main gear attachments, while <code>Gn</code> and <code>Gm</code>
are their total length including the tire but excluding the oleo extension
<code>CnMax</code> and <code>CmMax</code>. As a first approximation of these
parameters, you can take these values (all the distances are measured in feet,
1 ft = 0.3048 m):
</p>

<blockquote>

<dl>

<dt><code>Rn.x</code></dt>
<dd>
Attachment point of the nose landing gear strut, x coordinate (ft). Positive for
tricycle landing gear, negative for bicycle landing gear.
</dd>

<dt><code>Rn.y</code></dt>
<dd>Always zero.
</dd>

<dt><code>Rn.z</code></dt>
<dd>
Attachment point of the nose landing gear strut, z coordinate (ft).
</dd>

<dt><code>CnMax</code></dt>
<dd>
The oleo + spring part of the nose gear extends from zero up to this length (ft).
</dd>

<dt><code>Gn</code></dt>
<dd>
Length of the rigid part of the nose landing gear strut (ft). The total
length of the nose gear strut including tire is then this value plus
the current extension of the oleo part.
</dd>

<dt><code>Rm.x</code></dt>
<dd>
Attachment point of the right main landing gear strut, x coordinate (ft).
Negative for tricycle landing gear, positive for bicycle landing gear.
</dd>

<dt><code>Rm.y</code></dt>
<dd>
Attachment point of the right main landing gear strut, y coordinate (ft).
Always positive; the left main gear it is assumed to be at -Rm.y but with 
the same Rm.x and Rm.z components of the right main gear.
</dd>

<dt><code>Rm.z</code></dt>
<dd>
Attachment point of the right main landing gear, z coordinate (ft).
</dd>

<dt><code>CmMax</code></dt>
<dd>
The oleo + spring part of each main gear strut extends from zero up to
this length (ft).  About half foot for light planes, and up to 1.5 feet
for larger ones.
</dd>

<dt><code>Gm</code></dt>
<dd>
Length of the rigid part of the each main landing gear strut (ft). The total
length of each main gear strut including tire is then this value plus
the current extension of the oleo part.
</dd>

</dl>

</blockquote>

<p>
Every wheel of the landing gear is attached to the aircraft through a spring
(K) and a damper (D). The parameters referring to the main landing gear are the
<u>sum for the left and right gear</u>, so the actual parameter for each wheel strut
is half the value reported in the inventory (see the picture above).
</p>

<p>
The landing gear parameters are difficult to estimate. We will give some
simple rule to set good starting values based on reasonable assumptions.
</p>

<blockquote>
<dl>

<dt><code>Km</code></dt>
<dd>
	Total spring factor for the left+right main landing gear (lbf/ft),
	then each spring is half this value.
The main landing gear must sustain most of the weight of the aircraft,
so a reasonable rule is to set this spring (left + right) so that
the strut be half compressed with the aircraft in its empty weight:
<p>
Km = 2 * EmptyWeight / CmMax
<p>
For example, if the empty weight is 10000 lbf and the strut maximum extension
is 1.5 ft, we have Km = 13300 lbf/ft.
</dd>

<dt><code>Kn</code></dt>
<dd>
Nose spring factor (lbf/ft).
The nose spring must sustain the static weight that depends on its distance
from the CM. Moreover, on bicycle landing gears the nose must sustain also the
braking. Here to we will assume the oleo damper be half compressed while the
aircraft is braking at its empty weight. The resulting quite complex
formula is:
<p>
Kn = 2 * EmptyWeight * (-Rm.x / (Rn.x - Rm.x) + MuBKinetic * (Rm.z + Gm + CmMax)/Rn.x) / CnMax
<p>
Note that the distances that appear in this formula have their sign,
so usually Rm.x is negative while Rn.x is positive. For bicycle landing
gear we can neglect the braking effect by assuming MuBKinetic=0 in the
formula above, but consider that these aircraft usually have an higher
static pitch for which this simple formula is not valid anymore.
</dd>

<dt><code>Dm</code></dt>
<dd>
Total damping factor for the left + right landing gear strut (lbf s/ft).
The principal role of the damping factor in the main gear is to adsorb
harder landings at high descending speed, when the spring cannot help
because is still not compressed at all. 600 fpm is usually the maximum
allowed vertical speed for which aircraft are tested. That means that
the force produced by the damper when the wheels of the main gear hits
the ground is F=Dm*600 fpm. Since in ACM there is an hard-coded
vertical limit to the main gear equal to 1.5 times the empty weight for
each leg of the main landing gear, the following formula gives a safe
value for Dm:
<p>
Dm &lt;= 0.2 * EmptyWeight
<p>
For example, if the empty weight is 10000 lbf, then the damping factor should not
exceed 2000 lbf s/ft.
</dd>


<dt><code>Dn</code></dt>
<dd>
Damping factor for the nose landing gear strut (lbf s/ft).
A good starting value might be Dm calculated above.
</dd>

</dl>
</blockquote>


<p>
The program GEDIT can be used to determine correct landing gear
locations. I then use the program <code>tools/balance.c</code> to generate
the appropriate values for the spring factors for each new aircraft type that
I create. Note that neither GEDIT nor <code>balance.c</code> currently
calculate oleo damping factors.
</p>

<p>
Choosing the right values for the landing gear is difficult, and the program
may terminate abruptly with one of the following messages related to the
landing gear:
</p>

<dl>
	
	<dt><b>Nose/left/right gear smash.</b></dt>
	<dd>An excessive vertical load has fully compressed the suspension
	transferring that load directly to the aircraft frame and causing
	a permanent, fatal damage. Possible fixes: increase the spring factor;
	increase damping factor.</dd>
	
	<dt><b>Nose/left/right gear collapsed under too hight vertical load.</b></dt>
	<dd>The landing gear transferred an excessive vertical load to the aircraft's
	frame causing a permanent, fatal damage. The maximum vertical load the
	each leg of the landing gear can sustain is hard-coded in the source to be
	the empty weight for the nose, and 1.5 times the empty weight for each
	of the left and right legs. Possible fixes: decrease the spring factor;
	decrease the damping factor.</dd>
	
	<dt><b>Nose/left/right gear broken under too high lateral force.</b></dt>
	<dd>The wheel transferred an excessive torque due to a lateral force.
	This is typically caused by an excessive landing pitch, or excessive bank
	angle, or by steering at high speed. The maximum lateral force each wheel
	can transfer to the frame is hard-coded in the source to be the empty
	weight. Fix: touchdown should always be performed at low vertical speed
	with zero bank angle and reasonable low pitch; do not brake while
	steering.</dd>
	
</dl>


<a name="armament"><h3>Armament</h3></a><br>

<blockquote><pre>
    StructurePoints 15 # (structurePts) maximum structural damage
</pre></blockquote>

<p>
This value characterizes how much damage can be absorbed by the aircraft
before it starts falling to the ground (drones simply explode). A detailed description
of the meaning of this field is available as a comment to the
<tt>objects/munition-map.txt</tt> file, where all the recognized warheads are
listed along with their effectiveness.
</p>

<blockquote><pre>
    # Radar data based on N-019 Pulse Doppler radar cited in [AirI Aug89].
    RadarOutput   15000 # (radarOutput) radar output (watts)
    RadarTRange   38    # (radarTRange) tracking radar range (NM)
    RadarDRange   55    # (radarDRange) detection radar range (NM)
    TEWSThreshold 0     # Radar Warning Receiver threshold (watts)
</pre></blockquote>

<p>
If you have any information about the radar capabilities of the aircraft,
here's the place for them. The detection range is the maximum range that
a target can be seen on radar. No attempt is made to take into account
the radar cross section of the target. The tracking range is the range
required to get a lock onto the target.
</p>

<blockquote><pre>
    # Weapons
    WeaponCount 9
</pre></blockquote>

<p>
Number of weapon hard-points. The following fields are ignored if this value is
set to zero, so they can be omitted if the aircraft does not carry weapons at
all.
</p>

<blockquote><pre>
    HardPoint0 { 7.0, -4.0, 0.0 }
    HardPoint1 { 0.357, 15.6, 0.0 }
    HardPoint2 { 0.357, -15.6, 0.0 }
    HardPoint3 { 1.5, 9.0, 2.0 }
    HardPoint4 { 1.5, -9.0, 2.0 }
    HardPoint5 { 1.5, 8.0, 1.5 }
    HardPoint6 { 1.5, -8.0, 1.5 }
    HardPoint7 { 1.5, 10.0, 1.5 }
    HardPoint8 { 1.5, -10.0, 1.5 }
</pre></blockquote>

<p>
These are the XYZ locations relative to the aircraft CM of each weapon. By
defining these, each missile or cannon fires from its appropriate location
on the aircraft.
</p>

<blockquote><pre>
    WeaponStation   0 "M61A1"   500 0   0
    WeaponStation   1 "AIM-9M"   0   0   0
    WeaponStation   2 "AIM-9M"   0   0   0
    WeaponStation   3 "AIM-9M"   0   0   0
    WeaponStation   4 "AIM-9M"   0   0   0
    WeaponStation   5 "AIM-9M"   0   0   0
    WeaponStation   6 "AIM-9M"   0   0   0
    WeaponStation   7 "AIM-120"  0   0   0
    WeaponStation   8 "AIM-120"  0   0   0
}
</pre></blockquote>

<p>
The <code>WeaponStation</code> directive defines the type of weapon located at
each hard point. The first argument is the number of the hard point, that
ranges from 0 up to <code>WeaponCount</code>&minus;1. The second argument is
the name of the weapon. Then three integer numbers follow whose meaning depends
on the specific weapon. The table below summarizes by examples all the
available weapons:
</p>

<table align=center border=1 cellpadding=5 cellspacing=0 width="70%">

<tr>
<th>Example</th>
<th>Notes</th>
</tr>

<tr>
<td valign=top align=left>
<pre>WeaponStation 0 "M61A1" 500 0 0</pre>
</td>
<td>
<b>M-61A1</b> "Vulcan" cannon. 500 is the number of rounds initially supplied to
the cannon. The other two numbers are ignored.
</td>
</tr>

<tr>
<td valign=top align=left>
<pre>WeaponStation 1 "AIM9M" 0 0 0</pre>
</td>
<td>
<b>AIM9M</b> "Sidewinder", infra-red guided, short range, air-to-air missile.
The other 3 numbers are ignored.
</td>
</tr>

<tr>
<td valign=top align=left>
<pre>WeaponStation 2 "AIM120" 0 0 0</pre>
</td>
<td>
<b>AIM-120</b> "AMRAAM", radar guided, medium-range, air-to-air missile.
The other 3 numbers are ignored.
</td>
</tr>

<tr>
<td valign=top align=left>
<pre>WeaponStation 6 "MK82" 0 0 0</pre>
</td>
<td>
<b>Mark 82</b> 250 lb standard drop bomb.
The other 3 numbers are ignored.
</td>
</tr>

</table>


<p>
Remote aircraft may submit detonation PDUs claiming you have been hit by something. The <tt>objects/munition-map.txt</tt> lists all the recognized munitions by their DIS entity type, along with their effectiveness.
</p>


<a name=definingnewobjects></a>
<h2>Defining new objects</h2>

<p>
An "object" can be the shape of an aircraft (field "Object" of the
aircraft inventory file) or a feature of the scene file (record
"FEATURE").  The format of the object file, described here, is copied
from the <i>ACM Flight Simulator Frequently-Asked Questions List</i>
maintained by Brad Bass (bass@convex.com).
</p>

<p>
The first line is the object name.
</p>
<p>
The 2nd line has two integers which represent the number of points
and the number of polygons in the object.
</p>
<p>
Then, the points are listed, one per line, with the point id number
followed by the X, Y and Z coordinate (North, East, Down).  The
units are feet.
</p>
<p>
Finally, the polygons are listed as color, number of corners,
and the list of point id numbers.  The color may be expressed
as a single color or as a front and back color.  Also, the polygon
can be flagged as "one-sided" -- that is visible only
from the front.
</p>
<p>
For example:
</p>
<blockquote>
<pre>
pyramid                  # the object name
5 4                      # the point count and polygon count
1 28000 0 0              # the
2 0 16000 0              #   points that
3 -35000 0 0             #     describe
4 0 -14000 0             #       the
5 0 0 -8200              #         corners
#788b63      3  1 2 5    # side 1 - color (X-style), cornercount,
                         #   corner list
violet       3  2 3 5    # side 2
(blue red)   3  3 4 5    # side 3 - front is blue, back is red
(green clip) 3  4 1 5    # side 4 - one-sided polygon
</pre>
</blockquote>



<a name=ieee12781discompliance></a>
<h2>IEEE 1278.1 (DIS) compliance</h2>

<p>ACM emits and recognizes the following DIS PDU Types:</p>
<p><br><br>
</p>
<p>Entity
State</p>
<p>Fire</p>
<p>Detonation</p>
<p>Electromagnetic
Emission</p>
<p><br><br>
</p>

<p>
The ACM program may simulate several entities, including the aircraft
 the
user is flying on, each missile it fires and possibly other
 entities. For
each entity it simulates, the program sends a state
 packet to all the
other participants every 4.8 seconds along with the
 <i>dead reckoning</i>
algorithm each remote program must apply in the
 meanwhile. The program
also sends an updated state packet when it detects the actual
 state of
the entity deviates from the stated dead reckoning method for
 more than
a given amount.
</p>

<p>The following dead reckoning methods are recognized:</p>

<table border=1 cellspacing="0" cellpadding="5" align="center">

<tr>
<th>Name</th>
<th>DIS enumeration</th>
<th>Description</th>
</tr>

<tr>
<td>Other</td>
<td>0</td>
<td>NOT SUPPORTED.</td>
</tr>

<tr>
<td>Static</td>
<td>1</td>
<td>Entity does not move.</td>
</tr>

<tr>
<td>FPW</td>
<td>2</td>
<td>Entity moves at constant speed.</td>
</tr>

<tr>
<td>RPW</td>
<td>3</td>
<td>Entity moves at constant speed and rotates at constant speed.</td>
</tr>

<tr>
<td>RVW</td>
<td>4</td>
<td>Entity moves at constant acceleration and rotates at constant speed.</td>
</tr>

<tr>
<td>FVW</td>
<td>5</td>
<td>Entity moves at constant acceleration and does not rotate.</td>
</tr>

<tr>
<td>FPB</td>
<td>6</td>
<td>NOT SUPPORTED.</td>
</tr>

<tr>
<td>RPB</td>
<td>7</td>
<td>NOT SUPPORTED.</td>
</tr>

<tr>
<td>RVB</td>
<td>8</td>
<td>NOT SUPPORTED.</td>
</tr>

<tr>
<td>FVB</td>
<td>9</td>
<td>NOT SUPPORTED.</td>
</tr>

<tr>
<td>RPW</td>
<td>10</td>
<td>NOT SUPPORTED.</td>
</tr>

<tr>
<td>RVW</td>
<td>11</td>
<td>NOT SUPPORTED.</td>
</tr>

</table>


<p>
For methods not supported, the state is not updated and the remote entity looks moving by steps.
</p>


<p>Entities
managed by ACM emit entity state PDU&#8217;s specifying the RPW(3)
dead reckoning method.  No articulation parameters are currently sent
by entities managed by ACM. As with most current DIS-based
simulations, altitudes are expressed as heights above the WGS-84
ellipsoid, not as heights above the geoid.  Dead reckoning threshold
values are hard-coded in the <tt>src/acm/manifest.h</tt> file:</p>

<table border="1" cellspacing=0 cellpadding="5" align="center">
	<tr><th>Description</th><th>Value</th></tr>
	<tr><td>Maximum time between Entity State PDUs</td><td>4.8 seconds</td></tr>
	<tr><td>Dead Reckoning Cartesian distance error</td><td>3 meters</td></tr>
	<tr><td>Dead Reckoning angular orientation error</td><td>2 degrees</td></tr>
</table>


<p>When
operating in IEEE 1278 mode, the default UDP port number for PDU
transmission is 3000.</p>


<h3>The Transfer Control Protocol</h3>

<p>ACM
supports an experimental DIS 2.1.4++ control request protocol. It
permits it to &#8220;take over&#8221; aircraft of similarly enabled
applications.  For ACM to take over an aircraft, it must have model
information in the &#8220;inventory&#8221; file describing the
characteristics of that aircraft type.  Those aircraft entities will
be marked with an asterisk (*) in the left margin of the stealth
browser display.  Double click an aircraft entity id to take control.
</p>

<h3>Transfer Control Request PDU</h3>

<center>
	<table border="1" cellpadding="4" cellspacing="0">
		<thead>

			<tr>
				<th>
					Field<br>
					Size<br>
					(bits)
				</th>
				<th colspan=2>
					Transfer Control Request PDU fields
				</th>
			</tr>

		</thead>


		<tbody>

			<tr>
				<td rowspan=4>
					96
				</td>
				<td rowspan=4>
					PDU Header
				</td>
				<td>
					<p>Protocol Version&#8212;8-bit enumeration</p>
				</td>
			</tr>
			<tr>
				<td>
					<p>Exercise ID&#8212;8-bit unsigned integer</p>
				</td>
			</tr>
			<tr>
				<td>
					<p>PDU Type &#8212;8-bit unsigned integer</p>
					<p>Protocol Family&#8212;8-bit enumeration</p>
					<p>Timestamp&#8212;32-bit unsigned integer</p>
					<p>Length&#8212;16-bit unsigned integer</p>
				</td>
			</tr>
			<tr>
				<td>
					<p>Padding&#8212;16-bits unused</p>
				</td>
			</tr>
		
		
			<tr>
				<td rowspan=3>
					48
				</td>
				<td rowspan=3>
					Originating Entity ID
				</td>
				<td>
					<p>Site&#8212;16-bit unsigned integer</p>
				</td>
			</tr>
			<tr>
				<td>
					<p>Application&#8212;16-bit unsigned integer</p>
				</td>
			</tr>
			<tr>
				<td>
					<p>Entity&#8212;16-bit unsigned integer</p>
				</td>
			</tr>
		
		
			<tr>
				<td rowspan=2>
					48
				</td>
				<td rowspan=2>
					Receiving Entity ID
				</td>
				<td>
					Site&#8212;16-bit unsigned integer
				</td>
			</tr>
			<tr>
				<td>
					<p>Application&#8212;16-bit unsigned integer</p>
					<p>Entity&#8212;16-bit unsigned integer</p>
				</td>
			</tr>
		
		
			<tr>
				<td>
					32
				</td>
				<td>
					Request ID
				</td>
				<td>
					32-bit unsigned integer
				</td>
			</tr>
		
		
			<tr>
				<td>
					8
				</td>
				<td>
					Required Reliability Service
				</td>
				<td>
					8-bit enumeration
				</td>
			</tr>
		
		
			<tr>
				<td>
					8
				</td>
				<td>
					Transfer Type
				</td>
				<td>
					8-bit enumeration
				</td>
			</tr>
		
		
			<tr>
				<td rowspan=2>
					48
				</td>
				<td rowspan=2>
					Entity ID to be Transferred
				</td>
				<td>
					Site&#8212;16-bit unsigned integer
				</td>
			</tr>
			<tr>
				<td>
					<p>Application&#8212;16-bit unsigned integer</p>
					<p>Entity&#8212;16-bit unsigned integer</p>
				</td>
			</tr>
		
		
			<tr>
				<td>
					32
				</td>
				<td>
					Number of Record Sets (R)
				</td>
				<td>
					32-bit unsigned integer
				</td>
			</tr>


			<tr>
				<td rowspan=6>
					96 +<br>
					(L<sub>1</sub> x Q<sub>1</sub>)<br>
					+ P<sub>1</sub>
				</td>
				<td rowspan=6>
					Record Set #1
				</td>
				<td>
					Datum ID&#8212;32-bit enumeration
				</td>
			</tr>
			<tr>
				<td>
					<p>Record
					Set Serial Number&#8212;32-bit unsigned integer</p>
				</td>
			</tr>
			<tr>
				<td>
					<p>Record
					Length&#8212;16-bit unsigned integer (L<sub>1</sub>)</p>
				</td>
			</tr>
			<tr>
				<td>
					<p>Record
					Count&#8212;16-bit unsigned integer (Q<sub>1</sub>)</p>
				</td>
			</tr>
			<tr>
				<td>
					<p>Record
					Values&#8212;(L<sub>1</sub> x Q<sub>1</sub>) bits</p>
				</td>
			</tr>
			<tr>
				<td>
					<p>Padding&#8212;P<sub>1</sub>
					bits</p>
				</td>
			</tr>
		
		
			<tr>
				<td colspan=3 align=center>
					<p>&middot;</p>
					<p>&middot;</p>
					<p>&middot;</p>
				</td>
			</tr>
		
		
			<tr>
				<td rowspan=6>
					96 +<br>
					(L<sub>R</sub> x Q<sub>R</sub>)<br>
					+ P<sub>R</sub>
				</td>
				<td rowspan=6>
					Record Set #R
				</td>
				<td>
					<p>Datum
					ID&#8212;32-bit enumeration</p>
				</td>
			</tr>
			<tr>
				<td>
					<p>Record
					Set Serial Number&#8212;32-bit unsigned integer</p>
				</td>
			</tr>
			<tr>
				<td>
					<p>Record
					Length&#8212;16-bit unsigned integer (L<sub>R</sub>)</p>
				</td>
			</tr>
			<tr>
				<td>
					<p>Record
					Count&#8212;16-bit unsigned integer (Q<sub>R</sub>)</p>
				</td>
			</tr>
			<tr>
				<td>
					<p>Record
					Values&#8212;(L<sub>R</sub> x Q<sub>R</sub>) bits</p>
				</td>
			</tr>
			<tr>
				<td>
					<p>Padding&#8212;P<sub>R</sub>
					bits</p>
				</td>
			</tr>

		</tbody>
		
	</table>
</center>


<p>
Total Transfer Control Request  PDU size:
</p>

<blockquote>
320 + Sum<sub>i=1..R</sub>(96
+ (L<sub>i </sub>x Q<sub>i</sub>) + P<sub>i</sub>) bits
</blockquote>

<p>
where R is the number of  Record Sets.
</p>

<p>ACM currently ignores record sets in a transfer control PDU.</p>





<h3>Transfer Type</h3>

<p>This
section specifies the 8-bit enumeration for the Transfer Type field
of the Transfer Control PDU.</p>
<p><br><br>
</p>
<table align=center border="1" cellpadding="4" cellspacing="0">
	<thead>
	<tr>
		<th>Field Value</th>
		<th>Nature</th>
	</tr>
	</thead>

	<tbody>
	<tr>
		<td>0</td>
		<td>Other</td>
	</tr>
	<tr>
		<td>
			1
		</td>
		<td>
			Controlling
			application requests transfer of an entity
		</td>
	</tr>
	<tr>
		<td>
			2
		</td>
		<td>
			Application
			desiring control requests transfer of an entity
		</td>
	</tr>
	<tr>
		<td>
			3
		</td>
		<td>
			Mutual
			exchange / swap of an entity
		</td>
	</tr>
	<tr>
		<td>
			4
		</td>
		<td>
			Controlling
			application requests transfer of an environmental process
		</td>
	</tr>
	<tr>
		<td>
			5
		</td>
		<td>
			Application
			desiring controls request transfer of an environmental process
		</td>
	</tr>
	<tr>
		<td>
			6
		</td>
		<td>
			Mutual exchange of an environmental
		</td>
	</tr>
	</tbody>
</table>
<p><br><br>
</p>
<p>
<i><b>Assuming Ownership</b></i></p>
<p><img src="acmdoc_html_assuming-ownership.gif"></p>
<p><br><br>
</p>
<p>
<i><b>Accepting Ownership
by Request</b></i></p>
<p>Another
feature of ACM&#8217;s transfer control protocol support is that
other applications may request that ACM take control of an aircraft
that the other application controls.</p>


<a name=suggestedfurtherreading></a>
<h2>Suggested further reading</h2>

<ul>

<li>3D Graphics Programming for Windows 95<br>
by Nigel Thompson	ISBN 1-57231-345-5</li>

<li>Fighter Combat<br>
by Robert L. Shaw	ISBN 0-87021-059-9</li>

<li>Aircraft Control and Simulation<br>
by Brian L. Stevens and Frank L. Lewis	ISBN 0-471-61397-5</li>

<li>1278.1-1995 IEEE Standard for Distributed Interactive
Simulation--Application Protocols ISBN 1-55937-572-8</li>

<li>The Surveying Handbook, second edition<br>
edited by Russel Brinker and Roy Minnick	ISBN 0-412-98511-X</li>

</ul>

<p>
...and the source code of ACM which contains lots of interesting comments!
</p>

</body>
</html>