如何检测两个bufferGeometryBox的两个面的交点?

时间:2019-05-27 11:29:21

标签: javascript three.js

我正在开发3d配置器。多维数据集出现在场景中。如果单击此立方体的侧面,将显示一个矩形。问题是,如果单击多维数据集的同一侧,则会在现有矩形的上方添加另一个。我想阻止点击的一面。我的立方体和矩形是缓冲区几何。我可以获得光线投射的面部(a,b,c)和faceIndex。但是如何获得两个不同对象的两个不同面的交集?对不起,我的英语

这是我的项目https://alovert.ru

enter image description here enter image description here enter image description here

我的代码

if (intersect) {
            var index = Math.floor( intersect.faceIndex / 6 );
                if ( intersect.object.name == 'cube' ) {

                    switch ( index ) {
                        case 0: load( intersect.object.position.x + 6.58, intersect.object.position.y, intersect.object.position.z, 'beam', 0, 0, 0 ); break;
                        case 1: load( intersect.object.position.x - 6.58, intersect.object.position.y, intersect.object.position.z, 'beam', 0, 0, 0 ); break;
                        case 2: load( intersect.object.position.x, intersect.object.position.y + 6.58, intersect.object.position.z, 'beam', 0, 0, 90 ); break;
                        case 3: load( intersect.object.position.x, intersect.object.position.y - 6.58, intersect.object.position.z, 'beam', 0, 0, 90 ); break;
                        case 4: load( intersect.object.position.x, intersect.object.position.y, intersect.object.position.z + 6.58, 'beam', 0, 90, 0 ); break;
                        case 5: load( intersect.object.position.x, intersect.object.position.y, intersect.object.position.z - 6.58, 'beam', 0, 90, 0 ); break;
                    }

                }`





3 个答案:

答案 0 :(得分:0)

我想重复创建的新对象将具有与已经存在的对象相同的全局位置(检查this)值。因此,您可以简单地遍历现有对象并比较它们的位置,如果它们匹配或位置值有微小差异,则进行阻塞。

为使操作更快,您可以在创建对象后将其全局位置值保留在列表中,然后遍历列表。

答案 1 :(得分:0)

请参阅以下描述此想法的元代码:

let newObject = loadObject(...);
parentObj.add(newObject);
newObject.position.set(new_x, new_y, new_z);
let globalPosition = new THREE.Vector3();
newObject.getWorldPosition(globalPosition);
for (let i = 0; i < existingPositions.length; i++){
    if(     existingPositions[i].x === globalPosition.x
        &&  existingPositions[i].y === globalPosition.y
        &&  existingPositions[i].z === globalPosition.z) {
            parentObj.remove(newObject);
            return;
    }
}
existingPositions.push(globalPosition);

答案 2 :(得分:0)

也许对有相同问题的人有用。 主要思想是使用userData创建具有6个参数“ false”的矩形和立方体。我从每张脸发出光线,如果它与其他对象的脸相交,则该脸变为“真实”。 Check it out