1 | Breakable Joints |
---|
2 | |
---|
3 | ================================================================================ |
---|
4 | |
---|
5 | Description: |
---|
6 | This is a small addition to ODE that makes joints breakable. Breakable means |
---|
7 | that if a force on a joint is to high it wil break. I have included a modified |
---|
8 | version of test_buggy.cpp (test_breakable.cpp) so you can see it for your self. |
---|
9 | Just drive your buggy into an obstacle and enjoy! |
---|
10 | |
---|
11 | ================================================================================ |
---|
12 | |
---|
13 | Installation instructions: |
---|
14 | - copy joint.h, joint.cpp, ode.cpp and step.cpp to the ode/src/ directory |
---|
15 | - copy common.h and object.h to the include/ directory |
---|
16 | - copy test_breakable.cpp to the ode/test/ directory |
---|
17 | - add test_breakable.cpp to the ODE_TEST_SRC_CPP object in the makefile. |
---|
18 | - make ode-lib |
---|
19 | - make ode-test |
---|
20 | You can also use the diffs. The above files will quickly go out of sync with the |
---|
21 | rest of ODE but the diffs wil remain valid longer. |
---|
22 | |
---|
23 | ================================================================================ |
---|
24 | |
---|
25 | Functions: |
---|
26 | dJointSetBreakable (dJointID joint, int b) |
---|
27 | If b is 1 the joint is made breakable. If b is 0 the joint is made |
---|
28 | unbreakable. |
---|
29 | |
---|
30 | void dJointSetBreakCallback (dJointID joint, dJointBreakCallback *callbackFunc) |
---|
31 | Sets the callback function for this joint. If a funtion is set it will be |
---|
32 | called if the joint is broken but before it is actually detached or deleted. |
---|
33 | |
---|
34 | void dJointSetBreakMode (dJointID joint, int mode) |
---|
35 | Use this functions to set some flags. These flags can be ORred ( | ) |
---|
36 | together; ie. dJointSetBreakMode (someJoint, |
---|
37 | dJOINT_BREAK_AT_B1_FORCE|dJOINT_DELETE_ON_BREAK) |
---|
38 | dJOINT_DELETE_ON_BREAK - If the joint breaks it wil be deleted. |
---|
39 | dJOINT_BREAK_AT_B1_FORCE - If the force on body 1 is to high the joint will |
---|
40 | break |
---|
41 | dJOINT_BREAK_AT_B1_TORQUE - If the torque on body 1 is to high the joint will |
---|
42 | break |
---|
43 | dJOINT_BREAK_AT_B2_FORCE - If the force on body 2 is to high the joint will |
---|
44 | break |
---|
45 | dJOINT_BREAK_AT_B2_TORQUE - If the torque on body 2 is to high the joint will |
---|
46 | break |
---|
47 | |
---|
48 | void dJointSetBreakForce (dJointID joint, int body, dReal x, dReal y, dReal z) |
---|
49 | With this function you can set the maximum force for a body connected to this |
---|
50 | joint. A value of 0 for body means body 1, 1 means body 2. The force is |
---|
51 | relative to the bodies rotation. |
---|
52 | |
---|
53 | void dJointSetBreakTorque (dJointID joint, int body, dReal x, dReal y, dReal z) |
---|
54 | With this function you can set the maximum torque for a body connected to this |
---|
55 | joint. A value of 0 for body means body 1, 1 means body 2. The torque is |
---|
56 | relative to the bodies rotation. |
---|
57 | |
---|
58 | int dJointIsBreakable (dJointID joint) |
---|
59 | Returns 1 if this joint is breakable, 0 otherwise. |
---|
60 | |
---|
61 | int dJointGetBreakMode (dJointID joint) |
---|
62 | Returns the breakmode flag. |
---|
63 | |
---|
64 | void dJointGetBreakForce (dJointID joint, int body, dReal *force) |
---|
65 | Returns the force at what this joint will break. A value of 0 for body means |
---|
66 | body 1, 1 means body 2. force must have enough space for 3 dReal values. |
---|
67 | |
---|
68 | void dJointGetBreakTorque (dJointID joint, int body, dReal *torque) |
---|
69 | Returns the torque at what this joint will break. A value of 0 for body |
---|
70 | means body 1, 1 means body 2. force must have enough space for 3 dReal |
---|
71 | values. |
---|
72 | |
---|
73 | ================================================================================ |
---|
74 | |
---|
75 | The callback function is defined like this (in common.h): |
---|
76 | void dJointBreakCallback (dJointID); |
---|
77 | |
---|
78 | ================================================================================ |
---|
79 | |
---|
80 | Problems, known bugs & other issues: |
---|
81 | - If the timestep is very small then joints get a lot weaker. They can even fall |
---|
82 | apart! |
---|
83 | - I have tested all this with the latest checkout from CVS (at the time of |
---|
84 | writing ofcourse). I haven't tested it with earlier versions of ODE. |
---|
85 | - I have modified the code that fills the jointfeedback struct. I haven't tested |
---|
86 | if it still works. |
---|
87 | - I'm not sure if the forces are really relative to the connected bodies. |
---|
88 | - There are some memory leaks in the test_breakable.cpp example. |
---|
89 | |
---|
90 | ================================================================================ |
---|
91 | |
---|
92 | Bugfixes and changes: |
---|
93 | 09/08/2003 |
---|
94 | - I fixed a bug when there where 0 joints in the simulation |
---|
95 | |
---|
96 | 06/12/2003 |
---|
97 | - dJointGetBreakMode() added, by vadim_mcagon@hotmail.com |
---|
98 | |
---|
99 | 11/03/2004 |
---|
100 | - Updated files to work with latest CVS checkout. |
---|
101 | - Added support for dWorldStepFast1() |
---|
102 | - Added separate test_breakable.cpp example. |
---|
103 | - Updated the code that breaks and destroys a joint. |
---|
104 | |
---|
105 | ================================================================================ |
---|
106 | |
---|
107 | Send me an e-mail if you have any suggestions, ideas, bugs, bug-fixes, anything! |
---|
108 | e-mail: roelvandijk@home.nl |
---|
109 | |
---|
110 | Roel van Dijk - 11/03/2004 |
---|