Обнаружение столкновений с boundingSphere

Для каждой сетки (THREE.Object3D) Three.js обеспечивает очень удобные свойства - boundingSphere а также boundingSphere который имеет intersectsSphere а также isIntersectionBox методы.

При этом я подумал, что смогу использовать его для простого обнаружения столкновений, но при попытке выяснить, что столкновение происходит постоянно, потому что (я пытался boundingSphere) boundingSphere.center всегда находится в (0, 0, 0); Так что, если я хочу проверить столкновения между 2 сетками, я должен для каждого объекта - клон boundingSphere объект, а затем получить его мировые координаты и только потом использовать intersectsSphere,

что-то вроде этого:

var bs = component.object.geometry.boundingSphere.clone();
bs.center.setFromMatrixPosition(component.object.matrixWorld);
...
if (_bs.intersectsSphere(bs)){

это то, как это предполагается использовать или я что-то упустил, и есть более удобный способ обнаружения столкновений на основе boundingBox/boundingSphere?

1 ответ

Решение

Если вы хотите обнаруживать столкновения с помощью ограничивающих рамок, вам нужны блоки в мировой системе координат. Ограничивающие объемы в intersectsSphere а также isIntersectionBox Свойства сетки находятся в локальной системе координат объекта.

Вы можете делать то же, что и вы: клонировать тома и перемещать их в правильное положение в мировой системе координат, это хорошее решение.

В противном случае вы также можете установить новый блок из ваших сеток и сделать столкновение с помощью этих блоков. Допустим, у вас есть THREE.Mesh называется mesh тогда вы можете сделать:

sphere = new THREE.Sphere.setFromPoints( mesh.vertices );

box = new THREE.Box3.setFromObject( mesh );

Небольшой совет. Во время разработки может быть приятно видеть ограничивающие рамки в вашей сцене, для этого вы можете использовать THREE.BoundingBoxHelper:

var helper = new THREE.BoundingBoxHelper( mesh );
scene.add( helper );
Другие вопросы по тегам