Обнаружение столкновений с 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 );