Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/ode/ode-0.9/contrib/DotNetManaged/Body.cpp @ 216

Last change on this file since 216 was 216, checked in by mathiask, 16 years ago

[Physik] add ode-0.9

File size: 6.2 KB
Line 
1#include "StdAfx.h"
2
3#include <ode/ode.h>
4#include "Body.h"
5
6namespace ODEManaged
7{
8
9        //Constructors
10
11                Body::Body(void)
12                {
13                        _id = 0;
14                }
15
16                Body::Body(World &world)
17                {
18                        _id = dBodyCreate(world.Id());
19                }
20
21
22        //Destructor
23
24                Body::~Body(void)
25                {
26                        dBodyDestroy(this->_id);
27                }
28
29
30        //Methods
31
32                //Id
33                dBodyID Body::Id()
34                {
35                        return _id;
36                }
37
38
39                //SetData
40                void Body::SetData(void *data)
41                {
42                        dBodySetData(this->_id, data);
43                }
44
45                //GetData
46                void *Body::GetData(void)
47                {
48                        return dBodyGetData(this->_id);
49                }
50
51
52                //SetPosition
53                void Body::SetPosition (double x, double y, double z)
54                {
55                        dBodySetPosition(this->_id, x, y, z);
56                }
57
58
59        //Overloaded GetPosition
60                Vector3 Body::GetPosition(void)
61                {
62                        Vector3 retVal;
63                        const dReal *temp;
64                        temp = dBodyGetPosition(this->_id);
65                        retVal.x = temp[0];
66                        retVal.y = temp[1];
67                        retVal.z = temp[2];
68                        return retVal;
69                };
70
71                void Body::GetPosition(double position __gc[])
72                {
73                        const dReal *temp;
74                        temp = dBodyGetPosition(this->_id);
75                        position[0] = temp[0];
76                        position[1] = temp[1];
77                        position[2] = temp[2];
78                }
79
80
81                //SetRotationIdentity
82                void Body::SetRotationIdentity(void)
83                {
84                        dMatrix3 temp;
85                        dRSetIdentity(temp);
86                        dBodySetRotation(this->_id, temp);     
87                }
88       
89
90                //SetRotation (left handed system=>transpose)
91                void Body::SetRotation(Matrix3 rotation)
92                {
93                        dMatrix3 temp;
94                        temp[0] = rotation.m11; 
95                        temp[4] = rotation.m12; 
96                        temp[8] = rotation.m13; 
97                        temp[1] = rotation.m21;
98                        temp[5] = rotation.m22; 
99                        temp[9] = rotation.m23; 
100                        temp[2] = rotation.m31; 
101                        temp[6] = rotation.m32; 
102                        temp[10] = rotation.m33; 
103                        dBodySetRotation(this->_id, temp);
104                }
105
106                //GetRotation (left handed system=>transpose)
107                Matrix3 Body::GetRotation(void)
108                {
109                        Matrix3 retVal;
110                        //const dMatrix3 *m;
111                        const dReal *temp;
112                        temp = dBodyGetRotation(this->_id);
113                        retVal.m11 = temp[0];
114                        retVal.m12 = temp[4];
115                        retVal.m13 = temp[8];
116                        retVal.m21 = temp[1];
117                        retVal.m22 = temp[5];
118                        retVal.m23 = temp[9];
119                        retVal.m31 = temp[2];
120                        retVal.m32 = temp[6];
121                        retVal.m33 = temp[10];
122                        return retVal; 
123                }
124
125
126                //Overloaded SetMass
127                void Body::SetMass(double mass, Vector3 centerOfGravity, Matrix3 inertia)
128                {
129                        dMass *temp = new dMass();
130                        dMassSetParameters(temp, mass, 
131                                                           centerOfGravity.x, 
132                                                           centerOfGravity.y, 
133                                                           centerOfGravity.z, 
134                                                           inertia.m11, inertia.m22, 
135                                                           inertia.m33, inertia.m12, 
136                                                           inertia.m13, inertia.m23);
137
138                        dBodySetMass(this->_id, temp);
139                }
140
141
142                //SetMassSphere
143                void Body::SetMassSphere(double density, double radius)
144                {
145                        dMass *temp = new dMass();
146                        dMassSetSphere(temp, density, radius);
147                        dBodySetMass(this->_id, temp);
148                }       
149
150
151                //SetMassBox
152                void Body::SetMassBox(double density, double sideX, double sideY, double sideZ)
153                {
154                        dMass *temp = new dMass();
155                        dMassSetBox(temp, density, sideX, sideY, sideZ);
156                        dBodySetMass(this->_id, temp);
157                }       
158
159
160                //SetMassCappedCylinder
161                void Body::SetMassCappedCylinder(double density, int axis, double cylinderRadius, double cylinderLength)
162                {
163                        dMass *temp = new dMass();
164                        dMassSetCappedCylinder(temp, density, axis,
165                                                                   cylinderRadius, 
166                                                                   cylinderLength);
167
168                        dBodySetMass(this->_id, temp);
169                }
170
171
172                //AddForce
173                void Body::AddForce(double fX, double fY, double fZ)
174                {
175                        dBodyAddForce(this->_id, fX, fY, fZ);
176                }
177
178
179                //AddRelForce
180                void Body::AddRelForce(double fX, double fY, double fZ)
181                {
182                        dBodyAddRelForce(this->_id, fX,fY,fZ);
183                }
184
185
186                //AddForceAtPos
187                void Body::AddForceAtPos(double fX, double fY, double fZ, double pX, double pY, double pZ)
188                {
189                        dBodyAddForceAtPos(this->_id, fX, fY, fZ, pX, pY, pZ);
190                }
191
192
193                //AddRelForceAtPos
194                void Body::AddRelForceAtPos(double fX, double fY, double fZ, double pX, double pY, double pZ)
195                {
196                        dBodyAddRelForceAtPos(this->_id, fX, fY, fZ, pX, pY, pZ);
197                }
198
199
200                //AddRelForceAtRelPos
201                void Body::AddRelForceAtRelPos(double fX, double fY, double fZ, double pX, double pY, double pZ)
202                {
203                        dBodyAddRelForceAtRelPos(this->_id, fX, fY, fZ, pX, pY, pZ);
204                }       
205
206
207                //ApplyLinearVelocityDrag
208                void Body::ApplyLinearVelocityDrag(double dragCoef)
209                {
210                        const dReal *temp;
211                        double fX;
212                        double fY;
213                        double fZ;             
214                        temp = dBodyGetLinearVel(this->_id);                   
215                        fX = temp[0]*dragCoef*-1;
216                        fY = temp[1]*dragCoef*-1;
217                        fZ = temp[2]*dragCoef*-1;
218                        dBodyAddForce(this->_id, fX, fY, fZ);
219                }
220
221
222                //ApplyAngularVelocityDrag
223                void Body::ApplyAngularVelocityDrag(double dragCoef)
224                {
225                        const dReal *temp;
226                        double fX;
227                        double fY;
228                        double fZ;
229                        temp = dBodyGetAngularVel(this->_id);
230                        fX = temp[0]*dragCoef*-1;
231                        fY = temp[1]*dragCoef*-1;
232                        fZ = temp[2]*dragCoef*-1;
233                        dBodyAddTorque(this->_id, fX, fY, fZ);
234                }
235
236
237                //AddTorque
238                void Body::AddTorque(double fX, double fY, double fZ)
239                {
240                        dBodyAddTorque(this->_id, fX, fY, fZ);
241                }
242
243
244                //AddRelTorque
245                void Body::AddRelTorque(double fX, double fY, double fZ)
246                {
247                        dBodyAddRelTorque(this->_id, fX,fY,fZ);
248                }
249
250
251                //SetLinearVelocity
252                void Body::SetLinearVelocity(double x, double y, double z)
253                {
254                        dBodySetLinearVel(this->_id, x, y, z);
255                }
256
257
258                //GetLinearVelocity
259                Vector3 Body::GetLinearVelocity(void)
260                {
261                        Vector3 retVal;
262                        const dReal *temp;
263                        temp = dBodyGetLinearVel(this->_id);
264                        retVal.x = temp[0];
265                        retVal.y = temp[1];
266                        retVal.z = temp[2];
267                        return retVal;
268                }
269
270
271                //SetAngularVelocity
272                void Body::SetAngularVelocity(double x, double y, double z)
273                {
274                        dBodySetAngularVel(this->_id, x, y, z);
275                }
276
277                //GetAngularVelocity
278                Vector3 Body::GetAngularVelocity(void)
279                {
280                        Vector3 retVal;
281                        const dReal *temp;
282                        temp = dBodyGetAngularVel(this->_id);
283                        retVal.x = temp[0];
284                        retVal.y = temp[1];
285                        retVal.z = temp[2];
286                        return retVal;
287                }
288
289               
290                //GetRelPointPos
291                Vector3 Body::GetRelPointPos(double pX, double pY, double pZ)
292                {
293                        Vector3 retVal;
294                        dVector3 temp;
295                        dBodyGetRelPointPos(this->_id, pX, pY, pZ, temp);
296                        retVal.x = temp[0];
297                        retVal.y = temp[1];
298                        retVal.z = temp[2];
299                        return retVal;
300                }
301
302
303                //GetRelPointVel
304                Vector3 Body::GetRelPointVel(double pX, double pY, double pZ)
305                {
306                        Vector3 retVal;
307                        dVector3 temp;
308                        dBodyGetRelPointVel(this->_id, pX, pY, pZ, temp);
309                        retVal.x = temp[0];
310                        retVal.y = temp[1];
311                        retVal.z = temp[2];
312                        return retVal;
313                }
314
315
316                //ConnectedTo
317                int Body::ConnectedTo(const Body &b)
318                { 
319                        return dAreConnected(this->_id, b._id);
320                }
321
322}
Note: See TracBrowser for help on using the repository browser.