2016-05-28 3 views
1

Я ищу для отслеживания дельты вращения (ось y) между двумя показаниями.расчет дельта вращения на основе начального угла и угла тока

Существует игровой объект, с которого я начинаю отсчитывать начальный угол. Тогда у меня есть другая переменная, которая читает живой угол во время цикла обновления.

Я хочу, чтобы значение дельта было агностиком отрицательного или положительного, по сути, я собираюсь применить те же самые обновления, независимо от того, поворачивается ли объект на 20 градусов влево или вправо.

EDIT: Я хочу, чтобы значение дельта быть наименьший угол, так что максимальная она может быть 180, перед подсчетом вниз до 0.

Пример: Если мой initFaceAngle == 5 и currentFaceAngle == 355 затем myAngle == 10

void Start() 
{ 
    initFaceAngle = hmd.transform.rotation.eulerAngles.y; 
} 
void update() 
{  
    currentFaceAngle = hmd.transform.rotation.eulerAngles.y; 
    // My terrible first attempt... look ma' I can math. 
    float myAngle = (float)Math.Abs(initFaceAngle - currentFaceAngle); 
} 

Очевидно мой расчет не будет работать, потому что получение разницы между двумя углами, не принимать во внимание 360 градусов. Поэтому я решил, что мне нужен пирог (pi) на этом, но за пределами того, чтобы быть впечатляющим пирогом (pi), я не имею понятия, как вызвать его магические способности.

Какую формулу следует использовать для захвата дельта?

Как я могу заставить его читать то же, вращаться ли влево или вправо?

+0

Вы можете использовать модульную арифметику (360 градусов). Число, превышающее 180 градусов, будет отрицательным вращением. – jdweng

+0

Я немного не понимаю, почему разница не сработает для вас. Если ваш угол изменяется на 20 градусов, то Math.Abs ​​должен работать на вас, независимо от направления. Если вы обеспокоены углом, который вращается на 380 градусов, вы можете сделать «var myAngleDelta = Math.Abs ​​((initFaceAngle - currentFaceAngle)% 360)'. – Travis

+0

Проблема, с которой я сталкиваюсь, заключается в том, что я не хочу, чтобы myAngle подсчитывал до 359, а затем переходил на 0. Я хочу, чтобы он вычислил наименьший угол, поэтому максимальный myAngle может быть равен 180. Так что я полагаю, что мой вопрос is: Как рассчитать минимальную угловую дельта между initFaceAngle и currentFaceAngle? – stuffyjoelab

ответ

1

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

void update() 
{  
    currentFaceAngle = hmd.transform.rotation.eulerAngles.y; 
    float myAngle; 
    if(initFaceAngle > currentFaceAngle) 
     myAngle = initFaceAngle - currentFaceAngle; 
    else 
     myAngle = currentFaceAngle - initFaceAngle; 

    if(myAngle > 180) 
     myAngle = 360 - myangle; 
} 
1

Я думаю, что я разработал решение, не уверен, что он самый изящный, но выходные значения выглядят правильно.

void Start() 
{ 
    initFaceAngle = hmd.transform.rotation.eulerAngles.y; 
} 
void update() 
{  
    currentFaceAngle = hmd.transform.rotation.eulerAngles.y; 
    float myAngle = getDeltaAngle(initFaceAngle, currentFaceAngle); 
} 

public static float getDeltaAngle(float a, float b) 
{ 
    float x; 
    float y; 


    if (a > b) 
    { 
     x = a; 
     y = b; 
    } 
    else 
    { 
     x = b; 
     y = a; 
    } 

    if (x - y < 180) 
    { 
     x = x - y; 
    } 
    else 
    { 
     x = (360 - x) + y; 
    } 

    return x; 
} 
Смежные вопросы