SceneKit - SCNAnimationPlayer из файла Collada без анимации сетки игрока - PullRequest
0 голосов
/ 03 августа 2020

Я пытаюсь оживить персонажа с помощью анимации, созданной с помощью Mixamo.

Проблема в том, что анимация костей персонажа не работает. Я могу видеть только анимацию вращения, но 3D-модель остается в Т-позе. Более того, положение и масштаб персонажа полностью меняются, когда я запускаю анимацию.

Вот код, который я использую для инициализации моего узла персонажа:

    convenience init(folderPath: String, nodeName: String) {
        let characterScene = SCNScene(named: folderPath)!
        self.nodeRef = characterScene.rootNode.childNode(withName: nodeName, recursively: true)!
   
        [...] 

        self.node.addChildNode(nodeRef)
        self.node.scale = SCNVector3(SCALE, SCALE, SCALE)
        self.node.eulerAngles = SCNVector3Make(0, (Float.pi/2) * 2, 0)
        self.node.position = SCNVector3(0, Floor.RADIUS, 3.5)
    }

А вот код для применения и запустите анимацию:

    func startAnimation() {
        
        runAnimation = loadAnimation(fromSceneNamed: "art.scnassets/Medieval/Running-fixed.dae")
        runAnimation?.animationPlayer(forKey: "Run")?.play()
        node.addAnimationPlayer(runAnimation!, forKey: "Run")

    }
    
    fileprivate func loadAnimation(fromSceneNamed sceneName: String) -> SCNAnimationPlayer {
        let scene = SCNScene(named: sceneName)!
        // find top level animation
        var animationPlayer: SCNAnimationPlayer! = nil
        scene.rootNode.enumerateChildNodes { (child, stop) in
            if !child.animationKeys.isEmpty {
                animationPlayer = child.animationPlayer(forKey: child.animationKeys[0])
                
                stop.pointee = true
            }
        }
        return animationPlayer
    }

И в моей GameScene:

        [...]
        self.character = Character(folderPath: "art.scnassets/Medieval/character_worker.dae", nodeName: "characterWorker")
        rootNode.addChildNode(self.character.node)
        self.character.startAnimation()
        [...]

Мне удалось анимировать персонажа с помощью файлов Collada, которые я нашел в Интернете, поэтому проблема, скорее всего, связана с один из моих файлов Collada.

Я использовал команду xmllint --format в файле Mixamo и скрипт ConvertToXCodeCollada, чтобы перегруппировать все анимации в один, чтобы его можно было прочитать с помощью SceneKit.

Вот скриншот 3D-ресурса: Character.png и файл анимации: Animation.png .

Более того, похоже, что файл анимации не содержать текстуру, хотя я установил флажок «со скином» при экспорте анимации из Mixamo.

...