Получение позиции 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 будет синхронизироваться с любой анимацией, сделанной вами на физическом устройстве