Получение позиции SCNPhysicsVehicle

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

Однако я не могу получить позицию автомобиля. Кажется логичным, что SCNPhysicsVehicle перенесет SCNNodes, которые содержат шасси и колеса, когда автомобиль движется, но SCNNodes остаются в исходном положении и ориентации. Как ни странно, скорость шасси SCNPhysicsBody остается достоверной во время моделирования, поэтому я могу предположить, что позиция автомобиля основана на SCNPhysicsBody, а не на SCNNode. К сожалению, нет документального метода, который я нашел для получения позиции SCNPhysicsBody.

Получение позиции на автомобиле должно быть тривиальным и необходимо для создания гоночной игры, но я не могу найти способ получить ее. Любые мысли или предложения будут оценены.

Ответ 1

Scene Kit автоматически обновляет положение node, которому принадлежит SCNPhysicsBody на основе моделирования физики, поэтому SCNNode.position - это свойство, которое нужно искать.

Уловка состоит в том, что в игре есть две версии этого node. Тот, который вы обычно получаете, называется "моделью" node. Он отражает целевые значения для заданных вами свойств, даже если вы задали эти свойства с помощью анимации. presentationNode отражает состояние отображаемого node - если анимация выполняется, свойства node имеют промежуточные значения, а не целевые значения анимации.

Действия, физика, ограничения и любые изменения графика сцены, которые вы делаете внутри методы цикла обновления/рендеринга непосредственно нацелены на "презентационную" версию вашего графика сцены. Итак, чтобы прочитать свойства node, заданные с помощью моделирования физики, получите presentationNode для интересующего вас node (node, которому принадлежит физическое тело транспортного средства chassisBody), затем прочитайте презентацию node position (или другие свойства).

Ответ 2

У меня такая же проблема с моим плеером node. Я перемещаю его с помощью applyForce (для управления обнаружением столкновений). Но когда я проверяю позицию node после некоторого движения, позиция node не перемещается (презентация node - это фактическое положение, когда риккер пишет в своем ответе) Мне удается обновить scnNode.position с помощью цикла визуализации Вы должны установить положение своего node с позицией presentationNode.

node.position = node.presentationNode.position

Установите это в renderer(_: updateAtTime), и ваша позиция node будет синхронизироваться с любой анимацией, сделанной вами на физическом устройстве