Обратная кинематика в Арките - PullRequest
1 голос
/ 11 февраля 2020

У меня есть модель Scenekit с 4-мя стыками.

enter image description here

Когда я использую его в SCNView с кодом ниже и меняю положение родительского узла (соединения), я вижу его анимированным в соответствии с суставы.

  private lazy var scene: SCNScene = {

        let scene = SCNScene(named: "art.scnassets/ears")! 

        return scene
    }()

в viewDidLoad

        let cameraNode = SCNNode()
        cameraNode.camera = SCNCamera()

        cameraNode.position = SCNVector3(x: 0, y: 0, z: 5)

        rootNode.addChildNode(cameraNode)

        scnView.scene = scene
        scnView.allowsCameraControl = true
        scnView.backgroundColor = .white


        let joint = contentNode!.childNode(withName: "Joint", recursively: true)!
        var ik:SCNIKConstraint = .inverseKinematicsConstraint(chainRootNode: joint)
        joint.childNode(withName: "head", recursively: true)!.constraints = [ik]

Проблема возникает, когда я использую ту же модель в Arkit. В этом случае я использую отдельный View Controller, чем выше. Я помещаю это в голову. Модель рушится, когда я показываю ее в Arkit с кодом ниже. Я ожидаю, что он будет отслеживать движение головы и изгибаться в соответствии с ним.

enter image description here

     func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
      guard let sceneView = renderer as? ARSCNView,
        anchor is ARFaceAnchor else { return nil }

    faceGeometry = ARSCNFaceGeometry(device: sceneView.device!)!

    contentNode = SCNReferenceNode(named: "art/ears")
    //contentNode!.physicsBody = .kinematic()

    let joint = contentNode!.childNode(withName: "Joint", recursively: true)!
    var ik:SCNIKConstraint = .inverseKinematicsConstraint(chainRootNode: joint)
    joint.childNode(withName: "head", recursively: true)!.constraints = [ik]
    return contentNode
    }

У меня есть это расширение

extension SCNReferenceNode {
    convenience init(named resourceName: String, loadImmediately: Bool = true) {
        let url = Bundle.main.url(forResource: resourceName, withExtension: "scn", subdirectory: "Models.scnassets")!
        self.init(url: url)!
        if loadImmediately {
            self.load()
        }
    }

Обычный вид модели выглядит следующим образом: enter image description here

Правильно примененный снимок обратной кинематики enter image description here

Я попытался установить setMaxAllowedRotationAngle (между 20- 45 градусов) к суставам, это предотвращает разрушение, но также предотвращает изгиб. y свойство гравитации модели равно -9,8, x и z равны 0.

В чем может быть проблема, что я не могу создать такой же эффект в Arkit?

...