Files
alternativaphysics-archive/0.0.7.0/src/alternativa/physics/collision/colliders/.svn/text-base/BoxCollider.as.svn-base
2024-10-05 12:31:02 +01:00

427 lines
11 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package alternativa.physics.collision.colliders {
import __AS3__.vec.Vector;
import alternativa.physics.Contact;
import alternativa.physics.collision.CollisionPrimitive;
import alternativa.physics.collision.ICollider;
import alternativa.physics.math.Vector3;
/**
*
*/
public class BoxCollider implements ICollider {
/**
*
*/
public function BoxCollider() {
}
/**
* Проверяет наличие пересечения примитивов. Если пересечение существует, заполняется информация о контакте.
*
* @param prim1 первый примитив
* @param prim2 второй примитив
* @param contact переменная, в которую записывается информация о контакте, если пересечение существует
* @return true, если пересечение существует, иначе false
*/
public function getContact(prim1:CollisionPrimitive, prim2:CollisionPrimitive, contact:Contact):Boolean {
return false;
}
/**
* Выполняет быстрый тест на наличие пересечения двух примитивов.
*
* @param prim1 первый примитив
* @param prim2 второй примитив
* @return true, если пересечение существует, иначе false
*/
public function haveCollision(prim1:CollisionPrimitive, prim2:CollisionPrimitive):Boolean {
return false;
}
/**
* Формирует список вершин грани бокса, заданной нормальной к грани осью. Вершины перечисляются против часовой стрелки.
*
* @param box бокс, в котором ишутся вершины
* @param axisIdx индекс нормальной оси
* @param reverse если указано значение true, возвращаются вершины противоположной грани
* @param result список, в который помещаются вершины
*/
protected function getFaceVertsByAxis(hs:Vector3, axisIdx:int, negativeFace:Boolean, result:Vector.<Vector3>):void {
var v:Vector3;
switch (axisIdx) {
case 0:
if (negativeFace) {
v = result[0]; v.x = -hs.x; v.y = hs.y; v.z = -hs.z;
v = result[1]; v.x = -hs.x; v.y = -hs.y; v.z = -hs.z;
v = result[2]; v.x = -hs.x; v.y = -hs.y; v.z = hs.z;
v = result[3]; v.x = -hs.x; v.y = hs.y; v.z = hs.z;
} else {
v = result[0]; v.x = hs.x; v.y = -hs.y; v.z = -hs.z;
v = result[1]; v.x = hs.x; v.y = hs.y; v.z = -hs.z;
v = result[2]; v.x = hs.x; v.y = hs.y; v.z = hs.z;
v = result[3]; v.x = hs.x; v.y = -hs.y; v.z = hs.z;
}
break;
case 1:
if (negativeFace) {
v = result[0]; v.x = -hs.x; v.y = -hs.y; v.z = -hs.z;
v = result[1]; v.x = hs.x; v.y = -hs.y; v.z = -hs.z;
v = result[2]; v.x = hs.x; v.y = -hs.y; v.z = hs.z;
v = result[3]; v.x = -hs.x; v.y = -hs.y; v.z = hs.z;
} else {
v = result[0]; v.x = hs.x; v.y = hs.y; v.z = -hs.z;
v = result[1]; v.x = -hs.x; v.y = hs.y; v.z = -hs.z;
v = result[2]; v.x = -hs.x; v.y = hs.y; v.z = hs.z;
v = result[3]; v.x = hs.x; v.y = hs.y; v.z = hs.z;
}
break;
case 2:
if (negativeFace) {
v = result[0]; v.x = -hs.x; v.y = hs.y; v.z = -hs.z;
v = result[1]; v.x = hs.x; v.y = hs.y; v.z = -hs.z;
v = result[2]; v.x = hs.x; v.y = -hs.y; v.z = -hs.z;
v = result[3]; v.x = -hs.x; v.y = -hs.y; v.z = -hs.z;
} else {
v = result[0]; v.x = -hs.x; v.y = -hs.y; v.z = hs.z;
v = result[1]; v.x = hs.x; v.y = -hs.y; v.z = hs.z;
v = result[2]; v.x = hs.x; v.y = hs.y; v.z = hs.z;
v = result[3]; v.x = -hs.x; v.y = hs.y; v.z = hs.z;
}
break;
}
}
/**
*
* @param x
* @param pnum
* @param points
* @param result
* @return
*/
protected function clipLowX(x:Number, pnum:int, points:Vector.<Vector3>, result:Vector.<Vector3>, epsilon:Number):int {
var x1:Number = x - epsilon;
var num:int = 0;
var p1:Vector3 = points[int(pnum - 1)];
var p2:Vector3;
var dx:Number;
var dy:Number;
var dz:Number;
var t:Number;
var v:Vector3;
for (var i:int = 0; i < pnum; i++) {
p2 = points[i];
if (p1.x > x1) {
v = result[num];
num++;
v.x = p1.x;
v.y = p1.y;
v.z = p1.z;
if (p2.x < x1) {
dx = p2.x - p1.x;
dy = p2.y - p1.y;
dz = p2.z - p1.z;
t = (x - p1.x)/dx;
v = result[num];
num++;
v.x = p1.x + t*dx;
v.y = p1.y + t*dy;
v.z = p1.z + t*dz;
}
} else if (p2.x > x1) {
dx = p2.x - p1.x;
dy = p2.y - p1.y;
dz = p2.z - p1.z;
t = (x - p1.x)/dx;
v = result[num];
num++;
v.x = p1.x + t*dx;
v.y = p1.y + t*dy;
v.z = p1.z + t*dz;
}
p1 = p2;
}
return num;
}
/**
*
* @param x
* @param pnum
* @param points
* @param result
* @return
*/
protected function clipHighX(x:Number, pnum:int, points:Vector.<Vector3>, result:Vector.<Vector3>, epsilon:Number):int {
var x1:Number = x + epsilon;
var num:int = 0;
var p1:Vector3 = points[int(pnum - 1)];
var p2:Vector3;
var dx:Number;
var dy:Number;
var dz:Number;
var t:Number;
var v:Vector3;
for (var i:int = 0; i < pnum; i++) {
p2 = points[i];
if (p1.x < x1) {
v = result[num];
num++;
v.x = p1.x;
v.y = p1.y;
v.z = p1.z;
if (p2.x > x1) {
dx = p2.x - p1.x;
dy = p2.y - p1.y;
dz = p2.z - p1.z;
t = (x - p1.x)/dx;
v = result[num];
num++;
v.x = p1.x + t*dx;
v.y = p1.y + t*dy;
v.z = p1.z + t*dz;
}
} else if (p2.x < x1) {
dx = p2.x - p1.x;
dy = p2.y - p1.y;
dz = p2.z - p1.z;
t = (x - p1.x)/dx;
v = result[num];
num++;
v.x = p1.x + t*dx;
v.y = p1.y + t*dy;
v.z = p1.z + t*dz;
}
p1 = p2;
}
return num;
}
/**
*
* @param x
* @param pnum
* @param points
* @param result
* @return
*/
protected function clipLowY(y:Number, pnum:int, points:Vector.<Vector3>, result:Vector.<Vector3>, epsilon:Number):int {
var y1:Number = y - epsilon;
var num:int = 0;
var p1:Vector3 = points[int(pnum - 1)];
var p2:Vector3;
var dx:Number;
var dy:Number;
var dz:Number;
var t:Number;
var v:Vector3;
for (var i:int = 0; i < pnum; i++) {
p2 = points[i];
if (p1.y > y1) {
v = result[num];
num++;
v.x = p1.x;
v.y = p1.y;
v.z = p1.z;
if (p2.y < y1) {
dx = p2.x - p1.x;
dy = p2.y - p1.y;
dz = p2.z - p1.z;
t = (y - p1.y)/dy;
v = result[num];
num++;
v.x = p1.x + t*dx;
v.y = p1.y + t*dy;
v.z = p1.z + t*dz;
}
} else if (p2.y > y1) {
dx = p2.x - p1.x;
dy = p2.y - p1.y;
dz = p2.z - p1.z;
t = (y - p1.y)/dy;
v = result[num];
num++;
v.x = p1.x + t*dx;
v.y = p1.y + t*dy;
v.z = p1.z + t*dz;
}
p1 = p2;
}
return num;
}
/**
*
* @param x
* @param pnum
* @param points
* @param result
* @return
*/
protected function clipHighY(y:Number, pnum:int, points:Vector.<Vector3>, result:Vector.<Vector3>, epsilon:Number):int {
var y1:Number = y + epsilon;
var num:int = 0;
var p1:Vector3 = points[int(pnum - 1)];
var p2:Vector3;
var dx:Number;
var dy:Number;
var dz:Number;
var t:Number;
var v:Vector3;
for (var i:int = 0; i < pnum; i++) {
p2 = points[i];
if (p1.y < y1) {
v = result[num];
num++;
v.x = p1.x;
v.y = p1.y;
v.z = p1.z;
if (p2.y > y1) {
dx = p2.x - p1.x;
dy = p2.y - p1.y;
dz = p2.z - p1.z;
t = (y - p1.y)/dy;
v = result[num];
num++;
v.x = p1.x + t*dx;
v.y = p1.y + t*dy;
v.z = p1.z + t*dz;
}
} else if (p2.y < y1) {
dx = p2.x - p1.x;
dy = p2.y - p1.y;
dz = p2.z - p1.z;
t = (y - p1.y)/dy;
v = result[num];
num++;
v.x = p1.x + t*dx;
v.y = p1.y + t*dy;
v.z = p1.z + t*dz;
}
p1 = p2;
}
return num;
}
/**
*
* @param x
* @param pnum
* @param points
* @param result
* @return
*/
protected function clipLowZ(z:Number, pnum:int, points:Vector.<Vector3>, result:Vector.<Vector3>, epsilon:Number):int {
var z1:Number = z - epsilon;
var num:int = 0;
var p1:Vector3 = points[int(pnum - 1)];
var p2:Vector3;
var dx:Number;
var dy:Number;
var dz:Number;
var t:Number;
var v:Vector3;
for (var i:int = 0; i < pnum; i++) {
p2 = points[i];
if (p1.z > z1) {
v = result[num];
num++;
v.x = p1.x;
v.y = p1.y;
v.z = p1.z;
if (p2.z < z1) {
dx = p2.x - p1.x;
dy = p2.y - p1.y;
dz = p2.z - p1.z;
t = (z - p1.z)/dz;
v = result[num];
num++;
v.x = p1.x + t*dx;
v.y = p1.y + t*dy;
v.z = p1.z + t*dz;
}
} else if (p2.z > z1) {
dx = p2.x - p1.x;
dy = p2.y - p1.y;
dz = p2.z - p1.z;
t = (z - p1.z)/dz;
v = result[num];
num++;
v.x = p1.x + t*dx;
v.y = p1.y + t*dy;
v.z = p1.z + t*dz;
}
p1 = p2;
}
return num;
}
/**
*
* @param x
* @param pnum
* @param points
* @param result
* @return
*/
protected function clipHighZ(z:Number, pnum:int, points:Vector.<Vector3>, result:Vector.<Vector3>, epsilon:Number):int {
var z1:Number = z + epsilon;
var num:int = 0;
var p1:Vector3 = points[int(pnum - 1)];
var p2:Vector3;
var dx:Number;
var dy:Number;
var dz:Number;
var t:Number;
var v:Vector3;
for (var i:int = 0; i < pnum; i++) {
p2 = points[i];
if (p1.z < z1) {
v = result[num];
num++;
v.x = p1.x;
v.y = p1.y;
v.z = p1.z;
if (p2.z > z1) {
dx = p2.x - p1.x;
dy = p2.y - p1.y;
dz = p2.z - p1.z;
t = (z - p1.z)/dz;
v = result[num];
num++;
v.x = p1.x + t*dx;
v.y = p1.y + t*dy;
v.z = p1.z + t*dz;
}
} else if (p2.z < z1) {
dx = p2.x - p1.x;
dy = p2.y - p1.y;
dz = p2.z - p1.z;
t = (z - p1.z)/dz;
v = result[num];
num++;
v.x = p1.x + t*dx;
v.y = p1.y + t*dy;
v.z = p1.z + t*dz;
}
p1 = p2;
}
return num;
}
}
}