2012-11-01 38 views
1

我正在做簡單的碰撞檢測,雖然我可以很容易地檢測上/下物體與THREE.ray,我很難找到什麼是前/後一個相機(或任何物體),當他們旋轉?我嘗試用投影儀投射光線,並使用助手箭頭顯示該射線如何射擊。一旦我開始繞Y軸旋轉攝像頭,光線指向相反方向或只是古怪行爲...Ray.direction其中相機(物體)正在看

ray = new THREE.Ray(); 
projector = new THREE.Projector(); 
vector = projector.projectVector(coll.getObject().matrix.getPosition().clone(), camera); 
ray.direction = vector.normalize(); 
ray.origin = coll.getObject().matrix.getPosition().clone(); 
helper.setDirection(ray.direction.clone()); 
helper.position = ray.origin.clone(); 
+1

這是一個更好一點,但它仍然依賴,如果我的相機在座標接近(0,0,0),不知道發生了什麼事:'VAR localVertex = coll.getObject()。 position.clone(); \t \t \t var globalVertex = coll.getObject()。matrix.multiplyVector3(localVertex); \t \t \t var directionVector = globalVertex.subSelf(coll.getObject()。position.clone()); \t \t \t射線=新THREE.Ray(。coll.getObject()position.clone(),directionVector.clone()正常化()); \t \t \t \t \t \t //ray.origin.addSelf(ax.clone().multiplyScalar(rad/2)); \t \t \t helper.setDirection(ray.direction.clone()); \t \t \t helper.position = ray.origin.clone();' – eleventigers

回答

0

我結束了周圍設置連接到相機我的對象一個立方體,通過累加頂點拍攝光線,像這樣的:

vertices = coll.getObject().geometry.vertices; 
     rad = coll.getObject().boundRadius+1; 
     var directions = { 
      "up": [4,1], 
      "down": [6,2], 
      "front": [3,4], 
      "back": [7,0], 
      "left": [5,6], 
      "right": [1,2], 
     }; 
     var collisions = { 
      "up": {}, 
      "down": {}, 
      "front": {}, 
      "back": {}, 
      "left": {}, 
      "right": {}, 
     }; 
     for (key in directions){ 
      (directions[key].length > 1) ? localVertex = vertices[directions[key][0]].clone().addSelf(vertices[directions[key][1]].clone()) : localVertex = vertices[directions[key][0]].clone(); 
      globalVertex = coll.getObject().matrix.multiplyVector3(localVertex); 
      directionVector = globalVertex.subSelf(coll.getObject().position); 
      ray = new THREE.Ray(coll.getObject().position.clone(), directionVector.clone().normalize(), 0, 1000); 
      intersects = ray.intersectObjects(obj, true); 
      if (intersects.length > 0) { 
       distance = intersects[ 0 ].distance; 
       if (distance >= 0 && distance <= rad) { 
        collisions[key] = intersects[ 0 ];    
       } else {       
        collisions[key] = false; 
       } 
      } else { 
       collisions[key] = false; 
       ++falseCount; 
      }  
     }     
    } 
    return (falseCount !== 6) ? collisions : false;