2017-02-14 6 views
0

私は苦労している数学の問題があります。円上の目標範囲を計算するThree.js

私は(camera.rotation.y)にカメラを指すようにしたい特定のラジアンを持っています。私は、そのラジアンに到達するために左または右にパンする必要があるかどうかをPI/4の公差でユーザに伝えたいと思います。

私はそれが0とPIの間でいつものカメラ+ドリー回転に

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; 
} 

を取得することにより、パンの数を正規化してきました。

私は、ユーザーがそのラジアンに行くために左か右にパンする必要があるかどうかを調べるための範囲を調べることを計画していました。このコードをしよう:

right.min 1.8570077744002202
  • 0.8918857974908487 left.max
  • 1.071609611002772 left.minくれ

    • point.pan 1.464308692701496
    • のようなものを与えている
       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); 
      

    • right.max 3.0351050194963927

    私が試した別のアプローチは、パンは0.5のようなもので、左の範囲は3等(PIの反対側)であれば、再び考慮されません

       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'); 
    

    です。

    申し訳ありません私はこれをうまく説明していませんが、誰かが私に正しい方向を示すことができるなら、私はそれを感謝します!

    答えて

    1

    これはoverengineeredです。あなたは、ターゲットがカメラの左右にあるかを把握したい場合は、次の操作を行います。

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

    これはあなたのカメラは被写体がカメラに関連している場所対見ている場所との間の角度であります。そう

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

    感謝。それは便利です。私が持っている問題は、それがオブジェクトだということではありませんが、これは良いことです。私は角度に基づいてそれを行うことができない場合、これを使用するために、その角度に隠れたオブジェクトを追加することができるかもしれません。 – user5839

    +1

    実際に私はこのようにします。私は正しい答えをマークします。 – user5839

    +0

    'targetのタイプは何ですか? positionと 'camera.position'は' vector3'の型です。エラーが発生しています。 –

    関連する問題