Остановка в точке - PullRequest
       4

Остановка в точке

2 голосов
/ 10 ноября 2011

У меня есть космический корабль, который я хочу повернуть к месту назначения.В настоящее время он работает как 90% времени, но иногда он «прыгает» к углу назначения, а не движется плавно.Вот мой код:

a = System.Math.Sin(.destStoppingAngle + System.Math.PI)
b = System.Math.Cos(.destStoppingAngle + System.Math.PI)
c = System.Math.Sin(.msngFacing)
d = System.Math.Cos(.msngFacing)

det = a * d - b * c

If det > 0 Then
     .msngFacing = .msngFacing - .ROTATION_RATE * TV.TimeElapsed
     If det < 0.1 Then
         .msngFacing = .destStoppingAngle
         .turning = False
     End If
 Else
     .msngFacing = .msngFacing + .ROTATION_RATE * TV.TimeElapsed 
     If det > 0.1 Then
         .msngFacing = .destStoppingAngle
         .turning = False
     End If
 End If

1 Ответ

0 голосов
/ 10 ноября 2011

Я бы сделал это так. Во-первых, вам нужна функция для определения угла (код C, портируйте его самостоятельно):

float lerpangle(float from, float to, float frac) {
    float a;

    if ( to - from > 180 ) {
        to -= 360;
    }
    if ( to - from < -180 ) {
        to += 360;
    }
    a = from + frac * (to - from);

    return a;
}

Затем, когда вы начинаете вращение, у вас есть duration и stoppingangle в качестве ваших собственных параметров. Получите startingangle от вашего объекта и startingtime (в чем-то прилично точном, миллисекунды) и сохраните их. Затем вращение происходит так:

current_rotation = lerpangle(startingangle, stoppingangle,
                  (time.now - startingtime) / duration)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...