2017-01-31 13 views
0

У меня обнаружено столкновение. Вы можете поместить объекты в положение raycaster/mouse на полу. Поэтому вам нужно нажать кнопку «Добавить объект», затем вы получите объект (помощник), который следует за мышью, чтобы узнать, столкнулся ли новый объект с другим объектом. Когда вы нажимаете на нужную позицию, новый объект будет помещен в мир, если нет столкновения.Обнаружение столкновений Three.js с различными размерами

Обнаружение столкновений, которое я создал, прекрасно работает, когда объект, который уже размещен в мире, имеет тот же размер, что и вспомогательный/новый объект.

На следующем снимке экрана вы можете увидеть большой объект и небольшой (красный) помощник. Красный цвет означает, что есть столкновение. Когда я перемещаю мышь больше вправо, она становится зеленой.

Почему мое обнаружение столкновений работает только с 2 объектами с одинаковым размером и почему это не с разными?

enter image description here

Вот мой код в замковом событии, чтобы показать большой объект:

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; 
    } 

} 

Что не так с позицией, когда это большой и маленький объект. Может ли кто-нибудь помочь мне в правильном направлении? Большое спасибо

+1

Я уверен, что объекты расположены по центру, а не сверху передний левый угол. Столкновение х можно определить с помощью 'abs (o1.x - o2.x) <(o1.w + o2.w)/2' –

ответ

1

использовать это:

function collisonXZ(o1, o2) { 
    if (Math.abs(o1.position.x - o2.position.x) > (o1.geometry.parameters.width + o2.geometry.parameters.width)/2) 
    return false; 
    if (Math.abs(o1.position.z - o2.position.z) > (o1.geometry.parameters.depth + o2.geometry.parameters.depth)/2) 
    return false; 
    return true; 
} 

var validpositionObject = true; 
for (var i = 0; i < objects.length; i++) { 
    if (collisionXZ(helper, objects[i])) { 
    validpositionObject = false; 
    break; 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^