Three.js技术问题:无法为对象分配材质(新手求助)
解决OBJLoader加载模型后MeshNormalMaterial不生效的问题
嘿,刚入门Three.js遇到这种问题很正常,我来帮你捋清楚原因和解决办法:
问题根源
你用OBJLoader加载的object其实是一个**THREE.Group(或者说Object3D容器)**,而不是单个Mesh对象。这个容器里面包含了一个或多个子Mesh(取决于你的OBJ文件结构),每个子Mesh自己有默认的材质。你直接给父容器object.material赋值是没用的,因为Group本身没有material属性,这个属性是属于Mesh的。
解决方案
你需要遍历这个Group里的所有子对象,找到其中的Mesh,逐个替换它们的材质。Three.js提供了traverse()方法,可以方便地遍历对象树里的所有后代。
修改后的代码如下:
var objloader = new THREE.OBJLoader(); var material = new THREE.MeshNormalMaterial(); objloader.load('man.obj', function(object) { object.position.y = -30; // 遍历所有子对象,替换Mesh的材质 object.traverse(function(child) { if (child.isMesh) { child.material = material; } }); scene.add(object); render(); });
补充说明
traverse()方法会递归遍历对象的所有后代,不管嵌套多少层都能找到Mesh。- 如果你确定你的OBJ模型只有一个Mesh子对象,也可以直接用
object.children[0].material = material,但这种写法不够健壮,万一模型结构变了就会出错,还是用traverse()更稳妥。 - MeshNormalMaterial会根据模型表面的法线方向生成颜色,替换后你应该能看到模型呈现出彩色的效果,这就说明材质生效啦~
内容的提问来源于stack exchange,提问作者user8108238
相关产品推荐
相关产品推荐

