1

我们正在尝试为子对象生成边界球体。遗憾的是,我们不知道如何为他们找到合适的位置。即使子对象明显没有放在中心,位置向量仍然是 0,0,0

我们正在使用 UTF8Loader 来导入对象,并且无法访问“标准”顶点数组。

此外,看起来边界半径是通过距父中心的距离计算的。

有任何想法吗?

现场演示:

使用此演示帐户登录: http ://threever.org/login 用户:演示密码: demoacc

并访问:threever.org/editor

问题图片: 图片

以及遍历对象时的代码片段:

object.traverse( function( node ) {
    if( node.geometry ) {
        if(node.geometry.boundingSphere){
            [...]
            var sphere = new THREE.Mesh( spheregeometry, material);
            sphere.position.copy(node.position);
            [...]
            _this.scene.add(sphere);
        }
    }
});

编辑: 我们尝试了描述的工作流程(感谢@WestLangley)来更新矩阵位置,但仍然没有运气。由于看起来边界球体也没有正确生成(通常到大),我们决定尝试另一种方法:我们生成边界几何体的唯一目的是为光线投射提供“选择网格”(这可能有点如果网格是THREE.BufferGeometry[不是?])。因此,我们查看了THREE.UTF8Loader文件并尝试重建几何图形的创建useBuffers方式false。然后我们设置允许访问属性数组的dynamic标志。当生成网格时,我们使用我们的函数来生成一个简化的THREE.BufferGeometrytruecreateSelectionDummyTHREE.Geometry使用属性数组的网格版本(无 uvs,合并顶点,法线向量(0,0,0))。你觉得这种技术怎么样?这对性能有好处useBuffers:false吗?

this.createSelectionDummy = function( indices, positions ) {

    var geom = new THREE.Geometry();

    for( var i = 0; i < indices.length; i += 3 ) {

        geom.vertices.push( new THREE.Vector3( positions[ i*3 ], positions[ i*3+1 ], positions[ i*3+2 ] ) );
        geom.vertices.push( new THREE.Vector3( positions[ i*3+3 ], positions[ i*3+4 ], positions[ i*3+5 ] ) );
        geom.vertices.push( new THREE.Vector3( positions[ i*3+6 ], positions[ i*3+7 ], positions[ i*3+8 ] ) );

        geom.faces.push( new THREE.Face3( indices[ i ], indices[ i + 1 ], indices[ i + 2 ], new THREE.Vector3(0,0,0) , null, 0 ) ); 

    }

    //reduce mesh size by 3
    geom.mergeVertices();
    geom.computeCentroids();
    geom.computeFaceNormals();

    return (new THREE.Mesh( geom, new THREE.MeshBasicMaterial({wireframe:true}) ));

};
4

1 回答 1

2

您可以像这样获得对象的世界位置:

var position = object.matrixWorld.getPosition();

确保首先更新对象的世界矩阵很重要。这通常发生在每个渲染调用中。但如果由于某种原因不是,您可以先调用以下命令:

object.updateMatrixWorld( true );

您可以通过以下方式计算边界球半径object.geometry.boundingSphere.radius

object.geometry.computeBoundingSphere();
于 2012-11-09T04:20:20.857 回答