2016-09-21 2 views
1

В настоящее время я играю с ThreeJS decals. Я смог нанести красивое пятно на свою сферу.Обновление vertalGeometry vertices, 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 ors, UVs, ....

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 

вершина после геометрия была сделана хотя бы один раз.

Similalry, для других атрибутов, таких как UV.

Для получения дополнительной информации см. Этот ответ: verticesNeedUpdate in Three.js.

Three.js R.80

+1

Мммм, так что вы имели в виду у меня нет выбора, кроме как заменить мою наклейку на новый каждый раз, когда я хочу, чтобы переместить его? – Hellium

+0

@WestLangley, что означает «вы не можете» в этом контексте? Вы имеете в виду, что Three.js просто не будет обновлять эти значения внутри? Если да, знаете ли вы, почему библиотека не бросает предупреждение или ошибку, когда пользователи пытаются обновить неизменяемое свойство? – duhaime

Смежные вопросы