为子对象生成边界球体

时间:2012-11-09 03:55:43

标签: three.js

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

我们使用UTF8Loader导入对象,但无法访问“标准”顶点数组。

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

有什么想法吗?

现场演示:

使用此模拟账户登录: http://threever.org/login 用户演示 passw: demoacc

然后去: threever.org/editor

问题的图片: picture

遍历对象时的代码段:

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文件,并尝试重建useBuffersfalse时创建几何图形的方式。然后,我们将dynamic的{​​{1}}标记设置为THREE.BufferGeometry,以便访问属性Arrays。生成网格时,我们使用true函数使用属性Arrays生成网格的简化createSelectionDummy版本(无uvs,合并顶点,法线向量(0,0,0))。你怎么看待这种技术?这是否与THREE.Geometry相比有性能提升?

useBuffers:false

1 个答案:

答案 0 :(得分:2)

你可以像这样得到一个物体的世界位置:

var position = object.matrixWorld.getPosition();

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

object.updateMatrixWorld( true );

您可以这样计算边界球半径object.geometry.boundingSphere.radius

object.geometry.computeBoundingSphere();