2015-04-11 2 views
0

У меня возникла проблема с raycaster.intersectObjects() после перемещения вершин геометрии. Она не пересекается с новой геометрией, она только пересекается с частью, которая перекрывает оригинальная область. Объект выглядит правильно измененным в представлении. Я пытался найти ответ, но ни одно из решений, похоже, не работает. Я не уверен, что случилось.raycaster Пересечение неточно после перемещения вершин

//move parts/vertices 
     for(var p=0; p<latticeModel.selected.length; p++){ 
      var partNum = latticeModel.selected[p]; 
      if(latticeModel.part[partNum].children[1].visible==true){ 
       latticeModel.part[partNum].position.add(vector); 
       latticeCloud.tiles.part[partNum].position.add(vector); 
      }else{ 
       var localVector = vector.clone(); 
       localVector.add(latticeCloud.tiles.part[partNum].position); 
       latticeCloud.tiles.part[partNum].worldToLocal(localVector); 
       for(var v=0; v<4; v++){ 
        if(latticeCloud.tiles.colors[partNum][v].getHex() == 0xfe0000 || 
         latticeCloud.tiles.colors[partNum][v].getHex() == 0xff00ff){ 
         latticeCloud.tiles.part[partNum].geometry.vertices[v].add(localVector); 
         latticeCloud.tiles.part[partNum].geometry.verticesNeedUpdate = true; 
         latticeModel.part[partNum].children[0].geometry.vertices[v].add(localVector); 
         latticeModel.part[partNum].children[0].geometry.verticesNeedUpdate = true; 
         //added these below to try and debug, but still won't help 
         latticeModel.part[partNum].children[0].geometry.normalsNeedUpdate = true; 
         latticeModel.part[partNum].children[0].geometry.elementsNeedUpdate = true; 
         latticeModel.part[partNum].children[0].geometry.tangentsNeedUpdate = true; 
         latticeModel.part[partNum].children[0].geometry.computeFaceNormals = true; 
         latticeModel.part[partNum].children[0].geometry.computeVertexNormals = true; 
         latticeModel.part[partNum].children[0].geometry.computeBoundingBox = true; 
         latticeModel.part[partNum].children[0].geometry.computeBoundingSphere = true; 
        } 
       } 
      } 
     } 

Здесь пересекается часть:

mouse.x = 2 * (e.clientX/window.innerWidth) - 1; 
mouse.y = 1 - 2 * (e.clientY/window.innerHeight); 
var vector = new THREE.Vector3(mouse.x, mouse.y, 0.5).unproject(camera); 
var raycaster = new THREE.Raycaster(camera.position, vector.sub(camera.position).normalize()); 
scene.updateMatrixWorld(); 

//find the part mouse is overlapping and highlight it. 
mouse.intersects = raycaster.intersectObjects(latticeModel.part, true); 
if(mouse.intersects.length){ 
    var foundPart = latticeModel.part.indexOf(mouse.intersects[0].object.parent); 
    if(foundPart!=mouse.selectedPart){ 
     if(latticeModel.part.length>mouse.selectedPart && mouse.selectedPart!=-1){ 
      latticeModel.part[mouse.selectedPart].children[2].visible = false; 
     } 
     mouse.selectedPart = foundPart; 
     latticeModel.part[mouse.selectedPart].children[2].visible = true; 
    } 
}else{ 
    if(latticeModel.part.length>mouse.selectedPart && mouse.selectedPart!=-1){ 
     latticeModel.part[mouse.selectedPart].children[2].visible = false; 
     mouse.selectedPart = -1; 
    } 
} 
+0

Совет: Удалить все 'needsUpdate' флаги, и только добавить те, которые требуются. Поэкспериментируйте, пока вы не поправите это. – WestLangley

ответ

2

Если изменить вершины геометрии, ограничивающая сфера геометрии и ограничивающее окно могут стать недействительными.

Код raycasting будет пересчитывать их для вас, но вам необходимо установить следующее:

geometry.boundingSphere = null; 
geometry.boundingBox = null; 

Three.js R.71

+0

Удивительно, это решило мою проблему! – user3591153

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