2016-09-21 17 views
1

私は現在ThreeJS decalsで遊んでいます。私は私の球面に美しい汚れをつけることができました。DecalGeometry頂点、UVの更新

私の球にデカールを「適用」するために使用するコードです。 (私はいくつかのカスタムクラスを持っているが、これについては心配しないでください。

// Create sphere 
var mainMesh = new THREE.Mesh(
    new THREE.SphereGeometry(7, 16, 16), 
    new THREE.MeshBasicMaterial({ color: 0x00a1fd }) 
); 

// Declare decal material 
var decalMaterial = new THREE.MeshPhongMaterial({ 
    color    : 0xff0000,  
    specular   : 0x444444, 
    map     : TextureLoader.instance.getTexture('http://threejs.org/examples/textures/decal/decal-diffuse.png'), 
    normalMap   : TextureLoader.instance.getTexture('http://threejs.org/examples/textures/decal/decal-normal.jpg'), 
    normalScale   : new THREE.Vector2(1, 1), 
    shininess   : 30, 
    transparent   : true, 
    depthTest   : true, 
    depthWrite   : false, 
    polygonOffset  : true, 
    polygonOffsetFactor : -4, 
    wireframe   : false 
}); 

// Create decal itself 
var decal = new THREE.Mesh(
    new THREE.DecalGeometry(
     mainMesh, 
     new THREE.Vector3(0, 2.5, 3), 
     new THREE.Vector3(0, 0, 0), 
     new THREE.Vector3(8, 8, 8), 
     new THREE.Vector3(1, 1, 1) 
    ), 
    decalMaterial.clone() 
); 

// Add mesh + decal + helpers 
scene.add(
    mainMesh, 
    new THREE.HemisphereLight(0xffffff, 0, 1), 
    decal, 
    new THREE.WireframeHelper(decal, 0xffff00) 
); 

decal.add(new THREE.BoxHelper(decal, 0xffff00)); 

を今、私は自分の球でこの汚れを移動し、したがって、私のデカールのジオメトリを更新したいとwoud。残念ながら

私はdecal.geometry.computeDecal()を呼び出すときに、デカールのメッシュが更新されません。私はこれについての解決策を見つけることができません。DecalGeometryクラスによると、機能computeDecalが既に更新に必要な真の様々なメンバーに設定

function moveDecal() 
    { 
     decal.translateX(1); 
     decal.geometry.computeDecal(); 
    }; 

頂点、col UVなど)。

this.computeDecal = function() { 
     // [...] 
     this.verticesNeedUpdate  = true; 
     this.elementsNeedUpdate  = true; 
     this.morphTargetsNeedUpdate = true; 
     this.uvsNeedUpdate   = true; 
     this.normalsNeedUpdate  = true; 
     this.colorsNeedUpdate  = true; 
    }; 

ありがとうございました! :D

PS:ThreeJS r80

答えて

1

あなたは、ジオメトリの頂点を更新しようとしています。

あなたが頂点componnentの値を変更することができます

geometry.vertices[ 0 ].x += 1; 

が、あなたが追加することはできません新しいveritices

geometry.vertices.push(new THREE.Vector3(x, y, z)); // not allowed 

または割り当てる新しい頂点配列

geometry.vertices = new_array; // not allowed 

後ジオメトリは少なくとも1回レンダリングされています。

Similalry(UVなどの他の属性の場合)。

詳細については、この回答を参照してください:verticesNeedUpdate in Three.js

three.js R.80

+1

Mmmhので、あなたは、私は新しいものと私はそれを移動するたびに、私のデカールを交換するしかないわけ? – Hellium

+0

@WestLangleyこの文脈では「あなたができない」とは何ですか?あなたはThree.jsがこれらの値を内部的に更新しないことを意味しますか?その場合、ユーザーが不変プロパティを更新しようとすると、ライブラリが警告またはエラーをスローしない理由を知っていますか? – duhaime

関連する問題