forked from bit/DotRecastNetSim
float[] -> Vector3f
This commit is contained in:
parent
f232d5638d
commit
b80b784e31
|
@ -288,16 +288,14 @@ namespace DotRecast.Recast
|
||||||
private static float[] intersectCylinder(float[] rectangle, Vector3f start, Vector3f end, Vector3f axis, float radiusSqr)
|
private static float[] intersectCylinder(float[] rectangle, Vector3f start, Vector3f end, Vector3f axis, float radiusSqr)
|
||||||
{
|
{
|
||||||
float[] s = mergeIntersections(
|
float[] s = mergeIntersections(
|
||||||
rayCylinderIntersection(new float[]
|
rayCylinderIntersection(Vector3f.Of(
|
||||||
{
|
|
||||||
clamp(start[0], rectangle[0], rectangle[2]), rectangle[4],
|
clamp(start[0], rectangle[0], rectangle[2]), rectangle[4],
|
||||||
clamp(start[2], rectangle[1], rectangle[3])
|
clamp(start[2], rectangle[1], rectangle[3])
|
||||||
}, start, axis, radiusSqr),
|
), start, axis, radiusSqr),
|
||||||
rayCylinderIntersection(new float[]
|
rayCylinderIntersection(Vector3f.Of(
|
||||||
{
|
|
||||||
clamp(end[0], rectangle[0], rectangle[2]), rectangle[4],
|
clamp(end[0], rectangle[0], rectangle[2]), rectangle[4],
|
||||||
clamp(end[2], rectangle[1], rectangle[3])
|
clamp(end[2], rectangle[1], rectangle[3])
|
||||||
}, start, axis, radiusSqr));
|
), start, axis, radiusSqr));
|
||||||
float axisLen2dSqr = axis[0] * axis[0] + axis[2] * axis[2];
|
float axisLen2dSqr = axis[0] * axis[0] + axis[2] * axis[2];
|
||||||
if (axisLen2dSqr > EPSILON)
|
if (axisLen2dSqr > EPSILON)
|
||||||
{
|
{
|
||||||
|
@ -340,12 +338,16 @@ namespace DotRecast.Recast
|
||||||
{
|
{
|
||||||
int j = (i + 1) % 4;
|
int j = (i + 1) % 4;
|
||||||
// Ray against sphere intersection
|
// Ray against sphere intersection
|
||||||
float[] m = { rectangleOnPlane[i][0] - start[0], rectangleOnPlane[i][1] - start[1], rectangleOnPlane[i][2] - start[2] };
|
var m = Vector3f.Of(
|
||||||
float[] d =
|
rectangleOnPlane[i][0] - start[0],
|
||||||
{
|
rectangleOnPlane[i][1] - start[1],
|
||||||
rectangleOnPlane[j][0] - rectangleOnPlane[i][0], rectangleOnPlane[j][1] - rectangleOnPlane[i][1],
|
rectangleOnPlane[i][2] - start[2]
|
||||||
|
);
|
||||||
|
var d = Vector3f.Of(
|
||||||
|
rectangleOnPlane[j][0] - rectangleOnPlane[i][0],
|
||||||
|
rectangleOnPlane[j][1] - rectangleOnPlane[i][1],
|
||||||
rectangleOnPlane[j][2] - rectangleOnPlane[i][2]
|
rectangleOnPlane[j][2] - rectangleOnPlane[i][2]
|
||||||
};
|
);
|
||||||
float dl = dot(d, d);
|
float dl = dot(d, d);
|
||||||
float b = dot(m, d) / dl;
|
float b = dot(m, d) / dl;
|
||||||
float c = (dot(m, m) - radiusSqr) / dl;
|
float c = (dot(m, m) - radiusSqr) / dl;
|
||||||
|
@ -400,12 +402,12 @@ namespace DotRecast.Recast
|
||||||
return rayCylinderIntersection(xSlabRayIntersection(rectangle, start, axis, x), start, axis, radiusSqr);
|
return rayCylinderIntersection(xSlabRayIntersection(rectangle, start, axis, x), start, axis, radiusSqr);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static float[] xSlabRayIntersection(float[] rectangle, Vector3f start, Vector3f direction, float x)
|
private static Vector3f xSlabRayIntersection(float[] rectangle, Vector3f start, Vector3f direction, float x)
|
||||||
{
|
{
|
||||||
// 2d intersection of plane and segment
|
// 2d intersection of plane and segment
|
||||||
float t = (x - start[0]) / direction[0];
|
float t = (x - start[0]) / direction[0];
|
||||||
float z = clamp(start[2] + t * direction[2], rectangle[1], rectangle[3]);
|
float z = clamp(start[2] + t * direction[2], rectangle[1], rectangle[3]);
|
||||||
return new float[] { x, rectangle[4], z };
|
return Vector3f.Of(x, rectangle[4], z);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static float[] zSlabCylinderIntersection(float[] rectangle, Vector3f start, Vector3f axis, float radiusSqr, float z)
|
private static float[] zSlabCylinderIntersection(float[] rectangle, Vector3f start, Vector3f axis, float radiusSqr, float z)
|
||||||
|
@ -413,16 +415,16 @@ namespace DotRecast.Recast
|
||||||
return rayCylinderIntersection(zSlabRayIntersection(rectangle, start, axis, z), start, axis, radiusSqr);
|
return rayCylinderIntersection(zSlabRayIntersection(rectangle, start, axis, z), start, axis, radiusSqr);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static float[] zSlabRayIntersection(float[] rectangle, Vector3f start, Vector3f direction, float z)
|
private static Vector3f zSlabRayIntersection(float[] rectangle, Vector3f start, Vector3f direction, float z)
|
||||||
{
|
{
|
||||||
// 2d intersection of plane and segment
|
// 2d intersection of plane and segment
|
||||||
float t = (z - start[2]) / direction[2];
|
float t = (z - start[2]) / direction[2];
|
||||||
float x = clamp(start[0] + t * direction[0], rectangle[0], rectangle[2]);
|
float x = clamp(start[0] + t * direction[0], rectangle[0], rectangle[2]);
|
||||||
return new float[] { x, rectangle[4], z };
|
return Vector3f.Of(x, rectangle[4], z);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Based on Christer Ericsons's "Real-Time Collision Detection"
|
// Based on Christer Ericsons's "Real-Time Collision Detection"
|
||||||
private static float[] rayCylinderIntersection(float[] point, Vector3f start, Vector3f axis, float radiusSqr)
|
private static float[] rayCylinderIntersection(Vector3f point, Vector3f start, Vector3f axis, float radiusSqr)
|
||||||
{
|
{
|
||||||
Vector3f d = axis;
|
Vector3f d = axis;
|
||||||
Vector3f m = Vector3f.Of(point[0] - start[0], point[1] - start[1], point[2] - start[2]);
|
Vector3f m = Vector3f.Of(point[0] - start[0], point[1] - start[1], point[2] - start[2]);
|
||||||
|
|
Loading…
Reference in New Issue