我做了碰撞检测。您可以将对象放置在地板上的raycaster / mouse位置。因此,您需要单击“添加对象”按钮,然后获得一个跟随鼠标的对象(帮助器),以查看新对象是否与另一个对象发生冲突。当您单击所需的位置时,如果没有碰撞,新对象将被放置到世界中。
当已经放置在世界中的对象与辅助对象/新对象具有相同的大小时,我已经完成了碰撞检测。
在下一个屏幕截图中,您可以看到一个大对象和一个小(红色)帮助器。红色表示存在碰撞。当我将鼠标向右移动更多时,它会变为绿色。
为什么我的碰撞检测仅适用于具有相同大小的2个对象,为什么它不具有不同的对象?
以下是我在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;
}
}
当它是一个大而小的物体时,它的位置出了什么问题。任何人都能帮助我朝正确的方向发展吗?非常感谢
答案 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;
}
}