0

我正在从 obj 文件加载网格,然后尝试对其进行规范化。但是,我得到了奇怪的结果。这是加载和居中网格的代码:

var manager = new THREE.LoadingManager();
var loader = new THREE.OBJLoader(manager);
loader.load('http://jamesdedge.com/threejs/bunny.obj', function(object) {
  object.traverse(function(child) {
    if(child instanceof THREE.Mesh)
    {
      var geometry = child.geometry;
      var verts = geometry.vertices;
      var ctr = new THREE.Vector3(0.0, 0.0, 0.0);


      for(i = 0; i < verts.length; ++i)
        ctr.add(verts[i]);

      ctr.divideScalar(verts.length);

      for(i = 0; i < verts.length; ++i)
        verts[i].sub(ctr);
    }
  });

  scene.add(object);
});

这段代码应该只是将网格中心放在顶点位置的平均值上,但它似乎导致了一种奇怪的效果。你可以在我的网站上看到它:http: //jamesdedge.com/threejs/tjs_demo.html

我看不出是什么原因造成的,ctr 变量给了我一个有效的向量,从所有顶点中减去一个向量只会重新定位它。

4

2 回答 2

2

此模型中的许多顶点是重复的(即,同一javascript 对象多次包含在对象中),因此 ctr 会多次从这些顶点中减损。

解决此问题的一种方法是在遍历函数开始时合并顶点,即

var geometry = child.geometry;
geometry.mergeVertices();

这也将使您的代码运行得更快一些,因为它必须处理更少的顶点。

于 2013-09-21T13:22:53.610 回答
0

您可以使用 GeometryUtils.center() 方便地将整个网格置于场景中间 (0,0,0) 的中心。无论如何,只要看看那个函数的源代码 https://github.com/mrdoob/three.js/blob/master/src/extras/GeometryUtils.js 这应该给你一个关于如何克服你的问题的好主意。

于 2013-09-21T15:58:51.423 回答