Page 2 of 2

Re: Sweep and Prune or dBVT for this use case

Posted: Tue Mar 04, 2014 5:48 pm
by Dirk Gregorius
I thought about the shape transform and I think it just comes from Maya where shapes nearly always have a parent transform.

Re: Sweep and Prune or dBVT for this use case

Posted: Wed Mar 05, 2014 11:26 pm
by sphet
So I took another look at my implementation and discovered that I was incorrectly inflating the AABBs for the bone objects. Once I took that into account, things got a lot better. I had to use quite a large inflation value (2 meters) but it does effectively remove all but the first broadphase overlap tests when the characters are pushing up against one another.

In my test case it is 1/10th the cost of SAP in a similar situation with the added bonus of ray queries being faster.

Thanks for your feedback and help Dirk - looks like a win here.

S

Re: Sweep and Prune or dBVT for this use case

Posted: Thu Mar 06, 2014 5:43 pm
by Dirk Gregorius
Are you inflating in the direction of the linear movement of the body or do you use a fixed amount of to inflate? I use a combination of both.

Here is my code for reference. I moved the inflation part into the broadphase and the dynamic tree doesn't know about this. What kind of inflation strategy (if any) you use depends on the use-case so I decoupled it.

Code: Select all

// Bounds are the tight bounds of the parent shape. Displacememnt = LinearVelocity * ElapsedTime
bool rnBroadphase::MoveProxy( int Proxy, const rnBounds3& Bounds, const rnVector3& Displacement )
	{
	if ( mTree.GetBounds( Proxy ).Contains( Bounds ) )
		{
                // No update required
		return false;
		}

	// Update tree with inflated and motion anticipating bounds
	rnVector3 Extension = rnVector3( RN_BOUNDS_EXTENSION, RN_BOUNDS_EXTENSION, RN_BOUNDS_EXTENSION );

	rnBounds3 ExtendedBounds;
	ExtendedBounds.Min = Bounds.Min - Extension;
	ExtendedBounds.Max = Bounds.Max + Extension;

	if ( Displacement.X < 0.0f )
		{
		ExtendedBounds.Min.X += RN_BOUNDS_MULTIPLIER * Displacement.X;
		}
	else
		{
		ExtendedBounds.Max.X += RN_BOUNDS_MULTIPLIER * Displacement.X;
		}

	if ( Displacement.Y < 0.0f )
		{
		ExtendedBounds.Min.Y += RN_BOUNDS_MULTIPLIER * Displacement.Y;
		}
	else
		{
		ExtendedBounds.Max.Y += RN_BOUNDS_MULTIPLIER * Displacement.Y;
		}

	if ( Displacement.Z < 0.0f )
		{
		ExtendedBounds.Min.Z += RN_BOUNDS_MULTIPLIER * Displacement.Z;
		}
	else
		{
		ExtendedBounds.Max.Z += RN_BOUNDS_MULTIPLIER * Displacement.Z;
		}

	mTree.MoveProxy( Proxy, ExtendedBounds );
	BufferMove( Proxy );

        // Update required
        return true;
	}


HTH,
-Dirk

Re: Sweep and Prune or dBVT for this use case

Posted: Thu Mar 06, 2014 6:17 pm
by sphet
Dirk Gregorius wrote:Are you inflating in the direction of the linear movement of the body or do you use a fixed amount of to inflate? I use a combination of both.

Here is my code for reference. I moved the inflation part into the broadphase and the dynamic tree doesn't know about this. What kind of inflation strategy (if any) you use depends on the use-case so I decoupled it.
Dirk,

I did exactly the same thing - I plan on using the dynamic tree for a number of subsystems so I simply made it ignorant of the inflation and did the work in the broadphase.

For bodies with dynamics I inflate in the direction of linear velocity and I inflate it by some amount. For animation-driven bodies (bones) I currently inflate it by a consistent amount around the entire body as I don't currently infer linear velocity from the bone positions - it isn't required in my use case and I can't afford any extra maths.

I may actually put an additional fudge factor into the bodies themselves so that the client code has control over this for certain cases such as rotation-only animated objects (powerups) and fast moving narrow animated objects (projectiles).

Seems we are on the same page here - thanks.

Re: Sweep and Prune or dBVT for this use case

Posted: Fri Mar 07, 2014 3:25 am
by sphet
Dirk,

Do you save the pre-inflated bounds for each object and perform an overlap test with that prior to narrow phase? Obviously the inflated bounds are used to manage the overlapping pairs, but I wonder if smaller objects would benefit from performing a tight-fighting bounds overlap test prior to entering narrow phase.

S

Re: Sweep and Prune or dBVT for this use case

Posted: Fri Mar 07, 2014 4:48 am
by Dirk Gregorius
Good question! Currently I create a contact when the fat AABBs begin to overlap. I never have compared this, though I definitely should. I have other caching schemes (as described earlier) in place which kind of do this though.