Свойство SceneKit isResting в SCNPhysicsBody всегда возвращает false - PullRequest
0 голосов
/ 03 мая 2019

Я загружаю шар в ARSCNView, используя ARKit/SceneKit, и шар движется вдоль плоскости пола, пока не остановится, в зависимости от того, какое усилие я прикладываю к мячу.

A SCNNode имеет свойство для определения, когда узел прекращает движение, и устанавливает для его свойства isResting значение true, используя:

myNode.physicsBody?.isResting

Я установил физическое тело myNode для регистрации покоя, используя:

myNodesPhysicsBody.allowsResting = true

У меня есть функция в моем классе мяча, которая должна определять, когда мяч остановился, используя:

func removeBowlingBallWhenNotMoving() {
        guard let bowlingBallNode = bowlingBallNode else {return}
        guard let resting = bowlingBallNode.physicsBody?.isResting else  {return} // I know I can combine these guard statements they're just here for easier debugging
        print("Resting: \(resting)") // This always returns false even when the node has visually stopped moving.
        if resting {
            performFadeOutOnBowlingBallWith(duration: Constants.bowlingBallFadeOutDuration)
        }
    }

Его вызывают в didSimulatePhysicsAtTime :

extension ViewController: ARSCNViewDelegate {
    func renderer(_ renderer: SCNSceneRenderer, didSimulatePhysicsAtTime time: TimeInterval) {
        bowlingBall.removeBowlingBallWhenNotMoving()
    }
}

1 Ответ

1 голос
/ 03 мая 2019

Согласно документации :

Значение этого свойства по умолчанию равно false, но симуляция физики SceneKit может автоматически установить его в значение true, если тело не движется и не подвергается воздействию каких-либо сил.

Так что, похоже, что другие силы все еще воздействуют на тело.

Возможно, вам лучше измерить .velocity ( документация ) тела, чтобы проверить, движется оно или нет.

...