2017-07-25 3 views
1

J'essaie de déterminer l'emplacement (coordonnées x, y, z) d'un objet (un BoxGeometry) dans le monde par rapport à l'écran (tronc) et pas le monde. La méthode frustum.intersectsObject (...) renvoie simplement un booléen, je veux déterminer quel quadrant ([-x, y], [x, y], [x, -y], [-x, -y]) une boîte est relatif à la caméra (les lignes rouges de la capture d'écran ci-dessous suivent la caméra et non la scène). À l'heure actuelle, tout fonctionne tant que la caméra n'est pas tournée (room.children[i].position.x) car alors la caméra et le monde ont les mêmes coordonnées mais au moment où je fais tourner la caméra, cela ne fonctionne pas.Déterminer le x, y visible d'un objet dans la scène

Je pense que les choses apparaissent dans if (frustum.intersectsObject(room.children[i])) { qui ne devrait pas l'être. (Voir image ci-dessous)

Je suis nouveau sur three.js, donc il y a probablement un moyen facile de le faire que je ne suis pas arrivé à travers. Si, pour une raison quelconque, il n'y en a pas, quelle serait la manière la plus simple de mettre en œuvre une telle chose? Merci!!

function onDocumentKeyDown(event) { 
     event.preventDefault(); 
     var frustum = new THREE.Frustum(); 
     frustum.setFromMatrix(new THREE.Matrix4().multiply(camera.projectionMatrix)); 
     for (var i = 0; i < room.children.length; i++) { 
      if (frustum.intersectsObject(room.children[i])) { 
       var XYZ=new THREE.Vector4(); 
       XYZ.copy(room.children[i].position).applyMatrix4(camera.matrixWorldInverse); 
       console.log(i, 'left', frustum.intersectsObject(room.children[i]), XYZ.x,XYZ.y,XYZ.z,XYZ.w, room.children[i].material.emissive.getHex()); 
        if (XYZ.x < 0 && XYZ.y > 0 && (event.keyCode === 103 || event.keyCode === 13)) { 
         if (room.children[i].material.emissive.getHex() !== 255) { 
          $('#score').text(score++); 
          room.children[i].material.emissive.setHex(0x00ff00); 
          console.log(frustum); 
          console.log(i, 'WHAT ARE THE BOUNDING BOX COORDINATES OF THIS BOX????'); 
         } 
       } 
      } 
     } 
    } 

Determining the location of an object in the world with respect to the screen (frustum) and not the world.

+3

Voulez-vous dire que vous voulez les coordonnées espace-caméra d'un point d'espace-monde? 'vector.copy (point) .applyMatrix4 (camera.matrixWorldInverse);' – WestLangley

+0

Fondamentalement ce que je veux est de déterminer quel quadrant ([-x, y], [x, y], [x, -y], [- x , -y]) la boîte est par rapport à la caméra (les lignes rouges suivent la caméra et non la scène). – SomeoneElse

Répondre

0

La méthode Vector3.project(camera) semble faire ce que vous recherchez. Cela vous donnera la position d'un objet dans les coordonnées normalisées de l'appareil, qui devrait aller de -1 à 1 dans les deux directions x et y.

vector.set(x, y, z) // or vector.copy(...) 
vector.project(camera) 
if (vector.x <= 0) { 
    ... 
} 

doit être vrai si l'objet est dans la moitié gauche de la vue, même si je ne l'ai pas testé.