如何在three.js中找到物体的交集?

4

我加载了20个具有随机位置的对象。我需要使这些对象的位置随机但不相交。如何查找这些对象之间的相交并检查是否相交?

 for (var i = 0; i < 20; i++) {
        // Create a material
        var textureLoader = new THREE.TextureLoader();
        var map = textureLoader.load('./models/test_2.png');
        var material = new THREE.MeshPhongMaterial({ map: map });

        var shipMtl = new MTLLoader();
        var loader = new this.THREE.OBJLoader();

        shipMtl.load('./models/test.mtl', function(materials) {
            materials.preload();

            loader.setMaterials(materials);
            loader.load('./models/test.obj', function(object) {
                object.traverse(function(node) {
                    if (node.isMesh) node.material = material;
                });

                object.position.x = Math.random() * 500 - 250;
                object.position.y = Math.random() * 500 - 250;
                object.position.z = Math.random() * 500 - 250;
                object.scale.x = Math.random() * 2 + 40;
                object.scale.y = Math.random() * 2 + 40;
                object.scale.z = Math.random() * 2 + 40;
                object.rotation.x = Math.random() * 2 * Math.PI;
                object.rotation.y = Math.random() * 2 * Math.PI;
                object.rotation.z = Math.random() * 2 * Math.PI;
                var obj = object; // put your object as global
                scene.add(obj);
            });
        });
    }

    raycaster = new THREE.Raycaster();

    mouse = new THREE.Vector2();
    renderer = new THREE.WebGLRenderer({ antialias: true });
    renderer.setPixelRatio(window.devicePixelRatio);
    renderer.setSize(window.innerWidth, window.innerHeight);
    this.refs.figure.appendChild(renderer.domElement);

3
如果您需要 20 个相同的对象,只需加载一次并使用 .clone() 在不同的位置附加它们即可。对于“交叉”部分,您可以计算边界框,如果边界框重叠,则尝试一个新的随机位置。 - Don McCurdy
1
或者计算一个包围球并执行相同的操作。 - prisoner849
2个回答

0

我没有仔细阅读问题,但这是检查两个对象是否相交的函数。

    function checkTwoShapeIntersect(object1,object2){
    /**
     * This function check if two object3d intersect or not
     * @param {THREE.Object3D} object1
     * @param {THREE.Object3D} object2
     * @returns {Boolean} 
    */ 

    // Check for intersection using bounding box intersection test
    let bBox1 = new THREE.Box3().setFromObject(object1);
    let bBox2 = new THREE.Box3().setFromObject(object2);

    const intersection = bBox1.intersectsBox(bBox2);
    // const intersection = mesh1.geometry.boundingBox.intersectsBox(mesh2.geometry.boundingBox);

    if (intersection) { // The shape geometries intersect.
        return true
    } else { // The shape geometries do not intersect.
        return false
    }
}

-2

阅读 THREE.js 文档:Raycaster 文档 99% 的情况下,threejs.org/docs 上都能找到你的答案


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接