@polygonjs/polygonjs
Version:
node-based WebGL 3D engine https://polygonjs.com
45 lines (40 loc) • 1.37 kB
text/typescript
import {Vector3, BackSide} from 'three';
import {createRaycaster} from '../../../../RaycastHelper';
import {MeshWithBVHGeometry} from '../../../bvh/ThreeMeshBVHHelper';
export const DIRS = [
new Vector3(1.0, 0.0, 0.0),
new Vector3(-1.0, 0.0, 0.0),
new Vector3(0.0, 1.0, 0.0),
new Vector3(0.0, -1.0, 0.0),
new Vector3(0.0, 0.0, 1.0),
new Vector3(0.0, 0.0, -1.0),
];
const _raycaster = createRaycaster();
export function isPositionInsideMesh(pos: Vector3, mesh: MeshWithBVHGeometry, minDist: number): boolean {
// const {mesh, invMat, p, minDist} = options;
let numIn: number = 0;
const bvh = mesh.geometry.boundsTree;
_raycaster.ray.origin.copy(pos);
for (const dir of DIRS) {
_raycaster.ray.direction.copy(dir);
// raycaster.ray.applyMatrix4(invMat);
const hit = bvh.raycastFirst(_raycaster.ray, BackSide);
if (hit) {
const {normal, distance} = hit;
if (normal) {
normal.applyMatrix4(mesh.matrixWorld);
// we test that the normal is facing the other way as the ray,
// since the raycast is tested with BackSide.
// and we can't test with FrontSide as this does not return an intersection
// nor with DoubleSide as we can't tell if the normal is negated or not
if (normal.dot(dir) <= 0.0) {
numIn++;
}
if (minDist > 0.0 && distance < minDist) {
return false;
}
}
}
}
return numIn > 4;
}