J'ai essayé de travailler avec les classes Projector et Ray afin de faire quelques démonstrations de détection de collision. J'ai commencé par essayer d'utiliser la souris pour sélectionner des objets ou les faire glisser. J'ai regardé les exemples qui utilisent les objets, mais aucun d'entre eux ne semble avoir de commentaires expliquant ce que font exactement certaines des méthodes de Projector et Ray. J'ai quelques questions auxquelles, je l'espère, quelqu'un pourra répondre facilement.
Que se passe-t-il exactement et quelle est la différence entre Projector.projectVector() et Projector.unprojectVector() ? Je remarque qu'il semble que dans tous les exemples utilisant à la fois des objets projecteur et rayon, la méthode unproject est appelée avant la création du rayon. Quand utiliseriez-vous projectVector ?
J'utilise le code suivant dans ce cas Démonstration pour faire tourner le cube lorsqu'on le fait glisser avec la souris. Quelqu'un peut-il m'expliquer en termes simples ce qui se passe exactement lorsque je déprojette avec la souris3D et la caméra, puis que je crée le rayon. La raie dépend-elle de l'appel à unprojectVector() ?
/** Event fired when the mouse button is pressed down */
function onDocumentMouseDown(event) {
event.preventDefault();
mouseDown = true;
mouse3D.x = mouse2D.x = mouseDown2D.x = (event.clientX / window.innerWidth) * 2 - 1;
mouse3D.y = mouse2D.y = mouseDown2D.y = -(event.clientY / window.innerHeight) * 2 + 1;
mouse3D.z = 0.5;
/** Project from camera through the mouse and create a ray */
projector.unprojectVector(mouse3D, camera);
var ray = new THREE.Ray(camera.position, mouse3D.subSelf(camera.position).normalize());
var intersects = ray.intersectObject(crateMesh); // store intersecting objects
if (intersects.length > 0) {
SELECTED = intersects[0].object;
var intersects = ray.intersectObject(plane);
}
}
/** This event handler is only fired after the mouse down event and
before the mouse up event and only when the mouse moves */
function onDocumentMouseMove(event) {
event.preventDefault();
mouse3D.x = mouse2D.x = (event.clientX / window.innerWidth) * 2 - 1;
mouse3D.y = mouse2D.y = -(event.clientY / window.innerHeight) * 2 + 1;
mouse3D.z = 0.5;
projector.unprojectVector(mouse3D, camera);
var ray = new THREE.Ray(camera.position, mouse3D.subSelf(camera.position).normalize());
if (SELECTED) {
var intersects = ray.intersectObject(plane);
dragVector.sub(mouse2D, mouseDown2D);
return;
}
var intersects = ray.intersectObject(crateMesh);
if (intersects.length > 0) {
if (INTERSECTED != intersects[0].object) {
INTERSECTED = intersects[0].object;
}
}
else {
INTERSECTED = null;
}
}
/** Removes event listeners when the mouse button is let go */
function onDocumentMouseUp(event) {
event.preventDefault();
/** Update mouse position */
mouse3D.x = mouse2D.x = (event.clientX / window.innerWidth) * 2 - 1;
mouse3D.y = mouse2D.y = -(event.clientY / window.innerHeight) * 2 + 1;
mouse3D.z = 0.5;
if (INTERSECTED) {
SELECTED = null;
}
mouseDown = false;
dragVector.set(0, 0);
}
/** Removes event listeners if the mouse runs off the renderer */
function onDocumentMouseOut(event) {
event.preventDefault();
if (INTERSECTED) {
plane.position.copy(INTERSECTED.position);
SELECTED = null;
}
mouseDown = false;
dragVector.set(0, 0);
}