2017-02-14 26 views
0

У меня проблема с математикой, с которой я борюсь.Вычислить целевой диапазон по кругу Three.js

У меня есть определенный радиан, я хочу указать камеру на (camera.rotation.y). Я хочу сказать пользователю, если им нужно панорамировать влево или вправо, чтобы добраться до этого радиана, с допуском PI/4.

Я нормализовал панорамирование номер, получая камеру + Dolly Rotation

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 и ПИ.

Я планировал разработать диапазон, который я могу проверить, чтобы проверить, нужно ли пользователю перемещаться влево или вправо, чтобы добраться до этого радиана. Попытка этот код:

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

это угол между тем, где камера смотрит против, когда объект находится в связи с камерой ,

так:

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', я получаю ошибку. –