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;

その結果、2つのテクスチャが除去された正方形の平面になります。

現在、実行時に各頂点の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 に答える