mirror of
https://github.com/MapMakersAndProgrammers/alternativaphysics-archive.git
synced 2025-10-26 09:59:12 -07:00
80 lines
2.0 KiB
Plaintext
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);
|
|
}
|
|
}
|
|
} |