Three.js不同尺寸的碰撞检测

时间:2017-01-31 19:48:16

标签: javascript three.js collision-detection

我做了碰撞检测。您可以将对象放置在地板上的raycaster / mouse位置。因此,您需要单击“添加对象”按钮,然后获得一个跟随鼠标的对象(帮助器),以查看新对象是否与另一个对象发生冲突。当您单击所需的位置时,如果没有碰撞,新对象将被放置到世界中。

当已经放置在世界中的对象与辅助对象/新对象具有相同的大小时,我已经完成了碰撞检测。

在下一个屏幕截图中,您可以看到一个大对象和一个小(红色)帮助器。红色表示存在碰撞。当我将鼠标向右移动更多时,它会变为绿色。

为什么我的碰撞检测仅适用于具有相同大小的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 个答案:

答案 0 :(得分: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;
  }
}