2017-01-31 34 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; 
    } 
}