Как заставить анимацию положения SCNNode двигаться с одинаковой скоростью?

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

Проблема, с которой я сталкиваюсь, заключается в том, что моя анимация не является гладкой. Перемещение узла из точки A в точку B приводит к небольшому увеличению скорости перемещения и небольшому снижению скорости, когда он приближается к желаемому положению. Я хочу, чтобы скорость оставалась одинаковой во всем. Это проблема, потому что мои анимации не двигаются очень далеко и происходят часто (2 раза в секунду + задержка вычислений), в результате чего они выглядят очень рывками.

Итак, мой вопрос: есть ли способ сделать скорость анимации одинаковой?

Изменить: просто для ясности я использую SCNTransaction. Мой код выглядит примерно так: Половина псевдокода

func simulate(){
    SCNTransaction.begin()
     SCNTransaction.setAnimationDuration(0.5)
    SCNTransaction.setCompletionBlock{
        //If no victory this simulate func is run again
        checkVictory()
    }

    for all gameObjects{
    object.position = calculateNewPos()
 }
 SCNTransaction.commit()

}

person Tim Andrews    schedule 29.12.2014    source источник


Ответы (1)


функция синхронизации по умолчанию — kCAMediaTimingFunctionDefault.

Установка animationTimingFunction для SCNTransaction на [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear] может решить вашу проблему.

person mnuages    schedule 29.12.2014
comment
Потрясающий. Большое спасибо. У меня была только одна проблема, и это было то, что вместо установки функции синхронизации на: CAMediaTimingFunction (имя: kCAMediaTimingFunctionLinear) мне пришлось установить ее на: CAMediaTimingFunction (имя: linear), что я нахожу очень странным, поскольку эта точная строка не указана в их документах, и я нашел чисто догадки - person Tim Andrews; 29.12.2014
comment
kCAMediaTimingFunctionLinear является константой, и ее нельзя заключать в кавычки: CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear) - person mnuages; 29.12.2014