Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | 1x | import { vec3 } from 'gl-matrix';
/**
* Checks if a plane intersects with an Axis-Aligned Bounding Box (AABB).
*
* @param origin - The origin point of the plane.
* @param normal - The normal vector of the plane.
* @param minX - The minimum x-coordinate of the AABB.
* @param minY - The minimum y-coordinate of the AABB.
* @param minZ - The minimum z-coordinate of the AABB.
* @param maxX - The maximum x-coordinate of the AABB.
* @param maxY - The maximum y-coordinate of the AABB.
* @param maxZ - The maximum z-coordinate of the AABB.
* @returns A boolean indicating whether the plane intersects with the AABB.
*/
export const isPlaneIntersectingAABB = (
origin,
normal,
minX,
minY,
minZ,
maxX,
maxY,
maxZ
) => {
const vertices = [
vec3.fromValues(minX, minY, minZ),
vec3.fromValues(maxX, minY, minZ),
vec3.fromValues(minX, maxY, minZ),
vec3.fromValues(maxX, maxY, minZ),
vec3.fromValues(minX, minY, maxZ),
vec3.fromValues(maxX, minY, maxZ),
vec3.fromValues(minX, maxY, maxZ),
vec3.fromValues(maxX, maxY, maxZ),
];
const normalVec = vec3.fromValues(normal[0], normal[1], normal[2]);
const originVec = vec3.fromValues(origin[0], origin[1], origin[2]);
// Compute the distance from the plane to the origin using vec3.dot
const planeDistance = -vec3.dot(normalVec, originVec);
// Check if all vertices are on the same side of the plane
let initialSign = null;
for (const vertex of vertices) {
// Calculate distance using vec3.dot to simplify the equation
const distance = vec3.dot(normalVec, vertex) + planeDistance;
if (initialSign === null) {
initialSign = Math.sign(distance);
} else if (Math.sign(distance) !== initialSign) {
return true; // Found a vertex on the other side, so it intersects
}
}
return false;
};
|