2016-09-21 25 views
1

我目前在玩ThreeJS decals。我已經能夠在我的球體上留下美麗的污點。更新DecalGeometry頂點,UVs,

這是我用來在我的球體上「應用」貼花的一段代碼。 (我有一些自定義類,但不用擔心這一點。

// 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(),貼花的網格不更新,我找不到這方面有任何解決方案。

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

按照DecalGeometry類,功能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 

後該幾何圖形至少已渲染一次。

相似,用於其他屬性,如UV。

欲瞭解更多信息,請參閱本答:verticesNeedUpdate in Three.js

three.js所R.80

+1

Mmmh,所以你的意思是我沒有選擇,但我想移動它每次都用新的來代替我的貼花? – Hellium

+0

@WestLangley在這種情況下,「你不能」意味着什麼?你的意思是Three.js不會在內部更新這些值嗎?如果是這樣,你知道爲什麼當用戶嘗試更新不可變屬性時,庫不會發出警告或錯誤嗎? – duhaime