2017-01-18 11 views
1

Я сделать простую игру, где вы можете добавить объекты (кубы) в 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)? Благодаря

ответ

1

Я wrrote некоторое время назад римейк Frogger игра от C64. Там мне пришлось контролировать, что у моей лягушки нет контакта с машинами.

var img1_x1 = parseInt(idImg.style.left); 
var img1_x2 = img1_x1 + idImg.width - 1; 
var img1_y1 = parseInt(idImg.style.top); 
var img1_y2 = img1_y1 + idImg.height - 1; 

img2_x1 = parseInt(idImg2.style.left); 
img2_x2 = img2_x1 + idImg2.width - 1; 
img2_y1 = parseInt(idImg2.style.top); 
img2_y2 = img2_y1 + idImg2.height - 1; 

if (((img2_x1 <= img1_x2 && img1_x2 <= img2_x2) || (img2_x1 <= img1_x1 && img1_x1 <= img2_x2) || (img1_x1 <= img2_x1 && img2_x1 <= img1_x2)) 
    && ((img2_y1 <= img1_y2 && img1_y2 <= img2_y2) || (img2_y1 <= img1_y1 && img1_y1 <= img2_y2) || (img1_y1 <= img2_y1 && img2_y1 <= img1_y2))) 
{ 
    alert('boom'); 
} 

Посмотрите на мой код, возможно, вам что-то полезно. Сначала я вычисляю позицию моей лягушки (img1) и использую for-loop по всем моим тестовым объектам (здесь не отображается). В этом цикле я вычисляю позицию для объекта (img2), а затем я делаю управление перекрытием.
Вы должны были добавить третье измерение к условиям, которые мне не нужны.

Примечание: Для Img2 я не использую вар в моей для петли я объявил его вне в функции.

я скопировал здесь только несколько разделов из моего кода и отрезать запутанные детали.

+0

Спасибо. Этот пример действительно помогает. Я понимаю, что вы сделали. Я пытаюсь использовать этот код. Теперь я выясню, как я могу использовать parseInt (cube.style.left); для моего объекта –