Ich mache ein einfaches Spiel, wo Sie Objekte (Würfel) an der Raster (Maus) Position hinzufügen können, wenn Sie auf eine große Ebene (Boden) klicken. Ich möchte nicht, dass Objekte (Würfel) ineinander gelegt werden können. Ich machte eine einfache Kollisionserkennung. Ich weiß, dass dies nicht der beste Weg ist, aber so verstehe ich, was ich tue. Ich bin ein Anfänger.Three.js Kollisionserkennungsproblem
Im folgenden Code überprüfe ich die Positionen beider Objekte. Mit diesen Positionen überprüfe ich den Abstand zwischen ihnen. Wenn die Entfernung kleiner als 4098 ist (also 64 * 64), fügen Sie das Objekt zur Szene hinzu.
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);
}
}
}
}
Das Problem ist, dass dies nur funktioniert, wenn es ein quadratisches Objekt ist. Kann mir jemand helfen, wie ich in welcher Weise für ein Rechteck-Objekt wie THREE.BoxGeometry(64, 64, 400)
denken kann? Danke
Danke. Dieses Beispiel hilft wirklich. Ich verstehe, was du getan hast. Ich versuche diesen Code zu verwenden. Jetzt finde ich heraus, wie ich parseInt (cube.style.left) verwenden kann; für mein Objekt –