Flint Particle System Forum - BoundingBox question Sat, 26 May 2012 06:23:23 +0100 http://flintparticles.org/forum/ Lussumo Vanilla 1.1.10 & Feed Publisher BoundingBox question http://flintparticles.org/forum/comments.php?DiscussionID=108&Focus=451#Comment_451 http://flintparticles.org/forum/comments.php?DiscussionID=108&Focus=451#Comment_451 Tue, 28 Oct 2008 11:42:09 +0000 mp
i search about it, but i'll put the question...it's possible have a boundingBox circular, or construct it based on polygon?

thanks.
mp ]]>
BoundingBox question http://flintparticles.org/forum/comments.php?DiscussionID=108&Focus=456#Comment_456 http://flintparticles.org/forum/comments.php?DiscussionID=108&Focus=456#Comment_456 Thu, 30 Oct 2008 15:09:33 +0000 Richard BoundingBox question http://flintparticles.org/forum/comments.php?DiscussionID=108&Focus=523#Comment_523 http://flintparticles.org/forum/comments.php?DiscussionID=108&Focus=523#Comment_523 Tue, 18 Nov 2008 13:45:56 +0000 iworkinprogress BoundingBox question http://flintparticles.org/forum/comments.php?DiscussionID=108&Focus=525#Comment_525 http://flintparticles.org/forum/comments.php?DiscussionID=108&Focus=525#Comment_525 Tue, 18 Nov 2008 14:13:44 +0000 psilos BoundingBox question http://flintparticles.org/forum/comments.php?DiscussionID=108&Focus=627#Comment_627 http://flintparticles.org/forum/comments.php?DiscussionID=108&Focus=627#Comment_627 Thu, 15 Jan 2009 17:36:56 +0000 tlp I tried to implement it for 3DZones, but sadly i failed, at least so far! ;)
Would be so nice to see something like that in next Version soon! ;)

regards

Timo ]]>
BoundingBox question http://flintparticles.org/forum/comments.php?DiscussionID=108&Focus=630#Comment_630 http://flintparticles.org/forum/comments.php?DiscussionID=108&Focus=630#Comment_630 Sun, 18 Jan 2009 10:14:37 +0000 Richard BoundingBox question http://flintparticles.org/forum/comments.php?DiscussionID=108&Focus=632#Comment_632 http://flintparticles.org/forum/comments.php?DiscussionID=108&Focus=632#Comment_632 Sun, 18 Jan 2009 13:49:26 +0000 tlp I will try to check out the branch!
Thanks so much! ]]>
BoundingBox question http://flintparticles.org/forum/comments.php?DiscussionID=108&Focus=1768#Comment_1768 http://flintparticles.org/forum/comments.php?DiscussionID=108&Focus=1768#Comment_1768 Thu, 03 Nov 2011 21:34:42 +0000 Piwie
Is there a way to create a boundingSphere, or others 3d bounding shapes? any workaround?
Iv'e looked into the boundingBox class, but i don't see how to achieve this...

Thanks a lot! ]]>
BoundingBox question http://flintparticles.org/forum/comments.php?DiscussionID=108&Focus=1774#Comment_1774 http://flintparticles.org/forum/comments.php?DiscussionID=108&Focus=1774#Comment_1774 Sat, 05 Nov 2011 11:24:02 +0000 Richard
For a general solution, you need a 3d equivalent of the 2d CollisionZone action. But you could also create a specific custom action just for the shape you need. ]]>
BoundingBox question http://flintparticles.org/forum/comments.php?DiscussionID=108&Focus=1776#Comment_1776 http://flintparticles.org/forum/comments.php?DiscussionID=108&Focus=1776#Comment_1776 Sat, 05 Nov 2011 16:00:36 +0000 Piwie Thank you for your suggestions. I guess create a 3d CollisionZone might be the best solution.
So, in the SphereZone class, i've added a new method in SphereZone , collideParticle, it's code is a copy/paste from 2d DiscZone in which i've add the z dimensions. But, of course, it's not working as i hoped : some particles are bouncing fine, some are juste going outside of my spherezone, and others are bouncing from 10 to 20 pixels. I will be very gratefull if you can take a look at this code!

