Javascript ThreeJs加载的顶点比obj文件中的顶点多
我有以下代码:Javascript ThreeJs加载的顶点比obj文件中的顶点多,javascript,three.js,Javascript,Three.js,我有以下代码: function render_obj(objPath){ var loader = new THREE.OBJLoader(); loader.load( objPath, function ( object ) { child = object.children[0]; var geometry = new THREE.Geometry().fromBufferGeometry( child.geometry );
function render_obj(objPath){
var loader = new THREE.OBJLoader();
loader.load(
objPath,
function ( object ) {
child = object.children[0];
var geometry = new THREE.Geometry().fromBufferGeometry( child.geometry );
var material = new THREE.MeshBasicMaterial({wireframe: true});
model = new THREE.Mesh(geometry, material);
scene.add(model);
},
function ( xhr ) {
console.log( ( xhr.loaded / xhr.total * 100 ) + '% loaded' );
},
function ( error ) {
console.log( 'An error happened' );
}
);
};
现在man.obj
有214个顶点和332个面。当我这样检查面时:model.geometry.faces.length
我得到了332,这是正确的。
当我做model.geometry.vertices.length
时,我得到996,其中我应该得到214
为什么会这样?您正在使用的加载程序正在创建一种称为“三角形汤”的东西。这意味着您的N个三角形实际上由N*3个顶点定义。三角形本身并不存在,它只是从顶点来解释。前三个三角形,后三个三角形,依此类推。如果有一个连续的平滑网格,将复制许多顶点
您可能感兴趣的是“索引”几何体。在这种类型的几何体中,有一个实际的三角形缓冲区,用于保存顶点的索引。在连续平滑网格中,一个顶点可以由多个三角形共享 也许可以添加一些关于如何获取索引几何体的信息。是因为模型是如何从3d应用程序中导出为.obj的,所以OP最终以“三角形汤”结束的吗?我相信.obj加载器是罪魁祸首,我认为obj将始终以索引导出,但我不确定。如果是这样的话,那么除了修改加载器之外,还真的没有解决方法吗?最初的问题专门询问发生了什么,而不是如何修复它,但我很乐意编辑我的回答(尽管这个评论可能足够了?)。感谢我找到的答案“geometry.mergeVertices();”为我做这个把戏。从这里@pailhead,我只是好奇,认为这可能会增加答案的价值。唯一的问题是,如果你合并顶点,其中应该有一个“硬边”,硬边意味着需要在单个顶点复制法线,然后即使使用索引几何体,你也必须复制顶点。在立方体上,指向左侧的面将有一个顶点的法线指向左侧,指向上方的伴随面将有另一个顶点的法线指向上方。两个顶点将具有相同的值,但它们需要重复。obj应保存该信息,但在转换为三角形汤时,该信息将丢失。