У меня обнаружено столкновение. Вы можете поместить объекты в положение raycaster/mouse на полу. Поэтому вам нужно нажать кнопку «Добавить объект», затем вы получите объект (помощник), который следует за мышью, чтобы узнать, столкнулся ли новый объект с другим объектом. Когда вы нажимаете на нужную позицию, новый объект будет помещен в мир, если нет столкновения.Обнаружение столкновений Three.js с различными размерами
Обнаружение столкновений, которое я создал, прекрасно работает, когда объект, который уже размещен в мире, имеет тот же размер, что и вспомогательный/новый объект.
На следующем снимке экрана вы можете увидеть большой объект и небольшой (красный) помощник. Красный цвет означает, что есть столкновение. Когда я перемещаю мышь больше вправо, она становится зеленой.
Почему мое обнаружение столкновений работает только с 2 объектами с одинаковым размером и почему это не с разными?
Вот мой код в замковом событии, чтобы показать большой объект:
var geometry = new THREE.BoxGeometry(200, 200, 300);
var bigobject = new THREE.Mesh(geometry, new THREE.MeshBasicMaterial({
color: 0xFBF5D7,
opacity: 1
}));
bigobject.position.copy(intersects[0].point);
bigobject.position.y = 100;
objects.push(bigobject);
scene.add(bigobject);
Вот мой код, чтобы показать помощник, когда кнопка «Добавить объект» щелкает:
var geometry = new THREE.BoxGeometry(50, 50, 100);
helper = new THREE.Mesh(geometry, new THREE.MeshBasicMaterial({ color: 0x00ff00, opacity: 1 }));
helper.name = 'helper';
scene.add(helper);
Вот мой код в случае MouseMove для обнаружения столкновения:
if(scene.getObjectByName('helper')) {
helper.position.copy(intersects[ 0 ].point);
helper.position.y = 25;
var helperWidth = helper.geometry.parameters.width;
var helperLength = helper.geometry.parameters.depth;
var validpositionObject = true;
for (var i = 0; i < objects.length; i++) {
var objectWidth = objects[i].geometry.parameters.width;
var objectLength = objects[i].geometry.parameters.depth;
// MIN X
var helperMinX = helper.position.x;
var objectMinX = objects[i].position.x;
// MAX X
var helperMaxX = helperWidth + helper.position.x;
var objectMaxX = objectWidth + objects[i].position.x;
// MIN Z
var helperMinZ = helper.position.z;
var objectMinZ = objects[i].position.z;
// MAX Z
var helperMaxZ = helperLength + helper.position.z;
var objectMaxZ = objectLength + objects[i].position.z;
if (objectMinX <= helperMaxX && objectMaxX >= helperMinX && objectMinZ <= helperMaxZ && objectMaxZ >= helperMinZ) {
validpositionObject = false;
}
}
if (validpositionObject === true) {
helper.material.color.setHex(0x00ff00);
validposition = true;
}else{
helper.material.color.setHex(0xff0000);
validposition = false;
}
}
Что не так с позицией, когда это большой и маленький объект. Может ли кто-нибудь помочь мне в правильном направлении? Большое спасибо
Я уверен, что объекты расположены по центру, а не сверху передний левый угол. Столкновение х можно определить с помощью 'abs (o1.x - o2.x) <(o1.w + o2.w)/2' –