2014-10-28 94 views
4

我想确定为什么我无法平滑加载OBJLoader的阴影几何。THREE.js OBJLoader - 加载到几何,操作,然后保存到BufferGeometry

var loader = new THREE.OBJLoader(manager); 
loader.load('/manmodel/js/man.obj', function (object, materials) { 
    console.log(object); 
    console.log(materials); 
    man = object; 
    man.traverse(function (child) { 
     if (child instanceof THREE.Mesh) { 
      child.geometry.computeFaceNormals(); 
      child.geometry.computeVertexNormals(true); 
      child.material = new THREE.MeshPhongMaterial({ 
       color: 'white', 
       shading: THREE.SmoothShading // <----------- THIS IS THE PROBLEM 
      }); 
     } 
    }); 
    man.position.y = -10; 
    scene.add(man); 
}); 

这是结果:

apparently Flat Shading

如果删除了线computeFaceNormals()的模型呈现相同的。 如果我移除了computeVertexNormals(true),那么该对象不会渲染(黑色) - 所以我知道这是在做一些事情。

如果我在此代码中更改MeshPhongMaterial的颜色属性,颜色会发生变化,所以我也知道这是行得通的。

我试图使用顶点和普通帮助程序来确定问题是什么,但它们失败,因为使用BufferGeometry时,面和顶点不会以数组形式存储。

我也尝试修改man.obj文件以将's'值从'off'更改为1.这没有做任何事。

由于我将为Blender中生成的不同人物形象加载几个.obj文件,每个文件当前都在2MB左右,所以我更喜欢在浏览器上进行阴影处理,而不是将文件“烘烤”到文件中增加文件大小。

问题:我在这里错过了什么? OR, 有没有办法将.obj文件加载为标准Geometry,计算法线,应用阴影,然后保存为BufferGeometry?

ps。我可能还需要光线追踪的法线。

回答

6

由于性能原因,最新版本的ObjLoader会将.obj解析为BufferGeometry。如果通过在GitHub上回顾历史,你可以找到以前的版本,它解析到几何:

https://github.com/mrdoob/three.js/blob/a321ba05f02ae3a1586a4060a53f5ad63b90729b/examples/js/loaders/OBJLoader.js

使用此装入.OBJ,然后你可以操纵的几何图形,直到你拥有了它,你需要它,然后创建一个新的BufferGeometry并使用BufferGeometry.fromGeometry(geometry)将Geometry加载到它中以获得性能。我有这个很好的工作。

4

如果我们想使用最新的加载程序(r73),我们也可以将BufferGeometry转换为Geometry,然后返回!

唯一需要注意的是我必须在计算顶点法线之前合并顶点。我猜想,从缓冲区转换为三角形,所以我们必须在任何事情之前合并它们。

var geometry = new THREE.Geometry().fromBufferGeometry(child.geometry); 
geometry.computeFaceNormals(); 
geometry.mergeVertices(); 
geometry.computeVertexNormals(); 
child.geometry = new THREE.BufferGeometry().fromGeometry(geometry); 
相关问题