2012-10-05 16 views
5

Tengo un rayo y un avión. El rayo se está cruzando con el avión y me gustaría saber dónde. ¿Cómo obtengo las coordenadas mundiales de esta intersección?Coordenadas de intersección entre Ray y Plano

(Mi caso particular me unproject pantalla coordenadas a la cámara y crear el rayo. El avión es el fundamento de la escena)

var vector = new THREE.Vector3(mousePosition.x, mousePosition.y, 1); 
projector.unprojectVector(vector, camera); 
var ray = new THREE.Ray(
    camera.position, 
    vector.subSelf(camera.position).normalize() 
); 
+0

En la reciente README durante tres .. "* Renombrado' vector */Matrix */Quaternion '' s ​​'addSelf()/subSelf()/crossSelf() ...' a 'add()/sub()/cross() ...'. " –

Respuesta

9

Este es el patrón usual. Puede que tenga que adaptarlo para adaptarse a su situación particular.

var raycaster = new THREE.Raycaster(); // create once and reuse 
var mouse = new THREE.Vector2(); // create once and reuse 

... 

mouse.x = (event.clientX/renderer.domElement.clientWidth) * 2 - 1; 
mouse.y = - (event.clientY/renderer.domElement.clientHeight) * 2 + 1; 

raycaster.setFromCamera(mouse, camera); 

var intersects = raycaster.intersectObjects(objects, recursiveFlag); 

if (intersects.length > 0) { 

    console.log(intersects[ 0 ].point;); 

} 

Aquí, objects es una matriz. Por ejemplo,

var objects = []; 

objects.push(plane_mesh); 

EDIT: Actualización para three.js r.84

+1

Oh, hay un atributo llamado 'punto'. Eso es fácil ... gracias :) –

+0

Gracias por actualizarlo para r58. Estoy tratando de obtener la ubicación en un plano (nueva THREE.PlaneGeometry (400, 400, 10, 10)) con el uso de la función worldToLocal, pero las coordenadas parecen estar jodiendo, la X parece tener el rango correcto (- 200 a 200), pero el Y parece ser un poco corto. ¿Es esto normalmente cómo se haría? –

+0

@drakej Tendrás que publicar una nueva pregunta. Asegúrate de incluir tu código. – WestLangley

0

A partir del R55, puede utilizar este acceso directo. Es similar, pero simplifica el raycasting hasta el punto en que ni siquiera tiene que preocuparse por unprojectVector().

Aquí es una versión modificada del ejemplo de WestLangley:

var vector = new THREE.Vector3(( 
     event.clientX/window.innerWidth) * 2 - 1, 
     - (event.clientY/window.innerHeight) * 2 + 1, 
     0.5 
    ); 

    var ray = projector.pickingRay(vector.clone(), camera); 

    var intersects = ray.intersectObjects(objects); 

    if (intersects.length > 0) { 

     console.log(intersects[ 0 ].point;); 

    } 

Esto supone la misma matriz de objetos

var objects = []; 

objects.push(plane_mesh); 
Cuestiones relacionadas