THREE.js OBJLoader - load to Geometry, manipulate, then save to BufferGeometry
我正在尝试确定为什么我无法平滑加载OBJLoader的阴影几何。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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); }); |
结果如下:
如果删除行computeFaceNormals(),则模型将呈现相同的效果。
如果我删除了computeVertexNormals(true),则该对象将在没有光照的情况下呈现(黑色)-因此我知道这正在做某事。
如果我在这段代码中更改了MeshPhongMaterial的color属性,则颜色也会更改,因此我也知道这是可行的。
我尝试使用顶点和法线帮助程序来确定问题所在,但是它们失败了,因为使用BufferGeometry时,面和顶点不会存储为数组。
我也尝试过修改man.obj文件,将's'的值从'off'更改为1。这没有做任何事情。
由于我将加载在Blender中生成的用于不同人物的多个.obj文件,每个文件目前约为2MB,因此我宁愿在浏览器上进行阴影处理,而不是将其"烘焙"到文件中,如果这样做会增加文件大小。
问题:我在这里错过了什么吗?要么,
有没有一种方法可以将.obj文件加载为标准Geometry,计算法线,应用阴影,然后另存为BufferGeometry?
ps。我可能还需要法线来进一步追踪光线。
如果要使用最新的加载程序(r73),我们还可以将
唯一需要注意的是,在计算顶点法线之前,我必须合并这些顶点。 我猜想从缓冲区转换时会把三角形弄乱,所以我们必须先将它们合并。
1 2 3 4 5 | var geometry = new THREE.Geometry().fromBufferGeometry( child.geometry ); geometry.computeFaceNormals(); geometry.mergeVertices(); geometry.computeVertexNormals(); child.geometry = new THREE.BufferGeometry().fromGeometry( geometry ); |
出于性能原因,ObjLoader的最新版本将.obj解析为BufferGeometry。 如果您回顾GitHub上的历史记录,则可以找到解析为Geometry的先前版本:
https://github.com/mrdoob/three.js/blob/a321ba05f02ae3a1586a4060a53f5ad63b90729b/examples/js/loaders/OBJLoader.js
使用此方法加载您的.obj,然后您可以操纵几何,直到您需要它为止,然后创建一个新的BufferGeometry并使用BufferGeometry.fromGeometry(geometry)将几何加载到其中,以获取性能。 我的工作很好。