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
(ρ<sub>h</sub>/ρ<sub>0</sub>)<sup>1.6</sup>, being
ρ<sub>h</sub> the air density at the current altitude and
ρ<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> 1. the pilot using the pedals only;
<br> 2. the pilot using both pedals and differential brakes;
<br> 3. the pilot using the steering crank handle (where available);
<br> 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 <= 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>−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’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 “take over” aircraft of similarly enabled
applications. For ACM to take over an aircraft, it must have model
information in the “inventory” 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—8-bit enumeration</p>
</td>
</tr>
<tr>
<td>
<p>Exercise ID—8-bit unsigned integer</p>
</td>
</tr>
<tr>
<td>
<p>PDU Type —8-bit unsigned integer</p>
<p>Protocol Family—8-bit enumeration</p>
<p>Timestamp—32-bit unsigned integer</p>
<p>Length—16-bit unsigned integer</p>
</td>
</tr>
<tr>
<td>
<p>Padding—16-bits unused</p>
</td>
</tr>
<tr>
<td rowspan=3>
48
</td>
<td rowspan=3>
Originating Entity ID
</td>
<td>
<p>Site—16-bit unsigned integer</p>
</td>
</tr>
<tr>
<td>
<p>Application—16-bit unsigned integer</p>
</td>
</tr>
<tr>
<td>
<p>Entity—16-bit unsigned integer</p>
</td>
</tr>
<tr>
<td rowspan=2>
48
</td>
<td rowspan=2>
Receiving Entity ID
</td>
<td>
Site—16-bit unsigned integer
</td>
</tr>
<tr>
<td>
<p>Application—16-bit unsigned integer</p>
<p>Entity—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—16-bit unsigned integer
</td>
</tr>
<tr>
<td>
<p>Application—16-bit unsigned integer</p>
<p>Entity—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—32-bit enumeration
</td>
</tr>
<tr>
<td>
<p>Record
Set Serial Number—32-bit unsigned integer</p>
</td>
</tr>
<tr>
<td>
<p>Record
Length—16-bit unsigned integer (L<sub>1</sub>)</p>
</td>
</tr>
<tr>
<td>
<p>Record
Count—16-bit unsigned integer (Q<sub>1</sub>)</p>
</td>
</tr>
<tr>
<td>
<p>Record
Values—(L<sub>1</sub> x Q<sub>1</sub>) bits</p>
</td>
</tr>
<tr>
<td>
<p>Padding—P<sub>1</sub>
bits</p>
</td>
</tr>
<tr>
<td colspan=3 align=center>
<p>·</p>
<p>·</p>
<p>·</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—32-bit enumeration</p>
</td>
</tr>
<tr>
<td>
<p>Record
Set Serial Number—32-bit unsigned integer</p>
</td>
</tr>
<tr>
<td>
<p>Record
Length—16-bit unsigned integer (L<sub>R</sub>)</p>
</td>
</tr>
<tr>
<td>
<p>Record
Count—16-bit unsigned integer (Q<sub>R</sub>)</p>
</td>
</tr>
<tr>
<td>
<p>Record
Values—(L<sub>R</sub> x Q<sub>R</sub>) bits</p>
</td>
</tr>
<tr>
<td>
<p>Padding—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’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>
|