/usr/include/ode/objects.h is in libode-sp-dev 2:0.11.1-4.1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
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 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 | /*************************************************************************
* *
* Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. *
* All rights reserved. Email: russ@q12.org Web: www.q12.org *
* *
* This library is free software; you can redistribute it and/or *
* modify it under the terms of EITHER: *
* (1) The GNU Lesser General Public License as published by the Free *
* Software Foundation; either version 2.1 of the License, or (at *
* your option) any later version. The text of the GNU Lesser *
* General Public License is included with this library in the *
* file LICENSE.TXT. *
* (2) The BSD-style license that is included with this library in *
* the file LICENSE-BSD.TXT. *
* *
* This library is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files *
* LICENSE.TXT and LICENSE-BSD.TXT for more details. *
* *
*************************************************************************/
#ifndef _ODE_OBJECTS_H_
#define _ODE_OBJECTS_H_
#include <ode/common.h>
#include <ode/mass.h>
#include <ode/contact.h>
#ifdef __cplusplus
extern "C" {
#endif
/**
* @defgroup world World
*
* The world object is a container for rigid bodies and joints. Objects in
* different worlds can not interact, for example rigid bodies from two
* different worlds can not collide.
*
* All the objects in a world exist at the same point in time, thus one
* reason to use separate worlds is to simulate systems at different rates.
* Most applications will only need one world.
*/
/**
* @brief Create a new, empty world and return its ID number.
* @return an identifier
* @ingroup world
*/
ODE_API dWorldID dWorldCreate(void);
/**
* @brief Destroy a world and everything in it.
*
* This includes all bodies, and all joints that are not part of a joint
* group. Joints that are part of a joint group will be deactivated, and
* can be destroyed by calling, for example, dJointGroupEmpty().
* @ingroup world
* @param world the identifier for the world the be destroyed.
*/
ODE_API void dWorldDestroy (dWorldID world);
/**
* @brief Set the world's global gravity vector.
*
* The units are m/s^2, so Earth's gravity vector would be (0,0,-9.81),
* assuming that +z is up. The default is no gravity, i.e. (0,0,0).
*
* @ingroup world
*/
ODE_API void dWorldSetGravity (dWorldID, dReal x, dReal y, dReal z);
/**
* @brief Get the gravity vector for a given world.
* @ingroup world
*/
ODE_API void dWorldGetGravity (dWorldID, dVector3 gravity);
/**
* @brief Set the global ERP value, that controls how much error
* correction is performed in each time step.
* @ingroup world
* @param dWorldID the identifier of the world.
* @param erp Typical values are in the range 0.1--0.8. The default is 0.2.
*/
ODE_API void dWorldSetERP (dWorldID, dReal erp);
/**
* @brief Get the error reduction parameter.
* @ingroup world
* @return ERP value
*/
ODE_API dReal dWorldGetERP (dWorldID);
/**
* @brief Set the global CFM (constraint force mixing) value.
* @ingroup world
* @param cfm Typical values are in the range @m{10^{-9}} -- 1.
* The default is 10^-5 if single precision is being used, or 10^-10
* if double precision is being used.
*/
ODE_API void dWorldSetCFM (dWorldID, dReal cfm);
/**
* @brief Get the constraint force mixing value.
* @ingroup world
* @return CFM value
*/
ODE_API dReal dWorldGetCFM (dWorldID);
/**
* @brief Step the world.
*
* This uses a "big matrix" method that takes time on the order of m^3
* and memory on the order of m^2, where m is the total number of constraint
* rows. For large systems this will use a lot of memory and can be very slow,
* but this is currently the most accurate method.
* @ingroup world
* @param stepsize The number of seconds that the simulation has to advance.
*/
ODE_API void dWorldStep (dWorldID, dReal stepsize);
/**
* @brief Converts an impulse to a force.
* @ingroup world
* @remarks
* If you want to apply a linear or angular impulse to a rigid body,
* instead of a force or a torque, then you can use this function to convert
* the desired impulse into a force/torque vector before calling the
* BodyAdd... function.
* The current algorithm simply scales the impulse by 1/stepsize,
* where stepsize is the step size for the next step that will be taken.
* This function is given a dWorldID because, in the future, the force
* computation may depend on integrator parameters that are set as
* properties of the world.
*/
ODE_API void dWorldImpulseToForce
(
dWorldID, dReal stepsize,
dReal ix, dReal iy, dReal iz, dVector3 force
);
/**
* @brief Step the world.
* @ingroup world
* @remarks
* This uses an iterative method that takes time on the order of m*N
* and memory on the order of m, where m is the total number of constraint
* rows N is the number of iterations.
* For large systems this is a lot faster than dWorldStep(),
* but it is less accurate.
* @remarks
* QuickStep is great for stacks of objects especially when the
* auto-disable feature is used as well.
* However, it has poor accuracy for near-singular systems.
* Near-singular systems can occur when using high-friction contacts, motors,
* or certain articulated structures. For example, a robot with multiple legs
* sitting on the ground may be near-singular.
* @remarks
* There are ways to help overcome QuickStep's inaccuracy problems:
* \li Increase CFM.
* \li Reduce the number of contacts in your system (e.g. use the minimum
* number of contacts for the feet of a robot or creature).
* \li Don't use excessive friction in the contacts.
* \li Use contact slip if appropriate
* \li Avoid kinematic loops (however, kinematic loops are inevitable in
* legged creatures).
* \li Don't use excessive motor strength.
* \liUse force-based motors instead of velocity-based motors.
*
* Increasing the number of QuickStep iterations may help a little bit, but
* it is not going to help much if your system is really near singular.
*/
ODE_API void dWorldQuickStep (dWorldID w, dReal stepsize);
/**
* @brief Set the number of iterations that the QuickStep method performs per
* step.
* @ingroup world
* @remarks
* More iterations will give a more accurate solution, but will take
* longer to compute.
* @param num The default is 20 iterations.
*/
ODE_API void dWorldSetQuickStepNumIterations (dWorldID, int num);
/**
* @brief Get the number of iterations that the QuickStep method performs per
* step.
* @ingroup world
* @return nr of iterations
*/
ODE_API int dWorldGetQuickStepNumIterations (dWorldID);
/**
* @brief Set the SOR over-relaxation parameter
* @ingroup world
* @param over_relaxation value to use by SOR
*/
ODE_API void dWorldSetQuickStepW (dWorldID, dReal over_relaxation);
/**
* @brief Get the SOR over-relaxation parameter
* @ingroup world
* @returns the over-relaxation setting
*/
ODE_API dReal dWorldGetQuickStepW (dWorldID);
/* World contact parameter functions */
/**
* @brief Set the maximum correcting velocity that contacts are allowed
* to generate.
* @ingroup world
* @param vel The default value is infinity (i.e. no limit).
* @remarks
* Reducing this value can help prevent "popping" of deeply embedded objects.
*/
ODE_API void dWorldSetContactMaxCorrectingVel (dWorldID, dReal vel);
/**
* @brief Get the maximum correcting velocity that contacts are allowed
* to generated.
* @ingroup world
*/
ODE_API dReal dWorldGetContactMaxCorrectingVel (dWorldID);
/**
* @brief Set the depth of the surface layer around all geometry objects.
* @ingroup world
* @remarks
* Contacts are allowed to sink into the surface layer up to the given
* depth before coming to rest.
* @param depth The default value is zero.
* @remarks
* Increasing this to some small value (e.g. 0.001) can help prevent
* jittering problems due to contacts being repeatedly made and broken.
*/
ODE_API void dWorldSetContactSurfaceLayer (dWorldID, dReal depth);
/**
* @brief Get the depth of the surface layer around all geometry objects.
* @ingroup world
* @returns the depth
*/
ODE_API dReal dWorldGetContactSurfaceLayer (dWorldID);
/* StepFast1 functions */
/**
* @brief Step the world using the StepFast1 algorithm.
* @param stepsize the nr of seconds to advance the simulation.
* @param maxiterations The number of iterations to perform.
* @ingroup world
*/
ODE_API void dWorldStepFast1(dWorldID, dReal stepsize, int maxiterations);
/**
* @defgroup disable Automatic Enabling and Disabling
* @ingroup world bodies
*
* Every body can be enabled or disabled. Enabled bodies participate in the
* simulation, while disabled bodies are turned off and do not get updated
* during a simulation step. New bodies are always created in the enabled state.
*
* A disabled body that is connected through a joint to an enabled body will be
* automatically re-enabled at the next simulation step.
*
* Disabled bodies do not consume CPU time, therefore to speed up the simulation
* bodies should be disabled when they come to rest. This can be done automatically
* with the auto-disable feature.
*
* If a body has its auto-disable flag turned on, it will automatically disable
* itself when
* @li It has been idle for a given number of simulation steps.
* @li It has also been idle for a given amount of simulation time.
*
* A body is considered to be idle when the magnitudes of both its
* linear average velocity and angular average velocity are below given thresholds.
* The sample size for the average defaults to one and can be disabled by setting
* to zero with
*
* Thus, every body has six auto-disable parameters: an enabled flag, a idle step
* count, an idle time, linear/angular average velocity thresholds, and the
* average samples count.
*
* Newly created bodies get these parameters from world.
*/
/**
* @brief Set the AutoEnableDepth parameter used by the StepFast1 algorithm.
* @ingroup disable
*/
ODE_API void dWorldSetAutoEnableDepthSF1(dWorldID, int autoEnableDepth);
/**
* @brief Get the AutoEnableDepth parameter used by the StepFast1 algorithm.
* @ingroup disable
*/
ODE_API int dWorldGetAutoEnableDepthSF1(dWorldID);
/**
* @brief Get auto disable linear threshold for newly created bodies.
* @ingroup disable
* @return the threshold
*/
ODE_API dReal dWorldGetAutoDisableLinearThreshold (dWorldID);
/**
* @brief Set auto disable linear threshold for newly created bodies.
* @param linear_threshold default is 0.01
* @ingroup disable
*/
ODE_API void dWorldSetAutoDisableLinearThreshold (dWorldID, dReal linear_threshold);
/**
* @brief Get auto disable angular threshold for newly created bodies.
* @ingroup disable
* @return the threshold
*/
ODE_API dReal dWorldGetAutoDisableAngularThreshold (dWorldID);
/**
* @brief Set auto disable angular threshold for newly created bodies.
* @param linear_threshold default is 0.01
* @ingroup disable
*/
ODE_API void dWorldSetAutoDisableAngularThreshold (dWorldID, dReal angular_threshold);
/**
* @brief Get auto disable linear average threshold for newly created bodies.
* @ingroup disable
* @return the threshold
*/
ODE_API dReal dWorldGetAutoDisableLinearAverageThreshold (dWorldID);
/**
* @brief Set auto disable linear average threshold for newly created bodies.
* @param linear_average_threshold default is 0.01
* @ingroup disable
*/
ODE_API void dWorldSetAutoDisableLinearAverageThreshold (dWorldID, dReal linear_average_threshold);
/**
* @brief Get auto disable angular average threshold for newly created bodies.
* @ingroup disable
* @return the threshold
*/
ODE_API dReal dWorldGetAutoDisableAngularAverageThreshold (dWorldID);
/**
* @brief Set auto disable angular average threshold for newly created bodies.
* @param linear_average_threshold default is 0.01
* @ingroup disable
*/
ODE_API void dWorldSetAutoDisableAngularAverageThreshold (dWorldID, dReal angular_average_threshold);
/**
* @brief Get auto disable sample count for newly created bodies.
* @ingroup disable
* @return number of samples used
*/
ODE_API int dWorldGetAutoDisableAverageSamplesCount (dWorldID);
/**
* @brief Set auto disable average sample count for newly created bodies.
* @ingroup disable
* @param average_samples_count Default is 1, meaning only instantaneous velocity is used.
* Set to zero to disable sampling and thus prevent any body from auto-disabling.
*/
ODE_API void dWorldSetAutoDisableAverageSamplesCount (dWorldID, unsigned int average_samples_count );
/**
* @brief Get auto disable steps for newly created bodies.
* @ingroup disable
* @return nr of steps
*/
ODE_API int dWorldGetAutoDisableSteps (dWorldID);
/**
* @brief Set auto disable steps for newly created bodies.
* @ingroup disable
* @param steps default is 10
*/
ODE_API void dWorldSetAutoDisableSteps (dWorldID, int steps);
/**
* @brief Get auto disable time for newly created bodies.
* @ingroup disable
* @return nr of seconds
*/
ODE_API dReal dWorldGetAutoDisableTime (dWorldID);
/**
* @brief Set auto disable time for newly created bodies.
* @ingroup disable
* @param time default is 0 seconds
*/
ODE_API void dWorldSetAutoDisableTime (dWorldID, dReal time);
/**
* @brief Get auto disable flag for newly created bodies.
* @ingroup disable
* @return 0 or 1
*/
ODE_API int dWorldGetAutoDisableFlag (dWorldID);
/**
* @brief Set auto disable flag for newly created bodies.
* @ingroup disable
* @param do_auto_disable default is false.
*/
ODE_API void dWorldSetAutoDisableFlag (dWorldID, int do_auto_disable);
/**
* @defgroup damping Damping
* @ingroup bodies world
*
* Damping serves two purposes: reduce simulation instability, and to allow
* the bodies to come to rest (and possibly auto-disabling them).
*
* Bodies are constructed using the world's current damping parameters. Setting
* the scales to 0 disables the damping.
*
* Here is how it is done: after every time step linear and angular
* velocities are tested against the corresponding thresholds. If they
* are above, they are multiplied by (1 - scale). So a negative scale value
* will actually increase the speed, and values greater than one will
* make the object oscillate every step; both can make the simulation unstable.
*
* To disable damping just set the damping scale to zero.
*
* You can also limit the maximum angular velocity. In contrast to the damping
* functions, the angular velocity is affected before the body is moved.
* This means that it will introduce errors in joints that are forcing the body
* to rotate too fast. Some bodies have naturally high angular velocities
* (like cars' wheels), so you may want to give them a very high (like the default,
* dInfinity) limit.
*
* @note The velocities are damped after the stepper function has moved the
* object. Otherwise the damping could introduce errors in joints. First the
* joint constraints are processed by the stepper (moving the body), then
* the damping is applied.
*
* @note The damping happens right after the moved callback is called; this way
* it still possible use the exact velocities the body has acquired during the
* step. You can even use the callback to create your own customized damping.
*/
/**
* @brief Get the world's linear damping threshold.
* @ingroup damping
*/
ODE_API dReal dWorldGetLinearDampingThreshold (dWorldID w);
/**
* @brief Set the world's linear damping threshold.
* @param threshold The damping won't be applied if the linear speed is
* below this threshold. Default is 0.01.
* @ingroup damping
*/
ODE_API void dWorldSetLinearDampingThreshold(dWorldID w, dReal threshold);
/**
* @brief Get the world's angular damping threshold.
* @ingroup damping
*/
ODE_API dReal dWorldGetAngularDampingThreshold (dWorldID w);
/**
* @brief Set the world's angular damping threshold.
* @param threshold The damping won't be applied if the angular speed is
* below this threshold. Default is 0.01.
* @ingroup damping
*/
ODE_API void dWorldSetAngularDampingThreshold(dWorldID w, dReal threshold);
/**
* @brief Get the world's linear damping scale.
* @ingroup damping
*/
ODE_API dReal dWorldGetLinearDamping (dWorldID w);
/**
* @brief Set the world's linear damping scale.
* @param scale The linear damping scale that is to be applied to bodies.
* Default is 0 (no damping). Should be in the interval [0, 1].
* @ingroup damping
*/
ODE_API void dWorldSetLinearDamping (dWorldID w, dReal scale);
/**
* @brief Get the world's angular damping scale.
* @ingroup damping
*/
ODE_API dReal dWorldGetAngularDamping (dWorldID w);
/**
* @brief Set the world's angular damping scale.
* @param scale The angular damping scale that is to be applied to bodies.
* Default is 0 (no damping). Should be in the interval [0, 1].
* @ingroup damping
*/
ODE_API void dWorldSetAngularDamping(dWorldID w, dReal scale);
/**
* @brief Convenience function to set body linear and angular scales.
* @param linear_scale The linear damping scale that is to be applied to bodies.
* @param angular_scale The angular damping scale that is to be applied to bodies.
* @ingroup damping
*/
ODE_API void dWorldSetDamping(dWorldID w,
dReal linear_scale,
dReal angular_scale);
/**
* @brief Get the default maximum angular speed.
* @ingroup damping
* @sa dBodyGetMaxAngularSpeed()
*/
ODE_API dReal dWorldGetMaxAngularSpeed (dWorldID w);
/**
* @brief Set the default maximum angular speed for new bodies.
* @ingroup damping
* @sa dBodySetMaxAngularSpeed()
*/
ODE_API void dWorldSetMaxAngularSpeed (dWorldID w, dReal max_speed);
/**
* @defgroup bodies Rigid Bodies
*
* A rigid body has various properties from the point of view of the
* simulation. Some properties change over time:
*
* @li Position vector (x,y,z) of the body's point of reference.
* Currently the point of reference must correspond to the body's center of mass.
* @li Linear velocity of the point of reference, a vector (vx,vy,vz).
* @li Orientation of a body, represented by a quaternion (qs,qx,qy,qz) or
* a 3x3 rotation matrix.
* @li Angular velocity vector (wx,wy,wz) which describes how the orientation
* changes over time.
*
* Other body properties are usually constant over time:
*
* @li Mass of the body.
* @li Position of the center of mass with respect to the point of reference.
* In the current implementation the center of mass and the point of
* reference must coincide.
* @li Inertia matrix. This is a 3x3 matrix that describes how the body's mass
* is distributed around the center of mass. Conceptually each body has an
* x-y-z coordinate frame embedded in it that moves and rotates with the body.
*
* The origin of this coordinate frame is the body's point of reference. Some values
* in ODE (vectors, matrices etc) are relative to the body coordinate frame, and others
* are relative to the global coordinate frame.
*
* Note that the shape of a rigid body is not a dynamical property (except insofar as
* it influences the various mass properties). It is only collision detection that cares
* about the detailed shape of the body.
*/
/**
* @brief Get auto disable linear average threshold.
* @ingroup bodies disable
* @return the threshold
*/
ODE_API dReal dBodyGetAutoDisableLinearThreshold (dBodyID);
/**
* @brief Set auto disable linear average threshold.
* @ingroup bodies disable
* @return the threshold
*/
ODE_API void dBodySetAutoDisableLinearThreshold (dBodyID, dReal linear_average_threshold);
/**
* @brief Get auto disable angular average threshold.
* @ingroup bodies disable
* @return the threshold
*/
ODE_API dReal dBodyGetAutoDisableAngularThreshold (dBodyID);
/**
* @brief Set auto disable angular average threshold.
* @ingroup bodies disable
* @return the threshold
*/
ODE_API void dBodySetAutoDisableAngularThreshold (dBodyID, dReal angular_average_threshold);
/**
* @brief Get auto disable average size (samples count).
* @ingroup bodies disable
* @return the nr of steps/size.
*/
ODE_API int dBodyGetAutoDisableAverageSamplesCount (dBodyID);
/**
* @brief Set auto disable average buffer size (average steps).
* @ingroup bodies disable
* @param average_samples_count the nr of samples to review.
*/
ODE_API void dBodySetAutoDisableAverageSamplesCount (dBodyID, unsigned int average_samples_count);
/**
* @brief Get auto steps a body must be thought of as idle to disable
* @ingroup bodies disable
* @return the nr of steps
*/
ODE_API int dBodyGetAutoDisableSteps (dBodyID);
/**
* @brief Set auto disable steps.
* @ingroup bodies disable
* @param steps the nr of steps.
*/
ODE_API void dBodySetAutoDisableSteps (dBodyID, int steps);
/**
* @brief Get auto disable time.
* @ingroup bodies disable
* @return nr of seconds
*/
ODE_API dReal dBodyGetAutoDisableTime (dBodyID);
/**
* @brief Set auto disable time.
* @ingroup bodies disable
* @param time nr of seconds.
*/
ODE_API void dBodySetAutoDisableTime (dBodyID, dReal time);
/**
* @brief Get auto disable flag.
* @ingroup bodies disable
* @return 0 or 1
*/
ODE_API int dBodyGetAutoDisableFlag (dBodyID);
/**
* @brief Set auto disable flag.
* @ingroup bodies disable
* @param do_auto_disable 0 or 1
*/
ODE_API void dBodySetAutoDisableFlag (dBodyID, int do_auto_disable);
/**
* @brief Set auto disable defaults.
* @remarks
* Set the values for the body to those set as default for the world.
* @ingroup bodies disable
*/
ODE_API void dBodySetAutoDisableDefaults (dBodyID);
/**
* @brief Retrieves the world attached to te given body.
* @remarks
*
* @ingroup bodies
*/
ODE_API dWorldID dBodyGetWorld (dBodyID);
/**
* @brief Create a body in given world.
* @remarks
* Default mass parameters are at position (0,0,0).
* @ingroup bodies
*/
ODE_API dBodyID dBodyCreate (dWorldID);
/**
* @brief Destroy a body.
* @remarks
* All joints that are attached to this body will be put into limbo:
* i.e. unattached and not affecting the simulation, but they will NOT be
* deleted.
* @ingroup bodies
*/
ODE_API void dBodyDestroy (dBodyID);
/**
* @brief Set the body's user-data pointer.
* @ingroup bodies
* @param data arbitraty pointer
*/
ODE_API void dBodySetData (dBodyID, void *data);
/**
* @brief Get the body's user-data pointer.
* @ingroup bodies
* @return a pointer to the user's data.
*/
ODE_API void *dBodyGetData (dBodyID);
/**
* @brief Set position of a body.
* @remarks
* After setting, the outcome of the simulation is undefined
* if the new configuration is inconsistent with the joints/constraints
* that are present.
* @ingroup bodies
*/
ODE_API void dBodySetPosition (dBodyID, dReal x, dReal y, dReal z);
/**
* @brief Set the orientation of a body.
* @ingroup bodies
* @remarks
* After setting, the outcome of the simulation is undefined
* if the new configuration is inconsistent with the joints/constraints
* that are present.
*/
ODE_API void dBodySetRotation (dBodyID, const dMatrix3 R);
/**
* @brief Set the orientation of a body.
* @ingroup bodies
* @remarks
* After setting, the outcome of the simulation is undefined
* if the new configuration is inconsistent with the joints/constraints
* that are present.
*/
ODE_API void dBodySetQuaternion (dBodyID, const dQuaternion q);
/**
* @brief Set the linear velocity of a body.
* @ingroup bodies
*/
ODE_API void dBodySetLinearVel (dBodyID, dReal x, dReal y, dReal z);
/**
* @brief Set the angular velocity of a body.
* @ingroup bodies
*/
ODE_API void dBodySetAngularVel (dBodyID, dReal x, dReal y, dReal z);
/**
* @brief Get the position of a body.
* @ingroup bodies
* @remarks
* When getting, the returned values are pointers to internal data structures,
* so the vectors are valid until any changes are made to the rigid body
* system structure.
* @sa dBodyCopyPosition
*/
ODE_API const dReal * dBodyGetPosition (dBodyID);
/**
* @brief Copy the position of a body into a vector.
* @ingroup bodies
* @param body the body to query
* @param pos a copy of the body position
* @sa dBodyGetPosition
*/
ODE_API void dBodyCopyPosition (dBodyID body, dVector3 pos);
/**
* @brief Get the rotation of a body.
* @ingroup bodies
* @return pointer to a 4x3 rotation matrix.
*/
ODE_API const dReal * dBodyGetRotation (dBodyID);
/**
* @brief Copy the rotation of a body.
* @ingroup bodies
* @param body the body to query
* @param R a copy of the rotation matrix
* @sa dBodyGetRotation
*/
ODE_API void dBodyCopyRotation (dBodyID, dMatrix3 R);
/**
* @brief Get the rotation of a body.
* @ingroup bodies
* @return pointer to 4 scalars that represent the quaternion.
*/
ODE_API const dReal * dBodyGetQuaternion (dBodyID);
/**
* @brief Copy the orientation of a body into a quaternion.
* @ingroup bodies
* @param body the body to query
* @param quat a copy of the orientation quaternion
* @sa dBodyGetQuaternion
*/
ODE_API void dBodyCopyQuaternion(dBodyID body, dQuaternion quat);
/**
* @brief Get the linear velocity of a body.
* @ingroup bodies
*/
ODE_API const dReal * dBodyGetLinearVel (dBodyID);
/**
* @brief Get the angular velocity of a body.
* @ingroup bodies
*/
ODE_API const dReal * dBodyGetAngularVel (dBodyID);
/**
* @brief Set the mass of a body.
* @ingroup bodies
*/
ODE_API void dBodySetMass (dBodyID, const dMass *mass);
/**
* @brief Get the mass of a body.
* @ingroup bodies
*/
ODE_API void dBodyGetMass (dBodyID, dMass *mass);
/**
* @brief Add force at centre of mass of body in absolute coordinates.
* @ingroup bodies
*/
ODE_API void dBodyAddForce (dBodyID, dReal fx, dReal fy, dReal fz);
/**
* @brief Add torque at centre of mass of body in absolute coordinates.
* @ingroup bodies
*/
ODE_API void dBodyAddTorque (dBodyID, dReal fx, dReal fy, dReal fz);
/**
* @brief Add force at centre of mass of body in coordinates relative to body.
* @ingroup bodies
*/
ODE_API void dBodyAddRelForce (dBodyID, dReal fx, dReal fy, dReal fz);
/**
* @brief Add torque at centre of mass of body in coordinates relative to body.
* @ingroup bodies
*/
ODE_API void dBodyAddRelTorque (dBodyID, dReal fx, dReal fy, dReal fz);
/**
* @brief Add force at specified point in body in global coordinates.
* @ingroup bodies
*/
ODE_API void dBodyAddForceAtPos (dBodyID, dReal fx, dReal fy, dReal fz,
dReal px, dReal py, dReal pz);
/**
* @brief Add force at specified point in body in local coordinates.
* @ingroup bodies
*/
ODE_API void dBodyAddForceAtRelPos (dBodyID, dReal fx, dReal fy, dReal fz,
dReal px, dReal py, dReal pz);
/**
* @brief Add force at specified point in body in global coordinates.
* @ingroup bodies
*/
ODE_API void dBodyAddRelForceAtPos (dBodyID, dReal fx, dReal fy, dReal fz,
dReal px, dReal py, dReal pz);
/**
* @brief Add force at specified point in body in local coordinates.
* @ingroup bodies
*/
ODE_API void dBodyAddRelForceAtRelPos (dBodyID, dReal fx, dReal fy, dReal fz,
dReal px, dReal py, dReal pz);
/**
* @brief Return the current accumulated force vector.
* @return points to an array of 3 reals.
* @remarks
* The returned values are pointers to internal data structures, so
* the vectors are only valid until any changes are made to the rigid
* body system.
* @ingroup bodies
*/
ODE_API const dReal * dBodyGetForce (dBodyID);
/**
* @brief Return the current accumulated torque vector.
* @return points to an array of 3 reals.
* @remarks
* The returned values are pointers to internal data structures, so
* the vectors are only valid until any changes are made to the rigid
* body system.
* @ingroup bodies
*/
ODE_API const dReal * dBodyGetTorque (dBodyID);
/**
* @brief Set the body force accumulation vector.
* @remarks
* This is mostly useful to zero the force and torque for deactivated bodies
* before they are reactivated, in the case where the force-adding functions
* were called on them while they were deactivated.
* @ingroup bodies
*/
ODE_API void dBodySetForce (dBodyID b, dReal x, dReal y, dReal z);
/**
* @brief Set the body torque accumulation vector.
* @remarks
* This is mostly useful to zero the force and torque for deactivated bodies
* before they are reactivated, in the case where the force-adding functions
* were called on them while they were deactivated.
* @ingroup bodies
*/
ODE_API void dBodySetTorque (dBodyID b, dReal x, dReal y, dReal z);
/**
* @brief Get world position of a relative point on body.
* @ingroup bodies
* @param result will contain the result.
*/
ODE_API void dBodyGetRelPointPos
(
dBodyID, dReal px, dReal py, dReal pz,
dVector3 result
);
/**
* @brief Get velocity vector in global coords of a relative point on body.
* @ingroup bodies
* @param result will contain the result.
*/
ODE_API void dBodyGetRelPointVel
(
dBodyID, dReal px, dReal py, dReal pz,
dVector3 result
);
/**
* @brief Get velocity vector in global coords of a globally
* specified point on a body.
* @ingroup bodies
* @param result will contain the result.
*/
ODE_API void dBodyGetPointVel
(
dBodyID, dReal px, dReal py, dReal pz,
dVector3 result
);
/**
* @brief takes a point in global coordinates and returns
* the point's position in body-relative coordinates.
* @remarks
* This is the inverse of dBodyGetRelPointPos()
* @ingroup bodies
* @param result will contain the result.
*/
ODE_API void dBodyGetPosRelPoint
(
dBodyID, dReal px, dReal py, dReal pz,
dVector3 result
);
/**
* @brief Convert from local to world coordinates.
* @ingroup bodies
* @param result will contain the result.
*/
ODE_API void dBodyVectorToWorld
(
dBodyID, dReal px, dReal py, dReal pz,
dVector3 result
);
/**
* @brief Convert from world to local coordinates.
* @ingroup bodies
* @param result will contain the result.
*/
ODE_API void dBodyVectorFromWorld
(
dBodyID, dReal px, dReal py, dReal pz,
dVector3 result
);
/**
* @brief controls the way a body's orientation is updated at each timestep.
* @ingroup bodies
* @param mode can be 0 or 1:
* \li 0: An ``infinitesimal'' orientation update is used.
* This is fast to compute, but it can occasionally cause inaccuracies
* for bodies that are rotating at high speed, especially when those
* bodies are joined to other bodies.
* This is the default for every new body that is created.
* \li 1: A ``finite'' orientation update is used.
* This is more costly to compute, but will be more accurate for high
* speed rotations.
* @remarks
* Note however that high speed rotations can result in many types of
* error in a simulation, and the finite mode will only fix one of those
* sources of error.
*/
ODE_API void dBodySetFiniteRotationMode (dBodyID, int mode);
/**
* @brief sets the finite rotation axis for a body.
* @ingroup bodies
* @remarks
* This is axis only has meaning when the finite rotation mode is set
* If this axis is zero (0,0,0), full finite rotations are performed on
* the body.
* If this axis is nonzero, the body is rotated by performing a partial finite
* rotation along the axis direction followed by an infinitesimal rotation
* along an orthogonal direction.
* @remarks
* This can be useful to alleviate certain sources of error caused by quickly
* spinning bodies. For example, if a car wheel is rotating at high speed
* you can call this function with the wheel's hinge axis as the argument to
* try and improve its behavior.
*/
ODE_API void dBodySetFiniteRotationAxis (dBodyID, dReal x, dReal y, dReal z);
/**
* @brief Get the way a body's orientation is updated each timestep.
* @ingroup bodies
* @return the mode 0 (infitesimal) or 1 (finite).
*/
ODE_API int dBodyGetFiniteRotationMode (dBodyID);
/**
* @brief Get the finite rotation axis.
* @param result will contain the axis.
* @ingroup bodies
*/
ODE_API void dBodyGetFiniteRotationAxis (dBodyID, dVector3 result);
/**
* @brief Get the number of joints that are attached to this body.
* @ingroup bodies
* @return nr of joints
*/
ODE_API int dBodyGetNumJoints (dBodyID b);
/**
* @brief Return a joint attached to this body, given by index.
* @ingroup bodies
* @param index valid range is 0 to n-1 where n is the value returned by
* dBodyGetNumJoints().
*/
ODE_API dJointID dBodyGetJoint (dBodyID, int index);
/**
* @brief Set rigid body to dynamic state (default).
* @param dBodyID identification of body.
* @ingroup bodies
*/
ODE_API void dBodySetDynamic (dBodyID);
/**
* @brief Set rigid body to kinematic state.
* When in kinematic state the body isn't simulated as a dynamic
* body (it's "unstoppable", doesn't respond to forces),
* but can still affect dynamic bodies (e.g. in joints).
* Kinematic bodies can be controlled by position and velocity.
* @note A kinematic body has infinite mass. If you set its mass
* to something else, it loses the kinematic state and behaves
* as a normal dynamic body.
* @param dBodyID identification of body.
* @ingroup bodies
*/
ODE_API void dBodySetKinematic (dBodyID);
/**
* @brief Check wether a body is in kinematic state.
* @ingroup bodies
* @return 1 if a body is kinematic or 0 if it is dynamic.
*/
ODE_API int dBodyIsKinematic (dBodyID);
/**
* @brief Manually enable a body.
* @param dBodyID identification of body.
* @ingroup bodies
*/
ODE_API void dBodyEnable (dBodyID);
/**
* @brief Manually disable a body.
* @ingroup bodies
* @remarks
* A disabled body that is connected through a joint to an enabled body will
* be automatically re-enabled at the next simulation step.
*/
ODE_API void dBodyDisable (dBodyID);
/**
* @brief Check wether a body is enabled.
* @ingroup bodies
* @return 1 if a body is currently enabled or 0 if it is disabled.
*/
ODE_API int dBodyIsEnabled (dBodyID);
/**
* @brief Set whether the body is influenced by the world's gravity or not.
* @ingroup bodies
* @param mode when nonzero gravity affects this body.
* @remarks
* Newly created bodies are always influenced by the world's gravity.
*/
ODE_API void dBodySetGravityMode (dBodyID b, int mode);
/**
* @brief Get whether the body is influenced by the world's gravity or not.
* @ingroup bodies
* @return nonzero means gravity affects this body.
*/
ODE_API int dBodyGetGravityMode (dBodyID b);
/**
* @brief Set the 'moved' callback of a body.
*
* Whenever a body has its position or rotation changed during the
* timestep, the callback will be called (with body as the argument).
* Use it to know which body may need an update in an external
* structure (like a 3D engine).
*
* @param b the body that needs to be watched.
* @param callback the callback to be invoked when the body moves. Set to zero
* to disable.
* @ingroup bodies
*/
ODE_API void dBodySetMovedCallback(dBodyID b, void (*callback)(dBodyID));
/**
* @brief Return the first geom associated with the body.
*
* You can traverse through the geoms by repeatedly calling
* dBodyGetNextGeom().
*
* @return the first geom attached to this body, or 0.
* @ingroup bodies
*/
ODE_API dGeomID dBodyGetFirstGeom (dBodyID b);
/**
* @brief returns the next geom associated with the same body.
* @param g a geom attached to some body.
* @return the next geom attached to the same body, or 0.
* @sa dBodyGetFirstGeom
* @ingroup bodies
*/
ODE_API dGeomID dBodyGetNextGeom (dGeomID g);
/**
* @brief Resets the damping settings to the current world's settings.
* @ingroup bodies damping
*/
ODE_API void dBodySetDampingDefaults(dBodyID b);
/**
* @brief Get the body's linear damping scale.
* @ingroup bodies damping
*/
ODE_API dReal dBodyGetLinearDamping (dBodyID b);
/**
* @brief Set the body's linear damping scale.
* @param scale The linear damping scale. Should be in the interval [0, 1].
* @ingroup bodies damping
* @remarks From now on the body will not use the world's linear damping
* scale until dBodySetDampingDefaults() is called.
* @sa dBodySetDampingDefaults()
*/
ODE_API void dBodySetLinearDamping(dBodyID b, dReal scale);
/**
* @brief Get the body's angular damping scale.
* @ingroup bodies damping
* @remarks If the body's angular damping scale was not set, this function
* returns the world's angular damping scale.
*/
ODE_API dReal dBodyGetAngularDamping (dBodyID b);
/**
* @brief Set the body's angular damping scale.
* @param scale The angular damping scale. Should be in the interval [0, 1].
* @ingroup bodies damping
* @remarks From now on the body will not use the world's angular damping
* scale until dBodyResetAngularDamping() is called.
* @sa dBodyResetAngularDamping()
*/
ODE_API void dBodySetAngularDamping(dBodyID b, dReal scale);
/**
* @brief Convenience function to set linear and angular scales at once.
* @param linear_scale The linear damping scale. Should be in the interval [0, 1].
* @param angular_scale The angular damping scale. Should be in the interval [0, 1].
* @ingroup bodies damping
* @sa dBodySetLinearDamping() dBodySetAngularDamping()
*/
ODE_API void dBodySetDamping(dBodyID b, dReal linear_scale, dReal angular_scale);
/**
* @brief Get the body's linear damping threshold.
* @ingroup bodies damping
*/
ODE_API dReal dBodyGetLinearDampingThreshold (dBodyID b);
/**
* @brief Set the body's linear damping threshold.
* @param threshold The linear threshold to be used. Damping
* is only applied if the linear speed is above this limit.
* @ingroup bodies damping
*/
ODE_API void dBodySetLinearDampingThreshold(dBodyID b, dReal threshold);
/**
* @brief Get the body's angular damping threshold.
* @ingroup bodies damping
*/
ODE_API dReal dBodyGetAngularDampingThreshold (dBodyID b);
/**
* @brief Set the body's angular damping threshold.
* @param threshold The angular threshold to be used. Damping is
* only used if the angular speed is above this limit.
* @ingroup bodies damping
*/
ODE_API void dBodySetAngularDampingThreshold(dBodyID b, dReal threshold);
/**
* @brief Get the body's maximum angular speed.
* @ingroup damping bodies
* @sa dWorldGetMaxAngularSpeed()
*/
ODE_API dReal dBodyGetMaxAngularSpeed (dBodyID b);
/**
* @brief Set the body's maximum angular speed.
* @ingroup damping bodies
* @sa dWorldSetMaxAngularSpeed() dBodyResetMaxAngularSpeed()
* The default value is dInfinity, but it's a good idea to limit
* it at less than 500 if the body has the gyroscopic term
* enabled.
*/
ODE_API void dBodySetMaxAngularSpeed(dBodyID b, dReal max_speed);
/**
* @brief Get the body's gyroscopic state.
*
* @return nonzero if gyroscopic term computation is enabled (default),
* zero otherwise.
* @ingroup bodies
*/
ODE_API int dBodyGetGyroscopicMode(dBodyID b);
/**
* @brief Enable/disable the body's gyroscopic term.
*
* Disabling the gyroscopic term of a body usually improves
* stability. It also helps turning spining objects, like cars'
* wheels.
*
* @param enabled nonzero (default) to enable gyroscopic term, 0
* to disable.
* @ingroup bodies
*/
ODE_API void dBodySetGyroscopicMode(dBodyID b, int enabled);
/**
* @defgroup joints Joints
*
* In real life a joint is something like a hinge, that is used to connect two
* objects.
* In ODE a joint is very similar: It is a relationship that is enforced between
* two bodies so that they can only have certain positions and orientations
* relative to each other.
* This relationship is called a constraint -- the words joint and
* constraint are often used interchangeably.
*
* A joint has a set of parameters that can be set. These include:
*
*
* \li dParamLoStop Low stop angle or position. Setting this to
* -dInfinity (the default value) turns off the low stop.
* For rotational joints, this stop must be greater than -pi to be
* effective.
* \li dParamHiStop High stop angle or position. Setting this to
* dInfinity (the default value) turns off the high stop.
* For rotational joints, this stop must be less than pi to be
* effective.
* If the high stop is less than the low stop then both stops will
* be ineffective.
* \li dParamVel Desired motor velocity (this will be an angular or
* linear velocity).
* \li dParamFMax The maximum force or torque that the motor will use to
* achieve the desired velocity.
* This must always be greater than or equal to zero.
* Setting this to zero (the default value) turns off the motor.
* \li dParamFudgeFactor The current joint stop/motor implementation has
* a small problem:
* when the joint is at one stop and the motor is set to move it away
* from the stop, too much force may be applied for one time step,
* causing a ``jumping'' motion.
* This fudge factor is used to scale this excess force.
* It should have a value between zero and one (the default value).
* If the jumping motion is too visible in a joint, the value can be
* reduced.
* Making this value too small can prevent the motor from being able to
* move the joint away from a stop.
* \li dParamBounce The bouncyness of the stops.
* This is a restitution parameter in the range 0..1.
* 0 means the stops are not bouncy at all, 1 means maximum bouncyness.
* \li dParamCFM The constraint force mixing (CFM) value used when not
* at a stop.
* \li dParamStopERP The error reduction parameter (ERP) used by the
* stops.
* \li dParamStopCFM The constraint force mixing (CFM) value used by the
* stops. Together with the ERP value this can be used to get spongy or
* soft stops.
* Note that this is intended for unpowered joints, it does not really
* work as expected when a powered joint reaches its limit.
* \li dParamSuspensionERP Suspension error reduction parameter (ERP).
* Currently this is only implemented on the hinge-2 joint.
* \li dParamSuspensionCFM Suspension constraint force mixing (CFM) value.
* Currently this is only implemented on the hinge-2 joint.
*
* If a particular parameter is not implemented by a given joint, setting it
* will have no effect.
* These parameter names can be optionally followed by a digit (2 or 3)
* to indicate the second or third set of parameters, e.g. for the second axis
* in a hinge-2 joint, or the third axis in an AMotor joint.
*/
/**
* @brief Create a new joint of the ball type.
* @ingroup joints
* @remarks
* The joint is initially in "limbo" (i.e. it has no effect on the simulation)
* because it does not connect to any bodies.
* @param dJointGroupID set to 0 to allocate the joint normally.
* If it is nonzero the joint is allocated in the given joint group.
*/
ODE_API dJointID dJointCreateBall (dWorldID, dJointGroupID);
/**
* @brief Create a new joint of the hinge type.
* @ingroup joints
* @param dJointGroupID set to 0 to allocate the joint normally.
* If it is nonzero the joint is allocated in the given joint group.
*/
ODE_API dJointID dJointCreateHinge (dWorldID, dJointGroupID);
/**
* @brief Create a new joint of the slider type.
* @ingroup joints
* @param dJointGroupID set to 0 to allocate the joint normally.
* If it is nonzero the joint is allocated in the given joint group.
*/
ODE_API dJointID dJointCreateSlider (dWorldID, dJointGroupID);
/**
* @brief Create a new joint of the contact type.
* @ingroup joints
* @param dJointGroupID set to 0 to allocate the joint normally.
* If it is nonzero the joint is allocated in the given joint group.
*/
ODE_API dJointID dJointCreateContact (dWorldID, dJointGroupID, const dContact *);
/**
* @brief Create a new joint of the hinge2 type.
* @ingroup joints
* @param dJointGroupID set to 0 to allocate the joint normally.
* If it is nonzero the joint is allocated in the given joint group.
*/
ODE_API dJointID dJointCreateHinge2 (dWorldID, dJointGroupID);
/**
* @brief Create a new joint of the universal type.
* @ingroup joints
* @param dJointGroupID set to 0 to allocate the joint normally.
* If it is nonzero the joint is allocated in the given joint group.
*/
ODE_API dJointID dJointCreateUniversal (dWorldID, dJointGroupID);
/**
* @brief Create a new joint of the PR (Prismatic and Rotoide) type.
* @ingroup joints
* @param dJointGroupID set to 0 to allocate the joint normally.
* If it is nonzero the joint is allocated in the given joint group.
*/
ODE_API dJointID dJointCreatePR (dWorldID, dJointGroupID);
/**
* @brief Create a new joint of the PU (Prismatic and Universal) type.
* @ingroup joints
* @param dJointGroupID set to 0 to allocate the joint normally.
* If it is nonzero the joint is allocated in the given joint group.
*/
ODE_API dJointID dJointCreatePU (dWorldID, dJointGroupID);
/**
* @brief Create a new joint of the Piston type.
* @ingroup joints
* @param dJointGroupID set to 0 to allocate the joint normally.
* If it is nonzero the joint is allocated in the given
* joint group.
*/
ODE_API dJointID dJointCreatePiston (dWorldID, dJointGroupID);
/**
* @brief Create a new joint of the fixed type.
* @ingroup joints
* @param dJointGroupID set to 0 to allocate the joint normally.
* If it is nonzero the joint is allocated in the given joint group.
*/
ODE_API dJointID dJointCreateFixed (dWorldID, dJointGroupID);
ODE_API dJointID dJointCreateNull (dWorldID, dJointGroupID);
/**
* @brief Create a new joint of the A-motor type.
* @ingroup joints
* @param dJointGroupID set to 0 to allocate the joint normally.
* If it is nonzero the joint is allocated in the given joint group.
*/
ODE_API dJointID dJointCreateAMotor (dWorldID, dJointGroupID);
/**
* @brief Create a new joint of the L-motor type.
* @ingroup joints
* @param dJointGroupID set to 0 to allocate the joint normally.
* If it is nonzero the joint is allocated in the given joint group.
*/
ODE_API dJointID dJointCreateLMotor (dWorldID, dJointGroupID);
/**
* @brief Create a new joint of the plane-2d type.
* @ingroup joints
* @param dJointGroupID set to 0 to allocate the joint normally.
* If it is nonzero the joint is allocated in the given joint group.
*/
ODE_API dJointID dJointCreatePlane2D (dWorldID, dJointGroupID);
/**
* @brief Destroy a joint.
* @ingroup joints
*
* disconnects it from its attached bodies and removing it from the world.
* However, if the joint is a member of a group then this function has no
* effect - to destroy that joint the group must be emptied or destroyed.
*/
ODE_API void dJointDestroy (dJointID);
/**
* @brief Create a joint group
* @ingroup joints
* @param max_size deprecated. Set to 0.
*/
ODE_API dJointGroupID dJointGroupCreate (int max_size);
/**
* @brief Destroy a joint group.
* @ingroup joints
*
* All joints in the joint group will be destroyed.
*/
ODE_API void dJointGroupDestroy (dJointGroupID);
/**
* @brief Empty a joint group.
* @ingroup joints
*
* All joints in the joint group will be destroyed,
* but the joint group itself will not be destroyed.
*/
ODE_API void dJointGroupEmpty (dJointGroupID);
/**
* @brief Return the number of bodies attached to the joint
* @ingroup joints
*/
ODE_API int dJointGetNumBodies(dJointID);
/**
* @brief Attach the joint to some new bodies.
* @ingroup joints
*
* If the joint is already attached, it will be detached from the old bodies
* first.
* To attach this joint to only one body, set body1 or body2 to zero - a zero
* body refers to the static environment.
* Setting both bodies to zero puts the joint into "limbo", i.e. it will
* have no effect on the simulation.
* @remarks
* Some joints, like hinge-2 need to be attached to two bodies to work.
*/
ODE_API void dJointAttach (dJointID, dBodyID body1, dBodyID body2);
/**
* @brief Manually enable a joint.
* @param dJointID identification of joint.
* @ingroup joints
*/
ODE_API void dJointEnable (dJointID);
/**
* @brief Manually disable a joint.
* @ingroup joints
* @remarks
* A disabled joint will not affect the simulation, but will maintain the anchors and
* axes so it can be enabled later.
*/
ODE_API void dJointDisable (dJointID);
/**
* @brief Check wether a joint is enabled.
* @ingroup joints
* @return 1 if a joint is currently enabled or 0 if it is disabled.
*/
ODE_API int dJointIsEnabled (dJointID);
/**
* @brief Set the user-data pointer
* @ingroup joints
*/
ODE_API void dJointSetData (dJointID, void *data);
/**
* @brief Get the user-data pointer
* @ingroup joints
*/
ODE_API void *dJointGetData (dJointID);
/**
* @brief Get the type of the joint
* @ingroup joints
* @return the type, being one of these:
* \li dJointTypeBall
* \li dJointTypeHinge
* \li dJointTypeSlider
* \li dJointTypeContact
* \li dJointTypeUniversal
* \li dJointTypeHinge2
* \li dJointTypeFixed
* \li dJointTypeNull
* \li dJointTypeAMotor
* \li dJointTypeLMotor
* \li dJointTypePlane2D
* \li dJointTypePR
* \li dJointTypePU
* \li dJointTypePiston
*/
ODE_API dJointType dJointGetType (dJointID);
/**
* @brief Return the bodies that this joint connects.
* @ingroup joints
* @param index return the first (0) or second (1) body.
* @remarks
* If one of these returned body IDs is zero, the joint connects the other body
* to the static environment.
* If both body IDs are zero, the joint is in ``limbo'' and has no effect on
* the simulation.
*/
ODE_API dBodyID dJointGetBody (dJointID, int index);
/**
* @brief Sets the datastructure that is to receive the feedback.
*
* The feedback can be used by the user, so that it is known how
* much force an individual joint exerts.
* @ingroup joints
*/
ODE_API void dJointSetFeedback (dJointID, dJointFeedback *);
/**
* @brief Gets the datastructure that is to receive the feedback.
* @ingroup joints
*/
ODE_API dJointFeedback *dJointGetFeedback (dJointID);
/**
* @brief Set the joint anchor point.
* @ingroup joints
*
* The joint will try to keep this point on each body
* together. The input is specified in world coordinates.
*/
ODE_API void dJointSetBallAnchor (dJointID, dReal x, dReal y, dReal z);
/**
* @brief Set the joint anchor point.
* @ingroup joints
*/
ODE_API void dJointSetBallAnchor2 (dJointID, dReal x, dReal y, dReal z);
/**
* @brief Param setting for Ball joints
* @ingroup joints
*/
ODE_API void dJointSetBallParam (dJointID, int parameter, dReal value);
/**
* @brief Set hinge anchor parameter.
* @ingroup joints
*/
ODE_API void dJointSetHingeAnchor (dJointID, dReal x, dReal y, dReal z);
ODE_API void dJointSetHingeAnchorDelta (dJointID, dReal x, dReal y, dReal z, dReal ax, dReal ay, dReal az);
/**
* @brief Set hinge axis.
* @ingroup joints
*/
ODE_API void dJointSetHingeAxis (dJointID, dReal x, dReal y, dReal z);
/**
* @brief Set the Hinge axis as if the 2 bodies were already at angle appart.
* @ingroup joints
*
* This function initialize the Axis and the relative orientation of each body
* as if body1 was rotated around the axis by the angle value. \br
* Ex:
* <PRE>
* dJointSetHingeAxis(jId, 1, 0, 0);
* // If you request the position you will have: dJointGetHingeAngle(jId) == 0
* dJointSetHingeAxisDelta(jId, 1, 0, 0, 0.23);
* // If you request the position you will have: dJointGetHingeAngle(jId) == 0.23
* </PRE>
* @param j The Hinge joint ID for which the axis will be set
* @param x The X component of the axis in world frame
* @param y The Y component of the axis in world frame
* @param z The Z component of the axis in world frame
* @param angle The angle for the offset of the relative orientation.
* As if body1 was rotated by angle when the Axis was set (see below).
* The rotation is around the new Hinge axis.
*
* @note Usually the function dJointSetHingeAxis set the current position of body1
* and body2 as the zero angle position. This function set the current position
* as the if the 2 bodies where \b angle appart.
* @warning Calling dJointSetHingeAnchor or dJointSetHingeAxis will reset the "zero"
* angle position.
*/
ODE_API void dJointSetHingeAxisOffset (dJointID j, dReal x, dReal y, dReal z, dReal angle);
/**
* @brief set joint parameter
* @ingroup joints
*/
ODE_API void dJointSetHingeParam (dJointID, int parameter, dReal value);
/**
* @brief Applies the torque about the hinge axis.
*
* That is, it applies a torque with specified magnitude in the direction
* of the hinge axis, to body 1, and with the same magnitude but in opposite
* direction to body 2. This function is just a wrapper for dBodyAddTorque()}
* @ingroup joints
*/
ODE_API void dJointAddHingeTorque(dJointID joint, dReal torque);
/**
* @brief set the joint axis
* @ingroup joints
*/
ODE_API void dJointSetSliderAxis (dJointID, dReal x, dReal y, dReal z);
/**
* @ingroup joints
*/
ODE_API void dJointSetSliderAxisDelta (dJointID, dReal x, dReal y, dReal z, dReal ax, dReal ay, dReal az);
/**
* @brief set joint parameter
* @ingroup joints
*/
ODE_API void dJointSetSliderParam (dJointID, int parameter, dReal value);
/**
* @brief Applies the given force in the slider's direction.
*
* That is, it applies a force with specified magnitude, in the direction of
* slider's axis, to body1, and with the same magnitude but opposite
* direction to body2. This function is just a wrapper for dBodyAddForce().
* @ingroup joints
*/
ODE_API void dJointAddSliderForce(dJointID joint, dReal force);
/**
* @brief set anchor
* @ingroup joints
*/
ODE_API void dJointSetHinge2Anchor (dJointID, dReal x, dReal y, dReal z);
/**
* @brief set axis
* @ingroup joints
*/
ODE_API void dJointSetHinge2Axis1 (dJointID, dReal x, dReal y, dReal z);
/**
* @brief set axis
* @ingroup joints
*/
ODE_API void dJointSetHinge2Axis2 (dJointID, dReal x, dReal y, dReal z);
/**
* @brief set joint parameter
* @ingroup joints
*/
ODE_API void dJointSetHinge2Param (dJointID, int parameter, dReal value);
/**
* @brief Applies torque1 about the hinge2's axis 1, torque2 about the
* hinge2's axis 2.
* @remarks This function is just a wrapper for dBodyAddTorque().
* @ingroup joints
*/
ODE_API void dJointAddHinge2Torques(dJointID joint, dReal torque1, dReal torque2);
/**
* @brief set anchor
* @ingroup joints
*/
ODE_API void dJointSetUniversalAnchor (dJointID, dReal x, dReal y, dReal z);
/**
* @brief set axis
* @ingroup joints
*/
ODE_API void dJointSetUniversalAxis1 (dJointID, dReal x, dReal y, dReal z);
/**
* @brief Set the Universal axis1 as if the 2 bodies were already at
* offset1 and offset2 appart with respect to axis1 and axis2.
* @ingroup joints
*
* This function initialize the axis1 and the relative orientation of
* each body as if body1 was rotated around the new axis1 by the offset1
* value and as if body2 was rotated around the axis2 by offset2. \br
* Ex:
* <PRE>
* dJointSetHuniversalAxis1(jId, 1, 0, 0);
* // If you request the position you will have: dJointGetUniversalAngle1(jId) == 0
* // If you request the position you will have: dJointGetUniversalAngle2(jId) == 0
* dJointSetHuniversalAxis1Offset(jId, 1, 0, 0, 0.2, 0.17);
* // If you request the position you will have: dJointGetUniversalAngle1(jId) == 0.2
* // If you request the position you will have: dJointGetUniversalAngle2(jId) == 0.17
* </PRE>
*
* @param j The Hinge joint ID for which the axis will be set
* @param x The X component of the axis in world frame
* @param y The Y component of the axis in world frame
* @param z The Z component of the axis in world frame
* @param angle The angle for the offset of the relative orientation.
* As if body1 was rotated by angle when the Axis was set (see below).
* The rotation is around the new Hinge axis.
*
* @note Usually the function dJointSetHingeAxis set the current position of body1
* and body2 as the zero angle position. This function set the current position
* as the if the 2 bodies where \b offsets appart.
*
* @note Any previous offsets are erased.
*
* @warning Calling dJointSetUniversalAnchor, dJointSetUnivesalAxis1,
* dJointSetUniversalAxis2, dJointSetUniversalAxis2Offset
* will reset the "zero" angle position.
*/
ODE_API void dJointSetUniversalAxis1Offset (dJointID, dReal x, dReal y, dReal z,
dReal offset1, dReal offset2);
/**
* @brief set axis
* @ingroup joints
*/
ODE_API void dJointSetUniversalAxis2 (dJointID, dReal x, dReal y, dReal z);
/**
* @brief Set the Universal axis2 as if the 2 bodies were already at
* offset1 and offset2 appart with respect to axis1 and axis2.
* @ingroup joints
*
* This function initialize the axis2 and the relative orientation of
* each body as if body1 was rotated around the axis1 by the offset1
* value and as if body2 was rotated around the new axis2 by offset2. \br
* Ex:
* <PRE>
* dJointSetHuniversalAxis2(jId, 0, 1, 0);
* // If you request the position you will have: dJointGetUniversalAngle1(jId) == 0
* // If you request the position you will have: dJointGetUniversalAngle2(jId) == 0
* dJointSetHuniversalAxis2Offset(jId, 0, 1, 0, 0.2, 0.17);
* // If you request the position you will have: dJointGetUniversalAngle1(jId) == 0.2
* // If you request the position you will have: dJointGetUniversalAngle2(jId) == 0.17
* </PRE>
* @param j The Hinge joint ID for which the axis will be set
* @param x The X component of the axis in world frame
* @param y The Y component of the axis in world frame
* @param z The Z component of the axis in world frame
* @param angle The angle for the offset of the relative orientation.
* As if body1 was rotated by angle when the Axis was set (see below).
* The rotation is around the new Hinge axis.
*
* @note Usually the function dJointSetHingeAxis set the current position of body1
* and body2 as the zero angle position. This function set the current position
* as the if the 2 bodies where \b offsets appart.
*
* @note Any previous offsets are erased.
*
* @warning Calling dJointSetUniversalAnchor, dJointSetUnivesalAxis1,
* dJointSetUniversalAxis2, dJointSetUniversalAxis2Offset
* will reset the "zero" angle position.
*/
ODE_API void dJointSetUniversalAxis2Offset (dJointID, dReal x, dReal y, dReal z,
dReal offset1, dReal offset2);
/**
* @brief set joint parameter
* @ingroup joints
*/
ODE_API void dJointSetUniversalParam (dJointID, int parameter, dReal value);
/**
* @brief Applies torque1 about the universal's axis 1, torque2 about the
* universal's axis 2.
* @remarks This function is just a wrapper for dBodyAddTorque().
* @ingroup joints
*/
ODE_API void dJointAddUniversalTorques(dJointID joint, dReal torque1, dReal torque2);
/**
* @brief set anchor
* @ingroup joints
*/
ODE_API void dJointSetPRAnchor (dJointID, dReal x, dReal y, dReal z);
/**
* @brief set the axis for the prismatic articulation
* @ingroup joints
*/
ODE_API void dJointSetPRAxis1 (dJointID, dReal x, dReal y, dReal z);
/**
* @brief set the axis for the rotoide articulation
* @ingroup joints
*/
ODE_API void dJointSetPRAxis2 (dJointID, dReal x, dReal y, dReal z);
/**
* @brief set joint parameter
* @ingroup joints
*
* @note parameterX where X equal 2 refer to parameter for the rotoide articulation
*/
ODE_API void dJointSetPRParam (dJointID, int parameter, dReal value);
/**
* @brief Applies the torque about the rotoide axis of the PR joint
*
* That is, it applies a torque with specified magnitude in the direction
* of the rotoide axis, to body 1, and with the same magnitude but in opposite
* direction to body 2. This function is just a wrapper for dBodyAddTorque()}
* @ingroup joints
*/
ODE_API void dJointAddPRTorque (dJointID j, dReal torque);
/**
* @brief set anchor
* @ingroup joints
*/
ODE_API void dJointSetPUAnchor (dJointID, dReal x, dReal y, dReal z);
/**
* @brief set anchor
* @ingroup joints
*/
ODE_API_DEPRECATED ODE_API void dJointSetPUAnchorDelta (dJointID, dReal x, dReal y, dReal z,
dReal dx, dReal dy, dReal dz);
/**
* @brief Set the PU anchor as if the 2 bodies were already at [dx, dy, dz] appart.
* @ingroup joints
*
* This function initialize the anchor and the relative position of each body
* as if the position between body1 and body2 was already the projection of [dx, dy, dz]
* along the Piston axis. (i.e as if the body1 was at its current position - [dx,dy,dy] when the
* axis is set).
* Ex:
* <PRE>
* dReal offset = 3;
* dVector3 axis;
* dJointGetPUAxis(jId, axis);
* dJointSetPUAnchor(jId, 0, 0, 0);
* // If you request the position you will have: dJointGetPUPosition(jId) == 0
* dJointSetPUAnchorOffset(jId, 0, 0, 0, axis[X]*offset, axis[Y]*offset, axis[Z]*offset);
* // If you request the position you will have: dJointGetPUPosition(jId) == offset
* </PRE>
* @param j The PU joint for which the anchor point will be set
* @param x The X position of the anchor point in world frame
* @param y The Y position of the anchor point in world frame
* @param z The Z position of the anchor point in world frame
* @param dx A delta to be substracted to the X position as if the anchor was set
* when body1 was at current_position[X] - dx
* @param dx A delta to be substracted to the Y position as if the anchor was set
* when body1 was at current_position[Y] - dy
* @param dx A delta to be substracted to the Z position as if the anchor was set
* when body1 was at current_position[Z] - dz
*/
ODE_API void dJointSetPUAnchorOffset (dJointID, dReal x, dReal y, dReal z,
dReal dx, dReal dy, dReal dz);
/**
* @brief set the axis for the first axis or the universal articulation
* @ingroup joints
*/
ODE_API void dJointSetPUAxis1 (dJointID, dReal x, dReal y, dReal z);
/**
* @brief set the axis for the second axis or the universal articulation
* @ingroup joints
*/
ODE_API void dJointSetPUAxis2 (dJointID, dReal x, dReal y, dReal z);
/**
* @brief set the axis for the prismatic articulation
* @ingroup joints
*/
ODE_API void dJointSetPUAxis3 (dJointID, dReal x, dReal y, dReal z);
/**
* @brief set the axis for the prismatic articulation
* @ingroup joints
* @note This function was added for convenience it is the same as
* dJointSetPUAxis3
*/
ODE_API void dJointSetPUAxisP (dJointID id, dReal x, dReal y, dReal z);
/**
* @brief set joint parameter
* @ingroup joints
*
* @note parameterX where X equal 2 refer to parameter for second axis of the
* universal articulation
* @note parameterX where X equal 3 refer to parameter for prismatic
* articulation
*/
ODE_API void dJointSetPUParam (dJointID, int parameter, dReal value);
/**
* @brief Applies the torque about the rotoide axis of the PU joint
*
* That is, it applies a torque with specified magnitude in the direction
* of the rotoide axis, to body 1, and with the same magnitude but in opposite
* direction to body 2. This function is just a wrapper for dBodyAddTorque()}
* @ingroup joints
*/
ODE_API void dJointAddPUTorque (dJointID j, dReal torque);
/**
* @brief set the joint anchor
* @ingroup joints
*/
ODE_API void dJointSetPistonAnchor (dJointID, dReal x, dReal y, dReal z);
/**
* @brief Set the Piston anchor as if the 2 bodies were already at [dx,dy, dz] appart.
* @ingroup joints
*
* This function initialize the anchor and the relative position of each body
* as if the position between body1 and body2 was already the projection of [dx, dy, dz]
* along the Piston axis. (i.e as if the body1 was at its current position - [dx,dy,dy] when the
* axis is set).
* Ex:
* <PRE>
* dReal offset = 3;
* dVector3 axis;
* dJointGetPistonAxis(jId, axis);
* dJointSetPistonAnchor(jId, 0, 0, 0);
* // If you request the position you will have: dJointGetPistonPosition(jId) == 0
* dJointSetPistonAnchorOffset(jId, 0, 0, 0, axis[X]*offset, axis[Y]*offset, axis[Z]*offset);
* // If you request the position you will have: dJointGetPistonPosition(jId) == offset
* </PRE>
* @param j The Piston joint for which the anchor point will be set
* @param x The X position of the anchor point in world frame
* @param y The Y position of the anchor point in world frame
* @param z The Z position of the anchor point in world frame
* @param dx A delta to be substracted to the X position as if the anchor was set
* when body1 was at current_position[X] - dx
* @param dx A delta to be substracted to the Y position as if the anchor was set
* when body1 was at current_position[Y] - dy
* @param dx A delta to be substracted to the Z position as if the anchor was set
* when body1 was at current_position[Z] - dz
*/
ODE_API void dJointSetPistonAnchorOffset(dJointID j, dReal x, dReal y, dReal z,
dReal dx, dReal dy, dReal dz);
/**
* @brief set the joint axis
* @ingroup joints
*/
ODE_API void dJointSetPistonAxis (dJointID, dReal x, dReal y, dReal z);
/**
* This function set prismatic axis of the joint and also set the position
* of the joint.
*
* @ingroup joints
* @param j The joint affected by this function
* @param x The x component of the axis
* @param y The y component of the axis
* @param z The z component of the axis
* @param dx The Initial position of the prismatic join in the x direction
* @param dy The Initial position of the prismatic join in the y direction
* @param dz The Initial position of the prismatic join in the z direction
*/
ODE_API_DEPRECATED ODE_API void dJointSetPistonAxisDelta (dJointID j, dReal x, dReal y, dReal z, dReal ax, dReal ay, dReal az);
/**
* @brief set joint parameter
* @ingroup joints
*/
ODE_API void dJointSetPistonParam (dJointID, int parameter, dReal value);
/**
* @brief Applies the given force in the slider's direction.
*
* That is, it applies a force with specified magnitude, in the direction of
* prismatic's axis, to body1, and with the same magnitude but opposite
* direction to body2. This function is just a wrapper for dBodyAddForce().
* @ingroup joints
*/
ODE_API void dJointAddPistonForce (dJointID joint, dReal force);
/**
* @brief Call this on the fixed joint after it has been attached to
* remember the current desired relative offset and desired relative
* rotation between the bodies.
* @ingroup joints
*/
ODE_API void dJointSetFixed (dJointID);
/*
* @brief Sets joint parameter
*
* @ingroup joints
*/
ODE_API void dJointSetFixedParam (dJointID, int parameter, dReal value);
/**
* @brief set the nr of axes
* @param num 0..3
* @ingroup joints
*/
ODE_API void dJointSetAMotorNumAxes (dJointID, int num);
/**
* @brief set axis
* @ingroup joints
*/
ODE_API void dJointSetAMotorAxis (dJointID, int anum, int rel,
dReal x, dReal y, dReal z);
/**
* @brief Tell the AMotor what the current angle is along axis anum.
*
* This function should only be called in dAMotorUser mode, because in this
* mode the AMotor has no other way of knowing the joint angles.
* The angle information is needed if stops have been set along the axis,
* but it is not needed for axis motors.
* @ingroup joints
*/
ODE_API void dJointSetAMotorAngle (dJointID, int anum, dReal angle);
/**
* @brief set joint parameter
* @ingroup joints
*/
ODE_API void dJointSetAMotorParam (dJointID, int parameter, dReal value);
/**
* @brief set mode
* @ingroup joints
*/
ODE_API void dJointSetAMotorMode (dJointID, int mode);
/**
* @brief Applies torque0 about the AMotor's axis 0, torque1 about the
* AMotor's axis 1, and torque2 about the AMotor's axis 2.
* @remarks
* If the motor has fewer than three axes, the higher torques are ignored.
* This function is just a wrapper for dBodyAddTorque().
* @ingroup joints
*/
ODE_API void dJointAddAMotorTorques (dJointID, dReal torque1, dReal torque2, dReal torque3);
/**
* @brief Set the number of axes that will be controlled by the LMotor.
* @param num can range from 0 (which effectively deactivates the joint) to 3.
* @ingroup joints
*/
ODE_API void dJointSetLMotorNumAxes (dJointID, int num);
/**
* @brief Set the AMotor axes.
* @param anum selects the axis to change (0,1 or 2).
* @param rel Each axis can have one of three ``relative orientation'' modes
* \li 0: The axis is anchored to the global frame.
* \li 1: The axis is anchored to the first body.
* \li 2: The axis is anchored to the second body.
* @remarks The axis vector is always specified in global coordinates
* regardless of the setting of rel.
* @ingroup joints
*/
ODE_API void dJointSetLMotorAxis (dJointID, int anum, int rel, dReal x, dReal y, dReal z);
/**
* @brief set joint parameter
* @ingroup joints
*/
ODE_API void dJointSetLMotorParam (dJointID, int parameter, dReal value);
/**
* @ingroup joints
*/
ODE_API void dJointSetPlane2DXParam (dJointID, int parameter, dReal value);
/**
* @ingroup joints
*/
ODE_API void dJointSetPlane2DYParam (dJointID, int parameter, dReal value);
/**
* @ingroup joints
*/
ODE_API void dJointSetPlane2DAngleParam (dJointID, int parameter, dReal value);
/**
* @brief Get the joint anchor point, in world coordinates.
*
* This returns the point on body 1. If the joint is perfectly satisfied,
* this will be the same as the point on body 2.
*/
ODE_API void dJointGetBallAnchor (dJointID, dVector3 result);
/**
* @brief Get the joint anchor point, in world coordinates.
*
* This returns the point on body 2. You can think of a ball and socket
* joint as trying to keep the result of dJointGetBallAnchor() and
* dJointGetBallAnchor2() the same. If the joint is perfectly satisfied,
* this function will return the same value as dJointGetBallAnchor() to
* within roundoff errors. dJointGetBallAnchor2() can be used, along with
* dJointGetBallAnchor(), to see how far the joint has come apart.
*/
ODE_API void dJointGetBallAnchor2 (dJointID, dVector3 result);
/**
* @brief get joint parameter
* @ingroup joints
*/
ODE_API dReal dJointGetBallParam (dJointID, int parameter);
/**
* @brief Get the hinge anchor point, in world coordinates.
*
* This returns the point on body 1. If the joint is perfectly satisfied,
* this will be the same as the point on body 2.
* @ingroup joints
*/
ODE_API void dJointGetHingeAnchor (dJointID, dVector3 result);
/**
* @brief Get the joint anchor point, in world coordinates.
* @return The point on body 2. If the joint is perfectly satisfied,
* this will return the same value as dJointGetHingeAnchor().
* If not, this value will be slightly different.
* This can be used, for example, to see how far the joint has come apart.
* @ingroup joints
*/
ODE_API void dJointGetHingeAnchor2 (dJointID, dVector3 result);
/**
* @brief get axis
* @ingroup joints
*/
ODE_API void dJointGetHingeAxis (dJointID, dVector3 result);
/**
* @brief get joint parameter
* @ingroup joints
*/
ODE_API dReal dJointGetHingeParam (dJointID, int parameter);
/**
* @brief Get the hinge angle.
*
* The angle is measured between the two bodies, or between the body and
* the static environment.
* The angle will be between -pi..pi.
* Give the relative rotation with respect to the Hinge axis of Body 1 with
* respect to Body 2.
* When the hinge anchor or axis is set, the current position of the attached
* bodies is examined and that position will be the zero angle.
* @ingroup joints
*/
ODE_API dReal dJointGetHingeAngle (dJointID);
/**
* @brief Get the hinge angle time derivative.
* @ingroup joints
*/
ODE_API dReal dJointGetHingeAngleRate (dJointID);
/**
* @brief Get the slider linear position (i.e. the slider's extension)
*
* When the axis is set, the current position of the attached bodies is
* examined and that position will be the zero position.
* The position is the distance, with respect to the zero position,
* along the slider axis of body 1 with respect to
* body 2. (A NULL body is replaced by the world).
* @ingroup joints
*/
ODE_API dReal dJointGetSliderPosition (dJointID);
/**
* @brief Get the slider linear position's time derivative.
* @ingroup joints
*/
ODE_API dReal dJointGetSliderPositionRate (dJointID);
/**
* @brief Get the slider axis
* @ingroup joints
*/
ODE_API void dJointGetSliderAxis (dJointID, dVector3 result);
/**
* @brief get joint parameter
* @ingroup joints
*/
ODE_API dReal dJointGetSliderParam (dJointID, int parameter);
/**
* @brief Get the joint anchor point, in world coordinates.
* @return the point on body 1. If the joint is perfectly satisfied,
* this will be the same as the point on body 2.
* @ingroup joints
*/
ODE_API void dJointGetHinge2Anchor (dJointID, dVector3 result);
/**
* @brief Get the joint anchor point, in world coordinates.
* This returns the point on body 2. If the joint is perfectly satisfied,
* this will return the same value as dJointGetHinge2Anchor.
* If not, this value will be slightly different.
* This can be used, for example, to see how far the joint has come apart.
* @ingroup joints
*/
ODE_API void dJointGetHinge2Anchor2 (dJointID, dVector3 result);
/**
* @brief Get joint axis
* @ingroup joints
*/
ODE_API void dJointGetHinge2Axis1 (dJointID, dVector3 result);
/**
* @brief Get joint axis
* @ingroup joints
*/
ODE_API void dJointGetHinge2Axis2 (dJointID, dVector3 result);
/**
* @brief get joint parameter
* @ingroup joints
*/
ODE_API dReal dJointGetHinge2Param (dJointID, int parameter);
/**
* @brief Get angle
* @ingroup joints
*/
ODE_API dReal dJointGetHinge2Angle1 (dJointID);
/**
* @brief Get time derivative of angle
* @ingroup joints
*/
ODE_API dReal dJointGetHinge2Angle1Rate (dJointID);
/**
* @brief Get time derivative of angle
* @ingroup joints
*/
ODE_API dReal dJointGetHinge2Angle2Rate (dJointID);
/**
* @brief Get the joint anchor point, in world coordinates.
* @return the point on body 1. If the joint is perfectly satisfied,
* this will be the same as the point on body 2.
* @ingroup joints
*/
ODE_API void dJointGetUniversalAnchor (dJointID, dVector3 result);
/**
* @brief Get the joint anchor point, in world coordinates.
* @return This returns the point on body 2.
* @remarks
* You can think of the ball and socket part of a universal joint as
* trying to keep the result of dJointGetBallAnchor() and
* dJointGetBallAnchor2() the same. If the joint is
* perfectly satisfied, this function will return the same value
* as dJointGetUniversalAnchor() to within roundoff errors.
* dJointGetUniversalAnchor2() can be used, along with
* dJointGetUniversalAnchor(), to see how far the joint has come apart.
* @ingroup joints
*/
ODE_API void dJointGetUniversalAnchor2 (dJointID, dVector3 result);
/**
* @brief Get axis
* @ingroup joints
*/
ODE_API void dJointGetUniversalAxis1 (dJointID, dVector3 result);
/**
* @brief Get axis
* @ingroup joints
*/
ODE_API void dJointGetUniversalAxis2 (dJointID, dVector3 result);
/**
* @brief get joint parameter
* @ingroup joints
*/
ODE_API dReal dJointGetUniversalParam (dJointID, int parameter);
/**
* @brief Get both angles at the same time.
* @ingroup joints
*
* @param joint The universal joint for which we want to calculate the angles
* @param angle1 The angle between the body1 and the axis 1
* @param angle2 The angle between the body2 and the axis 2
*
* @note This function combine getUniversalAngle1 and getUniversalAngle2 together
* and try to avoid redundant calculation
*/
ODE_API void dJointGetUniversalAngles (dJointID, dReal *angle1, dReal *angle2);
/**
* @brief Get angle
* @ingroup joints
*/
ODE_API dReal dJointGetUniversalAngle1 (dJointID);
/**
* @brief Get angle
* @ingroup joints
*/
ODE_API dReal dJointGetUniversalAngle2 (dJointID);
/**
* @brief Get time derivative of angle
* @ingroup joints
*/
ODE_API dReal dJointGetUniversalAngle1Rate (dJointID);
/**
* @brief Get time derivative of angle
* @ingroup joints
*/
ODE_API dReal dJointGetUniversalAngle2Rate (dJointID);
/**
* @brief Get the joint anchor point, in world coordinates.
* @return the point on body 1. If the joint is perfectly satisfied,
* this will be the same as the point on body 2.
* @ingroup joints
*/
ODE_API void dJointGetPRAnchor (dJointID, dVector3 result);
/**
* @brief Get the PR linear position (i.e. the prismatic's extension)
*
* When the axis is set, the current position of the attached bodies is
* examined and that position will be the zero position.
*
* The position is the "oriented" length between the
* position = (Prismatic axis) dot_product [(body1 + offset) - (body2 + anchor2)]
*
* @ingroup joints
*/
ODE_API dReal dJointGetPRPosition (dJointID);
/**
* @brief Get the PR linear position's time derivative
*
* @ingroup joints
*/
ODE_API dReal dJointGetPRPositionRate (dJointID);
/**
* @brief Get the PR angular position (i.e. the twist between the 2 bodies)
*
* When the axis is set, the current position of the attached bodies is
* examined and that position will be the zero position.
* @ingroup joints
*/
ODE_API dReal dJointGetPRAngle (dJointID);
/**
* @brief Get the PR angular position's time derivative
*
* @ingroup joints
*/
ODE_API dReal dJointGetPRAngleRate (dJointID);
/**
* @brief Get the prismatic axis
* @ingroup joints
*/
ODE_API void dJointGetPRAxis1 (dJointID, dVector3 result);
/**
* @brief Get the Rotoide axis
* @ingroup joints
*/
ODE_API void dJointGetPRAxis2 (dJointID, dVector3 result);
/**
* @brief get joint parameter
* @ingroup joints
*/
ODE_API dReal dJointGetPRParam (dJointID, int parameter);
/**
* @brief Get the joint anchor point, in world coordinates.
* @return the point on body 1. If the joint is perfectly satisfied,
* this will be the same as the point on body 2.
* @ingroup joints
*/
ODE_API void dJointGetPUAnchor (dJointID, dVector3 result);
/**
* @brief Get the PU linear position (i.e. the prismatic's extension)
*
* When the axis is set, the current position of the attached bodies is
* examined and that position will be the zero position.
*
* The position is the "oriented" length between the
* position = (Prismatic axis) dot_product [(body1 + offset) - (body2 + anchor2)]
*
* @ingroup joints
*/
ODE_API dReal dJointGetPUPosition (dJointID);
/**
* @brief Get the PR linear position's time derivative
*
* @ingroup joints
*/
ODE_API dReal dJointGetPUPositionRate (dJointID);
/**
* @brief Get the first axis of the universal component of the joint
* @ingroup joints
*/
ODE_API void dJointGetPUAxis1 (dJointID, dVector3 result);
/**
* @brief Get the second axis of the Universal component of the joint
* @ingroup joints
*/
ODE_API void dJointGetPUAxis2 (dJointID, dVector3 result);
/**
* @brief Get the prismatic axis
* @ingroup joints
*/
ODE_API void dJointGetPUAxis3 (dJointID, dVector3 result);
/**
* @brief Get the prismatic axis
* @ingroup joints
*
* @note This function was added for convenience it is the same as
* dJointGetPUAxis3
*/
ODE_API void dJointGetPUAxisP (dJointID id, dVector3 result);
/**
* @brief Get both angles at the same time.
* @ingroup joints
*
* @param joint The Prismatic universal joint for which we want to calculate the angles
* @param angle1 The angle between the body1 and the axis 1
* @param angle2 The angle between the body2 and the axis 2
*
* @note This function combine dJointGetPUAngle1 and dJointGetPUAngle2 together
* and try to avoid redundant calculation
*/
ODE_API void dJointGetPUAngles (dJointID, dReal *angle1, dReal *angle2);
/**
* @brief Get angle
* @ingroup joints
*/
ODE_API dReal dJointGetPUAngle1 (dJointID);
/**
* @brief * @brief Get time derivative of angle1
*
* @ingroup joints
*/
ODE_API dReal dJointGetPUAngle1Rate (dJointID);
/**
* @brief Get angle
* @ingroup joints
*/
ODE_API dReal dJointGetPUAngle2 (dJointID);
/**
* @brief * @brief Get time derivative of angle2
*
* @ingroup joints
*/
ODE_API dReal dJointGetPUAngle2Rate (dJointID);
/**
* @brief get joint parameter
* @ingroup joints
*/
ODE_API dReal dJointGetPUParam (dJointID, int parameter);
/**
* @brief Get the Piston linear position (i.e. the piston's extension)
*
* When the axis is set, the current position of the attached bodies is
* examined and that position will be the zero position.
* @ingroup joints
*/
ODE_API dReal dJointGetPistonPosition (dJointID);
/**
* @brief Get the piston linear position's time derivative.
* @ingroup joints
*/
ODE_API dReal dJointGetPistonPositionRate (dJointID);
/**
* @brief Get the Piston angular position (i.e. the twist between the 2 bodies)
*
* When the axis is set, the current position of the attached bodies is
* examined and that position will be the zero position.
* @ingroup joints
*/
ODE_API dReal dJointGetPistonAngle (dJointID);
/**
* @brief Get the piston angular position's time derivative.
* @ingroup joints
*/
ODE_API dReal dJointGetPistonAngleRate (dJointID);
/**
* @brief Get the joint anchor
*
* This returns the point on body 1. If the joint is perfectly satisfied,
* this will be the same as the point on body 2 in direction perpendicular
* to the prismatic axis.
*
* @ingroup joints
*/
ODE_API void dJointGetPistonAnchor (dJointID, dVector3 result);
/**
* @brief Get the joint anchor w.r.t. body 2
*
* This returns the point on body 2. You can think of a Piston
* joint as trying to keep the result of dJointGetPistonAnchor() and
* dJointGetPistonAnchor2() the same in the direction perpendicular to the
* pirsmatic axis. If the joint is perfectly satisfied,
* this function will return the same value as dJointGetPistonAnchor() to
* within roundoff errors. dJointGetPistonAnchor2() can be used, along with
* dJointGetPistonAnchor(), to see how far the joint has come apart.
*
* @ingroup joints
*/
ODE_API void dJointGetPistonAnchor2 (dJointID, dVector3 result);
/**
* @brief Get the prismatic axis (This is also the rotoide axis.
* @ingroup joints
*/
ODE_API void dJointGetPistonAxis (dJointID, dVector3 result);
/**
* @brief get joint parameter
* @ingroup joints
*/
ODE_API dReal dJointGetPistonParam (dJointID, int parameter);
/**
* @brief Get the number of angular axes that will be controlled by the
* AMotor.
* @param num can range from 0 (which effectively deactivates the
* joint) to 3.
* This is automatically set to 3 in dAMotorEuler mode.
* @ingroup joints
*/
ODE_API int dJointGetAMotorNumAxes (dJointID);
/**
* @brief Get the AMotor axes.
* @param anum selects the axis to change (0,1 or 2).
* @param rel Each axis can have one of three ``relative orientation'' modes.
* \li 0: The axis is anchored to the global frame.
* \li 1: The axis is anchored to the first body.
* \li 2: The axis is anchored to the second body.
* @ingroup joints
*/
ODE_API void dJointGetAMotorAxis (dJointID, int anum, dVector3 result);
/**
* @brief Get axis
* @remarks
* The axis vector is always specified in global coordinates regardless
* of the setting of rel.
* There are two GetAMotorAxis functions, one to return the axis and one to
* return the relative mode.
*
* For dAMotorEuler mode:
* \li Only axes 0 and 2 need to be set. Axis 1 will be determined
automatically at each time step.
* \li Axes 0 and 2 must be perpendicular to each other.
* \li Axis 0 must be anchored to the first body, axis 2 must be anchored
to the second body.
* @ingroup joints
*/
ODE_API int dJointGetAMotorAxisRel (dJointID, int anum);
/**
* @brief Get the current angle for axis.
* @remarks
* In dAMotorUser mode this is simply the value that was set with
* dJointSetAMotorAngle().
* In dAMotorEuler mode this is the corresponding euler angle.
* @ingroup joints
*/
ODE_API dReal dJointGetAMotorAngle (dJointID, int anum);
/**
* @brief Get the current angle rate for axis anum.
* @remarks
* In dAMotorUser mode this is always zero, as not enough information is
* available.
* In dAMotorEuler mode this is the corresponding euler angle rate.
* @ingroup joints
*/
ODE_API dReal dJointGetAMotorAngleRate (dJointID, int anum);
/**
* @brief get joint parameter
* @ingroup joints
*/
ODE_API dReal dJointGetAMotorParam (dJointID, int parameter);
/**
* @brief Get the angular motor mode.
* @param mode must be one of the following constants:
* \li dAMotorUser The AMotor axes and joint angle settings are entirely
* controlled by the user. This is the default mode.
* \li dAMotorEuler Euler angles are automatically computed.
* The axis a1 is also automatically computed.
* The AMotor axes must be set correctly when in this mode,
* as described below.
* When this mode is initially set the current relative orientations
* of the bodies will correspond to all euler angles at zero.
* @ingroup joints
*/
ODE_API int dJointGetAMotorMode (dJointID);
/**
* @brief Get nr of axes.
* @ingroup joints
*/
ODE_API int dJointGetLMotorNumAxes (dJointID);
/**
* @brief Get axis.
* @ingroup joints
*/
ODE_API void dJointGetLMotorAxis (dJointID, int anum, dVector3 result);
/**
* @brief get joint parameter
* @ingroup joints
*/
ODE_API dReal dJointGetLMotorParam (dJointID, int parameter);
/**
* @brief get joint parameter
* @ingroup joints
*/
ODE_API dReal dJointGetFixedParam (dJointID, int parameter);
/**
* @ingroup joints
*/
ODE_API dJointID dConnectingJoint (dBodyID, dBodyID);
/**
* @ingroup joints
*/
ODE_API int dConnectingJointList (dBodyID, dBodyID, dJointID*);
/**
* @brief Utility function
* @return 1 if the two bodies are connected together by
* a joint, otherwise return 0.
* @ingroup joints
*/
ODE_API int dAreConnected (dBodyID, dBodyID);
/**
* @brief Utility function
* @return 1 if the two bodies are connected together by
* a joint that does not have type @arg{joint_type}, otherwise return 0.
* @param body1 A body to check.
* @param body2 A body to check.
* @param joint_type is a dJointTypeXXX constant.
* This is useful for deciding whether to add contact joints between two bodies:
* if they are already connected by non-contact joints then it may not be
* appropriate to add contacts, however it is okay to add more contact between-
* bodies that already have contacts.
* @ingroup joints
*/
ODE_API int dAreConnectedExcluding (dBodyID body1, dBodyID body2, int joint_type);
#ifdef __cplusplus
}
#endif
#endif
|