2016-08-05 1 views
1

Я пишу 2D-игру с обратной кинематикой. Я использую этот простой алгоритм:2D Зависимость угла обратной кинематики

let angleToParent = angleBetweenPoints(parent, child) 
child.x = parent.x + distance*Math.cos(angleToParent) 
child.y = parent.y + distance*Math.sin(angleToParent) 
child.rotation = angleToParent 

Как реализовать угловое ограничение для детей?

Этот код работает неправильно, когда вращение родителя пересекаться на 180 градусов:

let implementBound = (lowerBound, upperBound, input) => { 
    return Math.min(Math.max(lowerBound, input), upperBound) 
} 

let constraint = (Math.PI/180)*15 
let left = parent.rotation - constraint 
let right = parent.rotation + constraint 
angleToParent = implementBound(left, right, angleToParent) 
+0

В каком смысле вы имеете в виду? Не могли бы вы просто зажать 'angleToParent'? – pingul

ответ

1

Вы можете сделать что-то вроде следующего:

if (input < lowerBound || input > upperBound) 
{ 
    //check which limit is closer 
    while (Math.abs(upperBound - input) > Math.PI) 
     input += 2 * Math.PI * (input < upperBound ? 1.0f : -1.0f); 
    double distance_to_upper = Math.abs(upperBound - input); 

    while (Math.abs(lowerBound - input) > Math.PI) 
     input += 2 * Math.PI * (input < lowerBound ? 1.0f : -1.0f); 
    double distance_to_lower = Math.abs(lowerBound - input); 

    if (distance_to_lower < distance_to_upper) 
     return lowerBound; 
    else 
     return upperBound; 
} 
else 
    return input; 
Смежные вопросы