BVH for SkinnedMesh objects. Computes primitive bounds using
SkinnedMesh.getVertexPosition so the tree reflects the current posed state
of the mesh. Call refit() after updating the skeleton to keep bounds accurate.
import { AnimationMixer, Clock, HemisphereLight } from 'three';
import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';
import { SkinnedMeshBVH, BVHHelper } from 'three-mesh-bvh';
// scene, camera and renderer are initialized here
const URL = 'https://raw.githubusercontent.com/gkjohnson/3d-demo-data/main/models/trex/scene.gltf';
scene.add( new HemisphereLight( 0xffffff, 0x444444, 3 ) );
const { scene: model, animations } = await new GLTFLoader().loadAsync( URL );
model.scale.setScalar( 0.3 );
model.position.set( 0, - 0.7, 0.4 );
scene.add( model );
const helpers = [];
model.traverse( object => {
if ( object.isSkinnedMesh ) {
object.frustumCulled = false;
const helper = new BVHHelper( object, new SkinnedMeshBVH( object ), 10 );
helper.traverse( child => child.frustumCulled = false );
helpers.push( helper );
scene.add( helper );
}
} );
const mixer = new AnimationMixer( model );
mixer.clipAction( animations[ 0 ] ).play();
const clock = new Clock();
renderer.setAnimationLoop( () => {
mixer.update( clock.getDelta() );
scene.updateMatrixWorld( true );
for ( const helper of helpers ) {
helper.bvh.refit();
helper.update();
}
renderer.render( scene, camera );
} );On this page
Methods
new SkinnedMeshBVH(
mesh: SkinnedMesh,
// Same options as GeometryBVH.
options?: Object
)shapecast(
callbacks: {
intersectsBounds: ( box: Box3, isLeaf: boolean, score: number | undefined, depth: number, nodeIndex: number ) => number,
intersectsTriangle?: ( triangle: ExtendedTriangle, triangleIndex: number, contained: boolean, depth: number ) => boolean,
intersectsRange?: ( offset: number, count: number, contained: boolean, depth: number, nodeIndex: number, box: Box3 ) => boolean,
boundsTraverseOrder?: ( box: Box3 ) => number
}
): booleanPerforms a spatial query against the BVH. Extends the base shapecast with an
intersectsTriangle callback that is called once per triangle primitive in leaf nodes.