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 平滑着色对Three.js场景中加载的OBJ不起作用_Javascript_Three.js - Fatal编程技术网

Javascript 平滑着色对Three.js场景中加载的OBJ不起作用

Javascript 平滑着色对Three.js场景中加载的OBJ不起作用,javascript,three.js,Javascript,Three.js,也就是说,OBJ在我的3D建模软件中看起来平滑,而在Three.js场景中看起来古怪(三角形)。我给它指定了材质。根据文档,该材质的默认着色为THREE.SmoothShading。即使我手动设置并通过调试控制台检查“着色”属性是否正确设置,场景中的模型仍然不平滑。顶点法线不是由OBJ(MTL)加载程序计算的。您可以在以后计算它们(未测试): 顶点法线不是由OBJ(MTL)加载程序计算的。您可以在以后计算它们(未测试): 您从哪个软件导出?什么格式?你导出法线和平滑组了吗?@2pha我从互联网上

也就是说,OBJ在我的3D建模软件中看起来平滑,而在Three.js场景中看起来古怪(三角形)。我给它指定了材质。根据文档,该材质的默认着色为THREE.SmoothShading。即使我手动设置并通过调试控制台检查“着色”属性是否正确设置,场景中的模型仍然不平滑。

顶点法线不是由OBJ(MTL)加载程序计算的。您可以在以后计算它们(未测试):


顶点法线不是由OBJ(MTL)加载程序计算的。您可以在以后计算它们(未测试):


您从哪个软件导出?什么格式?你导出法线和平滑组了吗?@2pha我从互联网上得到了模型,并用Cinema 4D进行了检查。模型中已存在标准OBJ格式的法线。至于平滑组,我不知道你说它是什么意思,因为它是一个单元,但当我导入它时,它在Cinema 4D中看起来非常平滑。你从哪个软件导出?什么格式?你导出法线和平滑组了吗?@2pha我从互联网上得到了模型,并用Cinema 4D进行了检查。模型中已存在标准OBJ格式的法线。至于平滑组,我不知道你说它是什么意思,因为它是一个单位,但在我导入它时,它在Cinema 4D中看起来非常平滑。在我的例子中,它似乎是我的模型的问题-它没有顶点法线,并且有四个面,这些面由加载程序三角化。另一方面,Blender在这方面没有问题,所以我觉得OBJ加载程序应该更宽容,或者至少它应该有一个计算顶点法线的选项,因为模型通常不是完美的。谢谢你的解决方案。有空的时候我会试一试,然后告诉你结果。:)很抱歉回复得太晚,但我在OBJLoader.js(objmtloader.js?)中找不到任何名为meshN的函数。因此您没有.MTL文件,使用OBJLoader而不是objmtloader。您可以在那里搜索computeFaceNormals(),并在其下方添加修复(computeVertexNormals)。另一个(也许更好)的解决方案可能是事后计算法线。我相应地更新了答案。OBJLoader.js中没有computeFaceNormals()调用。实际上,我已经在我的脚本中调用了computeVertexNormals(),没有它就不会被点亮。在我的例子中,这似乎是我的模型的一个问题-它没有顶点法线,并且有由加载程序三角化的四边形面。另一方面,Blender在这方面没有问题,所以我觉得OBJ加载程序应该更宽容,或者至少它应该有一个计算顶点法线的选项,因为模型通常不是完美的。谢谢你的解决方案。有空的时候我会试一试,然后告诉你结果。:)很抱歉回复得太晚,但我在OBJLoader.js(objmtloader.js?)中找不到任何名为meshN的函数。因此您没有.MTL文件,使用OBJLoader而不是objmtloader。您可以在那里搜索computeFaceNormals(),并在其下方添加修复(computeVertexNormals)。另一个(也许更好)的解决方案可能是事后计算法线。我相应地更新了答案。OBJLoader.js中没有computeFaceNormals()调用。实际上,我已经在脚本中调用了computeVertexNormals(),没有它就不会被点亮。
my3dObject.traverse( function( node ) {
    if ( node instanceof THREE.Mesh ) {
        node.geometry.computeVertexNormals(); 
    }
} );