2012-09-16 4 views
0

지형 편집기를 만들려고합니다.Three.js - 평면의 텍스처 업데이트

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를에서 'needsUpdate'변수 내가 찾을 수 만, 여전히 아무 일도 발생하지 않습니다 다른 모든 'MaterialIndex에'합니다. 물질적 지표를 어떻게 업데이트합니까?

답변

1

수 없습니다. materialIndex은 지오메트리를 청크로 분할하는 첫 번째 렌더링에서만 사용되며 각 청크는 동일한 재질을 사용합니다. 또한 청크를 다시 파티션 할 수 없습니다.

그러나 할 수있는 일은 materials 배열의 자료를 변경하는 것입니다.

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

당신은 하나, 이렇게 후 true 모든 needsUpdate 플래그를 설정할 필요가 없습니다.

당신이 할 수있는 다른 방법은 처음부터 자신의 소재를 각면에 부여한 다음, 예를 들어 재질의 질감을 변경하는 것입니다.

mesh.geometry.materials[ 0 ].map = texture; 
texture.needsUpdate = true; 
+0

문제는 각각 고유의 질감에 직면주고 나서, 당신은 그것이 500x500 정점 지형을 렌더링하는 것이 얼마나 느린 상상할 수 있다는 것입니다 : S 각 정점에 적용되는 텍스처를 변경할 수있는 더 나은 방법이 있나요? 이상적으로는 텍스처 간의 부드러운 블렌딩도있을 것입니다. –

관련 문제