2012-09-19 3 views
1

Il y a une fonction dans mon système prototype qui détecte les intersections lorsque vous cliquez sur un fichier Collada. La fonction Intersection est ci-dessous:Three.JS- Détection de l'intersection dans Collada (Ray Casting)

function Intersectfun (event) { 
    mouse.x = (event.clientX/window.innerWidth) * 2 - 1; 
    mouse.y = - (event.clientY/window.innerHeight) * 2 + 1; 
    var vector = new THREE.Vector3(mouse.x, mouse.y, 1); 
    var toIntersect = []; 
    THREE.SceneUtils.traverseHierarchy(scene, function (child) { 
    if (child instanceof THREE.Mesh) { 
    toIntersect.push(child); 
    } 
    }); 
    // Unproject the vector 
    projector.unprojectVector(vector, camera); 
    var ray = new THREE.Ray(camera.position, vector.subSelf(camera.position).normalize()); 
    var intersects = ray.intersectObjects(toIntersect); 
    if(intersects.length){ 
    target = intersects[0].object; 
    } 
} 

Mais quand je l'utilise:

controls = new THREE.TrackballControls(camera, renderer.domElement); 

La coupe matrice est vide et ne peut pas détecter les intersections !!!

Mais quand je l'utilise:

controls = new THREE.TrackballControls(camera); 

je peux obtenir la matrice de intersecte et il fonctionne très bien, mais un autre problème se révèle (regarde ici: Three.JS -- conflict Camera controls with a textbox in a scene)

Y at-il un code dans la fonction ci-dessus? Pour votre information, j'ai utilisé un appareil photo simple:

camera = new THREE.PerspectiveCamera(40, window.innerWidth/window.innerHeight, 1, 10000); 

Merci.

Répondre

1

Ceci n'est pas un problème Collada.

Pour ce faire, à la place:

// container 
container = document.createElement('div'); 
document.body.appendChild(container); 

// renderer 
renderer = new THREE.WebGLRenderer(); 
renderer.setSize(window.innerWidth, window.innerHeight); 
container.appendChild(renderer.domElement); 

//controls 
controls = new THREE.TrackballControls(camera, container); 

En d'autres termes, utiliser container plutôt que renderer.domElement comme le second argument de la boule de commande contrôle.

http://jsfiddle.net/QXUwa/