0

我正在尝试制作地形编辑器。所以我有一架上面有多种材料的飞机,我像这样初始化它:

var materials = [];
var grasstexture = THREE.ImageUtils.loadTexture('Img/grass.png', {}, function() { });
var rocktexture = THREE.ImageUtils.loadTexture('Img/rock.png', {}, function() { });
materials.push(new THREE.MeshPhongMaterial({color: 0xffffff, map: grasstexture}));
materials.push(new THREE.MeshPhongMaterial({color: 0xffffff, map: rocktexture}));
// Plane

this.geometry.materials = materials;
for(var i = 0; i <  this.geometry.faces.length; i++)
{
    this.geometry.faces[i].materialIndex = 0;
}

this.geometry.dynamic = true;
this.mesh = new THREE.Mesh( this.geometry, new THREE.MeshFaceMaterial(  ) );
this.mesh.receiveShadow = true;

结果是一个带有两个纹理的方形平面。

现在,我似乎无法在运行时更新每个顶点的 materialIndex。我努力了:

face.materialIndex = 1;

for(var i = 0; i < geo.materials.length; i++){
    geo.materials[i].needsUpdate = true;
}

for(var i = 0; i <  this.geometry.faces.length; i++)
{
    geo.faces[i].materialIndex = 0;
}

for(var i = 0; i < geo.materials.length; i++){
    geo.materials[i].needsUpdate = true;
}
this.mesh.needsUpdate = true;
this.mesh.material.needsUpdate = true;

geo.verticesNeedUpdate = true;
geo.normalsNeedUpdate = true;
geo.colorsNeedUpdate = true;

geo.computeFaceNormals();
geo.computeVertexNormals();

geo.computeCentroids();
geo.computeTangents() ;

我能够找到 Three.js 中的所有其他“materialIndex”和“needsUpdate”变量,但仍然没有任何反应。如何强制更新材料指数?

4

1 回答 1

1

你不能。materialIndex仅在第一次渲染中用于将几何体划分为块,每个块具有相同的材质。此外,您不能重新分区块。

但是,您可以做的是更改materials阵列中的材料。

materials[ 0 ] = new THREE.MeshBasicMaterial();

这样做之后,您也不需要设置任何needsUpdate标志true

您可以做的另一件事是从一开始就为每个面赋予它自己的材质,然后,例如,只需更改材质的纹理。

mesh.geometry.materials[ 0 ].map = texture;
texture.needsUpdate = true;
于 2012-09-16T22:32:37.007 回答