Я сделать простую игру, где вы можете добавить объекты (кубы) в raycaster (мыши) положение при нажатии на большой плоскости (земля). Я не хочу, чтобы объекты (кубы) могли помещаться друг в друга. Я сделал простое обнаружение столкновений. Я знаю, что это не лучший способ сделать это, но так я понимаю, что я делаю. Я новичок.Three.js столкновения вопрос обнаружения
В следующем коде я проверяю позиции обоих объектов. С этими позициями я проверяю расстояние между ними. Если расстояние меньше 4098 (это 64 * 64), оно добавляет объект в сцену.
function onDocumentMouseDown(event) {
event.preventDefault();
mouse.x = (event.clientX/renderer.domElement.clientWidth) * 2 - 1;
mouse.y = - (event.clientY/renderer.domElement.clientHeight) * 2 + 1;
raycaster.setFromCamera(mouse, camera);
var intersects = raycaster.intersectObjects(clickObjects);
var intersects2 = raycaster.intersectObjects(objects);
if (intersects.length > 0) { // Clicking on the ground?
if (intersects2.length > 0) { // Clicking on an object?
}else{
var geometry = new THREE.BoxGeometry(64, 64, 64);
var cube = new THREE.Mesh(geometry, new THREE.MeshBasicMaterial({ color: 0xFBF5D7, opacity: 1 }));
cube.position.copy(intersects[0].point);
cube.position.y = 30;
cube.flipSided = true;
cube.doubleSided = true;
var validposition = true;
var i;
for (i = 0; i < objects.length; i++) {
var dx = cube.position.x - objects[i].position.x;
var dy = cube.position.y - objects[i].position.y;
var dz = cube.position.z - objects[i].position.z;
var distance = dx*dx+dy*dy+dz*dz;
if(distance < 4096) {
validposition = false;
}
}
if(validposition == true) {
objects.push(cube);
scene.add(cube);
}
}
}
}
Проблема в том, что это работает только в том случае, если это квадратный объект. Может ли кто-нибудь помочь мне, как я могу думать, каким образом для объекта прямоугольника, такого как THREE.BoxGeometry(64, 64, 400)
? Благодаря
Спасибо. Этот пример действительно помогает. Я понимаю, что вы сделали. Я пытаюсь использовать этот код. Теперь я выясню, как я могу использовать parseInt (cube.style.left); для моего объекта –