ARKit после применения силы получить местоположение узла - PullRequest
0 голосов
/ 29 сентября 2018

Такая же проблема, как этот вопрос как отследить положение узла после применения силы в Arkit 1.5 , но без ответа Итак, я добавляю новый вопрос

У меня есть узел (SCNSphere), в которомЯ применяю силу.Узел имеет dynamic Физическое тело.При пролистывании я прикладываю силу к SCNNode, используя physicsBody?.applyForce, что все хорошо работает

Проблема возникает после применения силы, поскольку она имеет dynamic тело, оно непрерывно опускается, и Я хочу отслеживать эту позицию

на renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) Я печатаю position из SCNNode, но он каждый раз показывает одну и ту же позицию, почему позиция Y не уменьшается при движении вниз?

Как

<SCNNode: 0x280f29500 'ball' pos(-0.165368 0.3 -0.809096) | geometry=<SCNSphere: 0x280619380 | radius=0.150> | no child> <SCNNode: 0x280f29500 'ball' pos(-0.165368 0.2 -0.809096) | geometry=<SCNSphere: 0x280619380 | radius=0.150> | no child> <SCNNode: 0x280f29500 'ball' pos(-0.165368 0.1 -0.809096) | geometry=<SCNSphere: 0x280619380 | radius=0.150> | no child>

и так далее?

Как я добавил узел

        let ballWithOrientation = getNewBallNode() // return ball node + position
        let ballNode = ballWithOrientation.ball // it is the SCNNode
        self.sceneView.scene.rootNode.addChildNode(ballNode ?? SCNNode()) // Added to the scene 
        let cameraPosition =  self.sceneView.pointOfView?.worldFront

        let target =  SCNVector3(Double(cameraPosition?.x ?? 1) * forceVector,Double (cameraPosition?.y  ?? 1) * forceVector,Double(cameraPosition?.z ?? 1) * forceVector) // Vector of direction 
        let throwSpeed = self.calculateBestThrowSpeed(origin: ballNode!.position, target:target , timeToTarget: 0.66)  Calculated vector with velocity 
        ballNode?.physicsBody?.applyForce(throwSpeed, asImpulse: true) // apply force 

Вопрос Как отследить мировое положение SCNNode после применения силы?

1 Ответ

0 голосов
/ 29 сентября 2018

Я нашел очень простое решение

open var presentation: SCNNode { get }

Это свойство SCNNode предоставит вам представление текущего узла

, поэтому, наконец, ballNode.presentation.position предоставит вам текущую позициюузел со всеми анимациями (силами)

из Apple Docs

Когда вы используете неявную анимацию (см. SCNTransaction), чтобы изменить свойства узла, эти свойства узланемедленно установите их целевые значения, даже если содержимое анимированного узла, кажется, переходит от старых значений свойств к новым.Во время анимации SceneKit поддерживает копию узла, называемого узлом представления, свойства которого отражают временные значения, определяемые любыми анимациями в полете, которые в данный момент влияют на узел.

Надеюсь, что это поможет кому-то найтианалогичный вопрос

...