我们正在尝试为子对象生成边界球体。遗憾的是,我们不知道如何为他们找到合适的位置。即使子对象明显没有放在中心,位置向量仍然是 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.BufferGeometry
true
createSelectionDummy
THREE.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}) ));
};