Thanks so much
<code>
public function collideParticle(particle:Particle3D, bounce:Number = 1):Boolean
{
var outerLimit:Number;
var innerLimit:Number;
var outerLimitSq:Number;
var innerLimitSq:Number;
var distanceSq:Number;
var distance:Number;
var pdx:Number;
var pdy:Number;
var pdz:Number;
var pDistanceSq:Number;
var adjustSpeed:Number;
var positionRatio:Number;
var epsilon:Number = 0.001;
var dx:Number = particle.position.x - _center.x;
var dy:Number = particle.position.y - _center.y;
var dz:Number = particle.position.z - _center.z;
var dotProduct:Number = particle.velocity.x * dx + particle.velocity.y * dy + particle.velocity.z * dz;
if( dotProduct < 0 ) // moving towards center
{
outerLimit = _outerRadius + particle.collisionRadius;
if( Math.abs( dx ) > outerLimit ) return false;
if( Math.abs( dy ) > outerLimit ) return false;
if( Math.abs( dz ) > outerLimit ) return false;
distanceSq = dx * dx + dy * dy + dz * dz;
outerLimitSq = outerLimit * outerLimit;
if( distanceSq > outerLimitSq ) return false;
// Particle is inside outer circle

pdx = (particle.position.x - particle.velocity.x) - _center.x;
pdy = (particle.position.y - particle.velocity.y) - _center.y;
pdz = (particle.position.z - particle.velocity.z) - _center.z;
pDistanceSq = pdx * pdx + pdy * pdy + pdz * pdz;
if( pDistanceSq > outerLimitSq )
{
// particle was outside outer circle
adjustSpeed = ( 1 + bounce ) * dotProduct / distanceSq;
particle.velocity.x -= adjustSpeed * dx;
particle.velocity.y -= adjustSpeed * dy;
particle.velocity.z -= adjustSpeed * dz;
distance = Math.sqrt( distanceSq );
positionRatio = ( 2 * outerLimit - distance ) / distance + epsilon;
particle.position.x = _center.x + dx * positionRatio;
particle.position.y = _center.y + dy * positionRatio;
particle.position.z = _center.z + dz * positionRatio;
return true;
}

if( _innerRadius != 0 && innerRadius != _outerRadius )
{
innerLimit = _innerRadius + particle.collisionRadius;
if( Math.abs( dx ) > innerLimit ) return false;
if( Math.abs( dy ) > innerLimit ) return false;
if( Math.abs( dz ) > innerLimit ) return false;
innerLimitSq = innerLimit * innerLimit;
if( distanceSq > innerLimitSq ) return false;
// Particle is inside inner circle

if( pDistanceSq > innerLimitSq )
{
// particle was outside inner circle
adjustSpeed = ( 1 + bounce ) * dotProduct / distanceSq;
particle.velocity.x -= adjustSpeed * dx;
particle.velocity.y -= adjustSpeed * dy;
particle.velocity.z -= adjustSpeed * dz;
distance = Math.sqrt( distanceSq );
positionRatio = ( 2 * innerLimit - distance ) / distance + epsilon;
particle.position.x = _center.x + dx * positionRatio;
particle.position.y = _center.y + dy * positionRatio;
particle.position.z = _center.z + dz * positionRatio;
return true;
}
}
return false;
}
else // moving away from center
{
outerLimit = _outerRadius - particle.collisionRadius;
//pdx = particle.previousX - _center.x;
pdx = (particle.position.x - particle.velocity.x) - _center.x;
pdy = (particle.position.y - particle.velocity.y) - _center.y;
pdy = (particle.position.z - particle.velocity.z) - _center.z;
if( Math.abs( pdx ) > outerLimit ) return false;
if( Math.abs( pdy ) > outerLimit ) return false;
if( Math.abs( pdz ) > outerLimit ) return false;
pDistanceSq = pdx * pdx + pdy * pdy + pdz * pdz;
outerLimitSq = outerLimit * outerLimit;
if( pDistanceSq > outerLimitSq ) return false;
// particle was inside outer circle

distanceSq = dx * dx + dy * dy + dz * dz;

if( _innerRadius != 0 && innerRadius != _outerRadius )
{
innerLimit = _innerRadius - particle.collisionRadius;
innerLimitSq = innerLimit * innerLimit;
if( pDistanceSq < innerLimitSq && distanceSq >= innerLimitSq )
{
// particle was inside inner circle and is outside it
adjustSpeed = ( 1 + bounce ) * dotProduct / distanceSq;
particle.velocity.x -= adjustSpeed * dx;
particle.velocity.y -= adjustSpeed * dy;
particle.velocity.z -= adjustSpeed * dz;
distance = Math.sqrt( distanceSq );
positionRatio = ( 2 * innerLimit - distance ) / distance - epsilon;
particle.position.x = _center.x + dx * positionRatio;
particle.position.y = _center.y + dy * positionRatio;
particle.position.z = _center.z + dz * positionRatio;
return true;
}
}

if( distanceSq >= outerLimitSq )
{
// Particle is inside outer circle
adjustSpeed = ( 1 + bounce ) * dotProduct / distanceSq;
particle.velocity.x -= adjustSpeed * dx;
particle.velocity.y -= adjustSpeed * dy;
particle.velocity.z -= adjustSpeed * dz;
distance = Math.sqrt( distanceSq );
positionRatio = ( 2 * outerLimit - distance ) / distance - epsilon;
particle.position.x = _center.x + dx * positionRatio;
particle.position.y = _center.y + dy * positionRatio;
particle.position.z = _center.z + dz * positionRatio;
return true;
}
return false;
}
}
</code> ]]>