Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript ThreeJs加载的顶点比obj文件中的顶点多_Javascript_Three.js - Fatal编程技术网

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应保存该信息,但在转换为三角形汤时,该信息将丢失。