## buoyancy and scaled collisions

Report any bugs here and we'll post fixes

Moderators: Sascha Willems, Thomas

### buoyancy and scaled collisions

Hello,

you should give a try on the buoyancy demo using scaled collision.
I wonder if the collision volume is correct.
arkeon

Posts: 261
Joined: Sat Sep 13, 2014 5:25 pm

### Re: buoyancy and scaled collisions

it maybe me wrong. did you try?
Julio Jerez
Moderator Posts: 11040
Joined: Sun Sep 14, 2003 2:18 pm
Location: Los Angeles

### Re: buoyancy and scaled collisions

Yes for now I could not get a correct volume / plane detection.
CalculateVolumeIntegral allways return 0 in my case.

But maybe I just don't understand what the plane should be ^^

I did a quick test in the demo to add random scale and a lot of objects where in falling.
arkeon

Posts: 261
Joined: Sat Sep 13, 2014 5:25 pm

### Re: buoyancy and scaled collisions

no, I thong is may be wrong. I do not think the code the do the plane cut consider the scale.
I will verify.
Julio Jerez
Moderator Posts: 11040
Joined: Sun Sep 14, 2003 2:18 pm
Location: Los Angeles

### Re: buoyancy and scaled collisions

ok thanks.

just another question.

in the demo you have
Code: Select all
`// get the fluid plane for the upper face of the trigger volume         //NewtonBody* const body = m_controller->GetBody();         m_plane = dVector (0.0f, 1.0f, 0.0f, 1.5f);`

what should be a good method to get the plane from the upper face of the trigger volume ?
and what is the fourth value 1.5 ?
arkeon

Posts: 261
Joined: Sat Sep 13, 2014 5:25 pm

### Re: buoyancy and scaled collisions

The plane is defined as the surface that generate by all point that are a zero distance for some other point alone some direction vectors
If the direction vector is V and the arbitrary point is P0 then the distance for any point
P to P0 alone V is

D = V dot (P – P0)

If you expand that you get

D = P.x * V.x + P.y * V.y + P.z * V.z - ( P0.x * V.x + P0.y * V.y + P0.z * V.z)

But this ( P0.x * V.x + P0.y * V.y + P0.z * V.z)
Is a constant we can call E, and we call P.x = A, P.y = B, P.Z = C

Then the plane equation is

e = A * x + B * y + C * Z + D

when e = zero then that a plane equation
in that example D is 1.5, anything above 1.5 is above the plane everything below 1.5 is below the plane.

how do I find it? I do not, is set like that by design. I say I want the water surface at 1.5 meters from the ground. then I write the plane equation for a plane that is horizontal and is at 1.5 meter above the ground
The trigger volume is just for the engine to capture when an body is close to the that plane so that the buoyancy is applied, because otherwise a plane extent to infinity.
Julio Jerez
Moderator Posts: 11040
Joined: Sun Sep 14, 2003 2:18 pm
Location: Los Angeles

### Re: buoyancy and scaled collisions

ok thanks this is what I was thinking, so my problem must be in the plane test.

so you convert the global plane to the local collision coords and then test which vertices are under or upper the plan.

and this is here the test seems to fail for me.

the w (level) of the plane should be scaled or the vertices maybe in this tests ?
arkeon

Posts: 261
Joined: Sat Sep 13, 2014 5:25 pm

### Re: buoyancy and scaled collisions

yes exactly.

The scaled should be applied to the plane to bring to the space of the un-scaled collision, do the calculation an then the result is converted back to the space of the scaled shape.

But I do not remember doing that so it most be wrong.
Julio Jerez
Moderator Posts: 11040
Joined: Sun Sep 14, 2003 2:18 pm
Location: Los Angeles

### Re: buoyancy and scaled collisions

does it seems correct to you ?

