[ODE] Hydrodynamic Forces Demo
Ander Taylor
ander_taylor at hotmail.com
Thu Nov 13 13:54:56 MST 2003
I have posted this before.
Here you go!
void BoxGeom::ApplyHydrodynamicForces(dReal viscosity)
{
const dReal *lvel = dBodyGetLinearVel(this->_body->Id);
const dReal *avel = dBodyGetAngularVel(this->_body->Id);
const dReal *R = dBodyGetRotation(this->_body->Id);
dReal ss[3];
dGeomBoxGetLengths(this->_id, ss);
dReal AreaX = ss[1] * ss[2];
dReal AreaY = ss[0] * ss[2];
dReal AreaZ = ss[0] * ss[1];
dReal nx = (R[0] * lvel[0] + R[4] * lvel[1] + R[8] * lvel[2]) *
AreaX;
dReal ny = (R[1] * lvel[0] + R[5] * lvel[1] + R[9] * lvel[2]) *
AreaY;
dReal nz = (R[2] * lvel[0] + R[6] * lvel[1] + R[10] * lvel[2]) *
AreaZ;
dReal temp = -nx * viscosity;
dBodyAddForce(this->_body->Id, temp * R[0], temp * R[4], temp *
R[8]);
temp = -ny * viscosity;
dBodyAddForce(this->_body->Id, temp * R[1], temp * R[5], temp *
R[9]);
temp =-nz * viscosity;
dBodyAddForce(this->_body->Id, temp * R[2], temp * R[6], temp *
R[10]);
nx = (R[0] * avel[0] + R[4] * avel[1] + R[8] * avel[2]) * AreaZ;
ny = (R[1] * avel[0] + R[5] * avel[1] + R[9] * avel[2]) * AreaX;
nz = (R[2] * avel[0] + R[6] * avel[1] + R[10] * avel[2]) * AreaY;
temp = -nx * viscosity * 500;
dBodyAddTorque(this->_body->Id, temp * R[0], temp * R[4], temp *
R[8]);
temp = -ny * viscosity * 500;
dBodyAddTorque(this->_body->Id, temp * R[1], temp * R[5], temp *
R[9]);
temp = -nz * viscosity * 500;
dBodyAddTorque(this->_body->Id, temp * R[2], temp * R[6], temp *
R[10]);
////this might actually work now with the fabs()'s (may need to
adjust scale):
//dReal temp = -viscosity*fabs(nx+ny+nz);
//dBodyAddForce(this->_body->Id, temp*lvel[0], temp*lvel[1],
temp*lvel[2]);
}
void BoxGeom::ApplyHydrodynamicForces(dReal linear_viscosity, dReal
angular_viscosity, dReal density, Vector3 flow)
{
const dReal *lvel = dBodyGetLinearVel(this->_body->Id);
const dReal *avel = dBodyGetAngularVel(this->_body->Id);
const dReal *R = dBodyGetRotation(this->_body->Id);
dVector3 compFlow;
compFlow[0] = lvel[0] - flow.x;
compFlow[1] = lvel[1] - flow.y;
compFlow[2] = lvel[2] - flow.z;
dReal ss[3];
dGeomBoxGetLengths(this->_id, ss);
dReal AreaX = ss[1] * ss[2];
dReal AreaY = ss[0] * ss[2];
dReal AreaZ = ss[0] * ss[1];
dReal nx = (R[0] * compFlow[0] + R[4] * compFlow[1] + R[8] *
compFlow[2]) * AreaX;
dReal ny = (R[1] * compFlow[0] + R[5] * compFlow[1] + R[9] *
compFlow[2]) * AreaY;
dReal nz = (R[2] * compFlow[0] + R[6] * compFlow[1] + R[10] *
compFlow[2]) * AreaZ;
dReal temp = -nx * linear_viscosity;
dBodyAddForce(this->_body->Id, temp * R[0], temp * R[4], temp *
R[8]);
temp = -ny * linear_viscosity;
dBodyAddForce(this->_body->Id, temp * R[1], temp * R[5], temp *
R[9]);
temp = -nz * linear_viscosity;
dBodyAddForce(this->_body->Id, temp * R[2], temp * R[6], temp *
R[10]);
nx = (R[0] * avel[0] + R[4] * avel[1] + R[8] * avel[2]) * (AreaY +
AreaZ);
ny = (R[1] * avel[0] + R[5] * avel[1] + R[9] * avel[2]) * (AreaX +
AreaZ);
nz = (R[2] * avel[0] + R[6] * avel[1] + R[10] * avel[2]) * (AreaX +
AreaY);
temp = -nx * angular_viscosity;
dBodyAddTorque(this->_body->Id, temp * R[0], temp * R[4], temp *
R[8]);
temp = -ny * angular_viscosity;
dBodyAddTorque(this->_body->Id, temp * R[1], temp * R[5], temp *
R[9]);
temp = -nz * angular_viscosity;
dBodyAddTorque(this->_body->Id, temp * R[2], temp * R[6], temp *
R[10]);
dReal gravity[3];
dWorldGetGravity(this->_body->get_WorldId(), gravity);
temp = -density * ss[0] * ss[1] * ss[2];
dBodyAddForce(this->_body->Id, temp * gravity[0], temp * gravity[1],
temp * gravity[2]);
//which, unless you have a non-axis-aligned gravity, is probably
just:
//dBodyAddForce(body, 0, temp*gravity[1], 0);
}
As I have said before, this is from a Managed C++ Wrapper so you will have
to interpret it.
Cheers,
Ander
----Original Message Follows----
Hi Ander,
Sorry to ask, but it is also possible to have the source code? I would like
to use it in my application, if it would be OK with you, obviously.
Best regards,
Artur Matos.
>
> -----Original Message-----
> From: Ander Taylor [mailto:ander_taylor at hotmail.com]
> Sent: miércoles, 12 de noviembre de 2003 13:28
> To: amatos at create.human.nagoya-u.ac.jp; ode at q12.org
> Subject: Re: [ODE] Hydrodynamic Forces Demo
>
> Hi Artur,
>
> You can get it from here.
>
> http://home.swiftdsl.com.au/~ander
>
> Cheers,
>
> Ander
> _______________________________________________
> ODE mailing list
> ODE at q12.org
> http://q12.org/mailman/listinfo/ode
>
> _________________________________________________________________
> Hot chart ringtones and polyphonics. Go to
> http://ninemsn.com.au/mobilemania/default.asp
>
> _______________________________________________
> ODE mailing list
> ODE at q12.org
> http://q12.org/mailman/listinfo/ode
>
> _________________________________________________________________
> Hot chart ringtones and polyphonics. Go to
> http://ninemsn.com.au/mobilemania/default.asp
>
> _______________________________________________
> ODE mailing list
> ODE at q12.org
> http://q12.org/mailman/listinfo/ode
>
_______________________________________________
ODE mailing list
ODE at q12.org
http://q12.org/mailman/listinfo/ode
_________________________________________________________________
Hot chart ringtones and polyphonics. Go to
http://ninemsn.com.au/mobilemania/default.asp
More information about the ODE
mailing list