Я пытаюсь добавить физику и столкновения в свое приложение Three. js, которое импортирует модель Blender .glb
для объектов сцены.
Для каждого объекта в сцене я использую computeBoundingBox
, чтобы получить bbox, и я хочу создать из него объект Cannon.Box
.
Это в основном то, что я делаю:
scene.traverse((node) => {
node.geometry.computeBoundingBox();
const { position, geometry } = node;
const { min, max } = geometry.boundingBox;
const halfExtents = new Vec3((max.x - min.x) / 2, (max.y - min.y) / 2, (max.z - min.z) / 2);
const boxShape = new Cannon.Box(halfExtents);
const body = new Cannon.Body({ mass: 0, shape: boxShape });
body.position = position;
world.add(body);
const boxHelper = new THREE.BoxHelper(node);
scene.add(boxHelper);
}
Я просто хотел проверить, это был правильный способ создания ящика в мире пушек. В мире Three. js объект BoxHelper
выглядит идеально.
Я заметил, что с Cannon. js API, Box
принимает параметр halfExtents
, который, насколько я понимаю, является просто размер уменьшился вдвое. Итак, я вычисляю это из bbox, но сейчас меня смущает следующее:
Следует ли мне применять матрицу преобразования для ограничивающего прямоугольника? Это всего лишь ограничивающая рамка из геометрии узла, так что нужно ли мне дальше преобразовывать ее, чтобы она соответствовала объекту в мировых координатах? И как мне go это сделать?
Что еще я пропустил / есть ли более стандартный способ выполнения этого рабочего процесса (импортированная 3D-сцена с помощью Cannon. js столкновения)? Я впервые использую Cannon, и мне довольно сложно отлаживать то, что происходит в мире физики.