模型材质共享问题

参考资料:threejs中文网

threejs qq交流群:814702116

模型材质共享问题

下面给大家谈谈,Blender、Three.js模型材质共享的问题。

Three.js共享一个材质

Three.js多个网格模型Mesh共享一个材质。

// 长方体mesh1和球体mesh2共享一个材质material
const geometry = new THREE.BoxGeometry(100, 100, 100);
const material = new THREE.MeshLambertMaterial({
    color: 0x00ffff, 
    transparent:true,
    opacity:0.5,
});
const mesh = new THREE.Mesh(geometry, material); 
scene.add(mesh); 

const geometry2 = new THREE.SphereGeometry(50);
const mesh2 = new THREE.Mesh(geometry2, material); 
mesh2.position.x = 100
scene.add(mesh2); 

修改网格模型mesh2的颜色,mesh1颜色跟着更改,原因很简单,本质上都是修改的同一个材质对象的color属性。

mesh2.material.color.set(0xff0000)

克隆材质.clone()

.clone()克隆材质,材质对象执行克隆方法.clone()会返回一个新的材质对象,克隆的新材质和原来材质外观一样,但是互不影响。

const material2 = material.clone();
const mesh2 = new THREE.Mesh(geometry2, material2); 
// 这时候修改mesh2颜色,material对应颜色不受影响
mesh2.material.color.set(0xff0000)

加载Blender模型修改材质颜色

Blender创建一个模型对象,设置颜色,然后通过快捷键Shift + D复制模型对象时候,导出测试。

先通过模型name获取模型节点,然后修改颜色,这时候你发现,所有模型mesh的颜色都更改了,其实原因很简单,Blender创建模型时候共享了材质。

const loader = new GLTFLoader()
loader.load('./材质共享.glb',function(gltf){
    const mesh = gltf.scene.getObjectByName('立方体');
    mesh.material.color.set(0x00ffff);
    scene.add(gltf.scene); 
})

递归遍历,克隆材质

递归遍历所有mesh,给所有mesh创建新的对象。

gltf.scene.traverse(function(obj){
    if(obj.isMesh){
        // 材质对象执行克隆方法clone()会返回一个新的材质对象
        obj.material = obj.material.clone();
    }
})
// 这种情况下,你修改任何一栋楼材质颜色,其他楼材质颜色不受影响
const mesh = gltf.scene.getObjectByName('立方体')
mesh.material.color.set(0x00ffff)

Blender取消材质共享

Blender通过快捷键Shift + D复制模型对象时候,材质是默认共享的。

如果你想取消材质共享,可以新建一个材质覆盖原来的。

在这里插入图片描述

对于其它的三维建模软件,思路一样的,只是说具体操作细节不同罢了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Threejs可视化

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值