2012-12-05 15 views
5

Nieco skomplikowane, więc urodziła się ze mną:Three.js: Ray skrzyżowanie przy stosowaniu morphtargets nie działa

  • Ray przecinają działa idealnie, gdy obiekt nie ma morphTargets.

  • Gdy obiekt ma morphTargets tylko oryginalna pozycja może zostać przecięte, to znaczy, jeśli morph model z 0,0,0 do 50,50,50 promień nie przecinają się z obiektem w 50,50,50, zamiast tego, kiedy I mouse over 0,0,0 Dostaję skrzyżowanie (mimo że obiekt już tam nie jest !?).

Czy jest jakaś flaga, którą muszę włączyć, aby sprawić, że Three.js wie, że te wersety zostały przesunięte?

Edytuj, dodano kod.

To sprawia, że ​​moje oczka i dodaje go do tablicy obiektów (które ray przecinają zastosowań):

function createDeer(deerGeometry, materials) { 
    mesh = new THREE.MorphAnimMesh(deerGeometry, new THREE.MeshLambertMaterial({ color: 0xE8E8E8, ambient: 0xE8E8E8, morphTargets: true, vertexColors: THREE.FaceColors })); 
    mesh.scale.set(3, 3, 3); 
    mesh.position.set(0, -3, 0); 
    mesh.rotation.set(0, 0, 0); 
    mesh.castShadow = true; 
    mesh.receiveShadow = true; 
    mesh.geometry.dynamic = true; 
    scene.add(mesh); 
    objects.push(mesh); 
} 

Ray skrzyżowanie dzieje się na mousedown (jest mouseOver jak dobrze, to samo), jak powiedziałem, Kod działa poprawnie, to tylko przecinających z oryginalnym unmorphed oczek:

function onDocumentMouseDown(event) { 

    event.preventDefault(); 

    var vector = new THREE.Vector3(mouse.x, mouse.y, 0.5); 
    projector.unprojectVector(vector, camera); 

    var ray = new THREE.Ray(camera.position, vector.subSelf(camera.position).normalize()); 

    var intersects = ray.intersectObjects(objects); 

    if (intersects.length > 0) { 

     SELECTED = intersects[ 0 ].object; 

     for(var i=0; i<objects.length; i++) 
      { 
       if(SELECTED.position.x == objects[0].position.x) { 
        thisObject = i; 
        } 
       } 

      } 

     var intersects = ray.intersectObject(plane); 

     container.style.cursor = 'pointer'; 
    } 

} 

zdecydowałem problem musi być związane z faktem, że pozycja jelenia (jak w siatce transform) nigdy się nie zmienia, jednakże wierzchołki odsuwają się, a gdy promień przecina się, to com parowanie pozycji obiektów być może problem jest tutaj?

+0

dostarczenie kodu masz napisane proszę kod – Ocelot

+0

dodaje :) dzięki. – Ian

Odpowiedz

0

animacja MorphTarget zachodzi całkowicie na GPU (kod SHADERS), natomiast przecięcie się promieni zawsze obliczany na CPU. W rzeczywistości nie ma łatwego sposobu osiągnięcia tego, co opisujesz tutaj.

+1

Czyli podpalenie przed obwiedniami może być znacznie prostsze (ale nie doskonałe) rozwiązanie? – vincent

2

Zrobiłem pull request, który został scalony i naprawia to.

Należy pamiętać, że na to, aby działał, boundingSphere obiektu musi zawierać pełny zakres morfingu