//Edit updated the code
this one is almost working but objects seems to float on the local axis :/
Code: Select all
`dFloat Ixx;   dFloat Iyy;   dFloat Izz;   dFloat mass;           NewtonBodyGetMassMatrix(visitor->getNewtonBody(), &mass, &Ixx, &Iyy, &Izz);   if (mass > 0.0f)  {      dMatrix matrix;    dMatrix offmatrix;      dVector cog;      dVector accelPerUnitMass;      dVector torquePerUnitMass;    //gravity    Ogre::Vector3 gravity(Ogre::Vector3::ZERO);    if(mApplyGravity && mNode != 0 && mNode->GetParentScene() != 0)      gravity = mNode->GetParentScene()->GetPhysicsWorld()->GetPhysicGravity();    //get plane from the top of trigger body    dVector plane(0.0f, 1.0f, 0.0f, 1.5f);    NewtonCollision* const pcollision = NewtonBodyGetCollision(O3Body->getNewtonBody());    NewtonBodyGetMatrix(O3Body->getNewtonBody(), &offmatrix);    dVector minABB;    dVector maxABB;    NewtonCollisionCalculateAABB(pcollision, &offmatrix, &minABB, &maxABB);    Ogre::Quaternion pquat = mNode->GetOgreSceneNodePointer()->_getDerivedOrientation();    Ogre::Vector3 dir = pquat * Ogre::Vector3::UNIT_Y;    //scale visitor values      NewtonCollision* const collision = NewtonBodyGetCollision(visitor->getNewtonBody());    NewtonBodyGetMatrix(visitor->getNewtonBody(), &matrix);    dVector scale(1.0f, 1.0f, 1.0f, 1.0f);    NewtonCollisionGetScale(collision, &scale.m_x, &scale.m_y, &scale.m_z);    dVector invscale(1.0f / scale.m_x, 1.0f / scale.m_y, 1.0f / scale.m_z, 1.0f);      NewtonBodyGetCentreOfMass(visitor->getNewtonBody(), &cog);    matrix.m_posit = matrix.m_posit.CompProduct(invscale);    cog = matrix.TransformVector(cog.CompProduct(invscale));    //plane;    plane.m_x = dir.x;    plane.m_y = dir.y;    plane.m_z = dir.z;    plane.m_w = dir.dotProduct(-Ogre::Vector3(maxABB.m_x * invscale.m_x, maxABB.m_y * invscale.m_y, maxABB.m_z * invscale.m_z));    dFloat shapeVolume = NewtonConvexCollisionCalculateVolume(collision) * invscale.m_x * invscale.m_y * invscale.m_z;      dFloat fluidDentity = mass / (mFluidWaterToVolume * shapeVolume);    NewtonConvexCollisionCalculateBuoyancyAcceleration(collision, &matrix, &cog, &gravity.x, &plane, fluidDentity, mFluidViscosity, &accelPerUnitMass, &torquePerUnitMass);    dVector force (accelPerUnitMass.CompProduct(scale).Scale(mass));      dVector torque (torquePerUnitMass.CompProduct(scale).Scale(mass));      NewtonBodyAddForce (visitor->getNewtonBody(), &force);      NewtonBodyAddTorque (visitor->getNewtonBody(), &torque);   }`

just noticed that the viscosity parameter behavior is commented in newton dgCollisionInstance::CalculateBuoyancyAcceleration

do you plan to get it back ?
arkeon

Posts: 261
Joined: Sat Sep 13, 2014 5:25 pm

### Re: buoyancy and scaled collisions

no luck :/

I'll wait you get the time to manage the scales in this.

I would not disable the scale since this is the only way in newton3 to make an non uniform ellipsoid (and this is a usefull feature in many cases).
arkeon

Posts: 261
Joined: Sat Sep 13, 2014 5:25 pm

### Re: buoyancy and scaled collisions

no do no disable the scale, scale is essential to the engine,

this is eassy to fix, I will do it tomorrow.
Julio Jerez
Moderator Posts: 11040
Joined: Sun Sep 14, 2003 2:18 pm
Location: Los Angeles

### Re: buoyancy and scaled collisions

Ok thanks, I'm trying to understand in newton but maths are just worst than chinese for me ^^

I tried this but the result is the same:

Code: Select all
`dgVector dgCollisionConvex::CalculateVolumeIntegral (const dgMatrix& globalMatrix, const dgVector& globalPlane, const dgVector& scale) const{   dgPlane localPlane (globalMatrix.UntransformPlane (globalPlane));  localPlane.Scale(((dgFloat32)1.0f / scale.m_x) * ((dgFloat32)1.0f / scale.m_y) * ((dgFloat32)1.0f / scale.m_z));  dgVector cg (CalculateVolumeIntegral (localPlane).CompProduct3(scale));      dgFloat32 volume = cg.m_w * scale.m_x * scale.m_y * scale.m_z;   cg = globalMatrix.TransformVector (cg);   cg.m_w = volume;   return cg;}`
arkeon

Posts: 261
Joined: Sat Sep 13, 2014 5:25 pm

### Re: buoyancy and scaled collisions

when I fix it I will show you the exact place where to place the reformation.
you have the idea,

basically the simple

space the plane on input, and scale the value out exit.

what may confuse you is how to apply a non uniform scale to a plane. It is simple but not intuitive.
Is one of those thing that you nee to truth the algebra.
Julio Jerez
Moderator Posts: 11040
Joined: Sun Sep 14, 2003 2:18 pm
Location: Los Angeles

### Re: buoyancy and scaled collisions

hehe ok I'll just wait and stop breaking everything I was wondering that it must be made in previous functions since the compound collision still not act the same than the others (even if it act weird)
arkeon

Posts: 261
Joined: Sat Sep 13, 2014 5:25 pm

### Re: buoyancy and scaled collisions

what should be the proper calculation for the fluid density ?

when I use density = mass / (ratio * objectvolume)
the heavier objects are bouncing out of the trigger volume instead of sinking (object with unit scale)

it seems better when I use
density = 1 / (mass * ratio * objectvolume)

but it don't work either for objects lighter than 1 kg

will you have time to make the scale correction soon ? I have a release on monday and have to know if I put this feature in it or not arkeon

Posts: 261
Joined: Sat Sep 13, 2014 5:25 pm

Next