Files
alternativaphysics-archive/0.0.5.Optimized/src/alternativa/physics/collision/primitives/.svn/text-base/CollisionSphere.as.svn-base
2024-10-05 12:31:02 +01:00

80 lines
2.0 KiB
Plaintext

package alternativa.physics.collision.primitives {
import alternativa.physics.altphysics;
import alternativa.physics.collision.types.BoundBox;
import alternativa.physics.types.Vector3;
use namespace altphysics;
/**
* Сфера.
*/
public class CollisionSphere extends CollisionPrimitive {
// Радиус сферы
public var r:Number = 0;
/**
*
* @param r
* @param collisionGroup
*/
public function CollisionSphere(r:Number, collisionGroup:int) {
super(SPHERE, collisionGroup);
this.r = r;
}
/**
* @return
*/
override public function calculateAABB():BoundBox {
aabb.maxX = transform.d + r;
aabb.minX = transform.d - r;
aabb.maxY = transform.h + r;
aabb.minY = transform.h - r;
aabb.maxZ = transform.l + r;
aabb.minZ = transform.l - r;
return aabb;
}
/**
* @param origin
* @param vector
* @param threshold
* @param normal
* @return
*/
override public function getRayIntersection(origin:Vector3, vector:Vector3, threshold:Number, normal:Vector3):Number {
var px:Number = origin.x - transform.d;
var py:Number = origin.y - transform.h;
var pz:Number = origin.z - transform.l;
var k:Number = vector.x*px + vector.y*py + vector.z*pz;
if (k > 0) return -1;
var a:Number = vector.x*vector.x + vector.y*vector.y + vector.z*vector.z;
var D:Number = k*k - a*(px*px + py*py + pz*pz - r*r);
if (D < 0) return -1;
return -(k + Math.sqrt(D))/a;
}
/**
* @param source
* @return
*/
override public function copyFrom(source:CollisionPrimitive):CollisionPrimitive {
var sphere:CollisionSphere = source as CollisionSphere;
if (sphere == null) return this;
super.copyFrom(sphere);
r = sphere.r;
return this;
}
/**
* @return
*/
override protected function createPrimitive():CollisionPrimitive {
return new CollisionSphere(r, collisionGroup);
}
}
}