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