У меня есть модель Scenekit с 4-мя стыками.
Когда я использую его в 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 с кодом ниже. Я ожидаю, что он будет отслеживать движение головы и изгибаться в соответствии с ним.
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()
}
}
Обычный вид модели выглядит следующим образом:
Правильно примененный снимок обратной кинематики
Я попытался установить setMaxAllowedRotationAngle (между 20- 45 градусов) к суставам, это предотвращает разрушение, но также предотвращает изгиб. y свойство гравитации модели равно -9,8, x и z равны 0.
В чем может быть проблема, что я не могу создать такой же эффект в Arkit?