2017-02-14 103 views
0

我有一个数学问题,我正在努力。计算圆上的目标范围Three.js

我有一个特殊的弧度我想指向相机(camera.rotation.y)。我想告诉用户他们是否需要向左或向右平移以达到该弧度,并且具有PI/4的容差。

我已经让相机+小车旋转

function getCurrentPan(){ 
    return dolly.rotation.y + camera.rotation.y > 0 
     ? (dolly.rotation.y + camera.rotation.y)%Math.PI 
     : ((dolly.rotation.y + camera.rotation.y)%Math.PI) + Math.PI; 
} 

归泛号码所以它总是0和PI之间。

我曾计划制定出我可以检查的范围,以查看用户是否需要向左或向右平移才能达到该弧度。尝试下面的代码:

 point.leftRange = {}; 
     point.leftRange.min = point.pan - range > 0 ? point.pan - range : Math.PI - point.pan - range; 
     point.leftRange.max = point.leftRange.min - Math.PI/2 - range > 0 ? (point.pan - range)%Math.PI : (Math.PI - (point.leftRange.min - Math.PI/2 - range))% Math.PI; 

     console.log(point.leftRange); 

     point.rightRange = {}; 
     point.rightRange.min = (point.pan + range) % Math.PI; 
     point.rightRange.max = (point.rightRange.min + (Math.PI/2 - range)) % Math.PI; 

     console.log(point.rightRange); 

这是给我像

  • point.pan 1.464308692701496
  • left.min 1.071609611002772
  • left.max 0.8918857974908487
  • right.min 1.8570077744002202
  • right.max 3.0351050194963927

我已经试过另一种方法是

   var opp = (point.pan - Math.PI/2)%Math.PI; 
       opp = opp > 0 ? opp : Math.PI - opp; 

       if(getCurrentPan() > point.pan && getCurrentPan() < opp) 
        console.log('greater'); 
       else if(getCurrentPan() < point.pan && getCurrentPan() > opp) 
        console.log('less'); 

这要是锅就像是0.5左右的范围是3等(PI的另一侧)再次将不考虑。

对不起,我没有解释得很好,但如果有人能指出我正确的方向,我会很感激!

回答

1

这是过度工程。如果你想找出一个目标是否是在相机的左侧或右侧,你这样做:

d = camera.getworlddirection(); 
diff = target.position - camera.position; 
theta = atan2(diff.x,diff.z) - atan2(d.x,d.z); 

这是你的相机正在VS在对象为相对于相机之间的夹角。

这样:

if(abs(theta) < someThreshold){ 
    if(theta > 0){ 
    //its to the right 
    } 
    else{ 
    //its to the left 
    } 
} 
+0

感谢。这很有用。我的问题不在于它是一个对象......但是这可能对此有好处 - 更多的是存储的视角。我可能能够添加一个隐藏的对象在这个角度tho使用这个,如果我不能这样做的角度.. – user5839

+1

其实我打算这样做。我会标记答案正确.. – user5839

+0

什么是目标的类型。位置'和'camera.position'就是'vector3'的类型,我收到错误了。 –