【问题标题】:three.js switch between Lambert and Phong三.js 在 Lambert 和 Phong 之间切换
【发布时间】:2017-09-27 10:18:56
【问题描述】:

有没有办法只通过更改 object.material 的属性 .type 而不用新材料重新加载整个对象来将材质类型从 Lambert 更改为 Phong(和反向)?

【问题讨论】:

  • OK 明白了:制作一个新材料,其中 :map = 以前的材料 => var newmat= new THREE.MeshLambertMaterial( { map: phongmesh.material.materials[i].map} );并将此材料放入网格中。
  • 只是提醒一些属性在从 Phong 到 Lambert 时会丢失......(例如bumpMap)。

标签: three.js


【解决方案1】:

您不必丢失属性。如果您使用的是THREE.BufferGeometry,则可以改用群组。

群组

var boxGeo = new THREE.BoxBufferGeometry(10, 10, 10);

// set up your groups
boxGeo.clearGroups();
boxGeo.addGroup(0, boxGeo.index.count, 0);

材料

在 THREE.js r85 之前

您将使用THREE.MultiMaterial

// add both of your materials to a multi-material
var mm = new THREE.MultiMaterial([
    new THREE.MeshLambertMaterial({color: "red"}),
    new THREE.MeshPhongMaterial({color: "red"}),
]);

var mesh = new THREE.Mesh(boxGeo, mm);

适用于 THREE.js r85 及更高版本

您可以简单地将一组材料传递给THREE.Mesh

// add both of your materials to a multi-material
var mm = [
    new THREE.MeshLambertMaterial({color: "red"}),
    new THREE.MeshPhongMaterial({color: "red"}),
];

var mesh = new THREE.Mesh(boxGeo, mm);

交换材料

然后当你想交换材料时:

if(mesh.geometry.groups[0].materialIndex === 0){
    mesh.geometry.groups[0].materialIndex = 1;
}
else{
    mesh.geometry.groups[0].materialIndex = 0
}

【讨论】:

  • 好的!比你更清楚。这有帮助。
猜你喜欢
  • 1970-01-01
  • 2013-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-09
  • 2011-12-28
相关资源
最近更新 更多