2017-01-31 54 views
0

我已經做了碰撞檢測。您可以將對象放置在地板上的raycaster/mouse位置。因此,你需要點擊一個按鈕'添加對象',然後你得到一個跟隨鼠標的對象(助手),看看新對象是否與另一個對象發生衝突。當你點擊你想要的位置時,如果沒有碰撞,新的對象將被放置到世界上。three.js所碰撞檢測不同大小

碰撞檢測我已經完全做作品時已經是擺在世界中的對象的大小與輔助/新對象相同。

在接下來的截圖可以看到一個大的對象和小(紅色)幫手。紅色表示存在碰撞。當我將鼠標向右移動時,它變爲綠色。

爲什麼我的碰撞檢測的工作只有2個對象具有相同的尺寸和爲什麼它不不與不同的人?

enter image description here

這裏是我的Click事件中的代碼,以顯示大對象:

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

我敢肯定,對象定位在由中心,而不是最高的左前角。 x碰撞可以通過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; 
    } 
}