我有以下代码(可以通过替换macOS的Game基础项目中的标准ViewController代码来运行):
let scene = SCNScene()
let cameraNode = SCNNode()
cameraNode.camera = SCNCamera()
scene.rootNode.addChildNode(cameraNode)
cameraNode.position = SCNVector3(x: 0, y: 0, z: 15)
let lightNode = SCNNode()
lightNode.light = SCNLight()
lightNode.light!.type = .omni
lightNode.position = SCNVector3(x: 0, y: 10, z: 10)
scene.rootNode.addChildNode(lightNode)
let ambientLightNode = SCNNode()
ambientLightNode.light = SCNLight()
ambientLightNode.light!.type = .ambient
ambientLightNode.light!.color = NSColor.darkGray
scene.rootNode.addChildNode(ambientLightNode)
/* RELEVANT CODE BEGINS */
let boxGeo = SCNBox(width: 1, height: 1, length: 1, chamferRadius: 0)
let boxMaterial = SCNMaterial()
boxMaterial.diffuse.contents = NSColor.gray
boxGeo.firstMaterial = boxMaterial
let boxNode = SCNNode(geometry: boxGeo)
scene.rootNode.addChildNode(boxNode)
boxNode.name = "box0"
let sphereGeo = SCNSphere(radius: 0.5)
let sphereMaterial = SCNMaterial()
sphereMaterial.diffuse.contents = NSColor.green
sphereGeo.firstMaterial = sphereMaterial
let sphereNode = SCNNode(geometry: sphereGeo)
boxNode.addChildNode(sphereNode)
sphereNode.name = "sphere0"
sphereNode.constraints = [SCNConstraint]()
let distance = SCNDistanceConstraint(target: boxNode)
distance.minimumDistance = 2.0
distance.maximumDistance = 5.0
sphereNode.constraints?.append(distance)
let ik = SCNIKConstraint.inverseKinematicsConstraint(chainRootNode: boxNode)
sphereNode.constraints?.append(ik)
let anim = CABasicAnimation(keyPath: "targetPosition.y")
anim.fromValue = -2.0
anim.toValue = 2.0
anim.duration = 1
anim.autoreverses = true
anim.repeatCount = .infinity
ik.addAnimation(anim, forKey: nil)
/* RELEVANT CODE ENDS */
let scnView = self.view as! SCNView
scnView.scene = scene
scnView.allowsCameraControl = true
scnView.showsStatistics = true
scnView.backgroundColor = NSColor.black
根据我从文档中可以收集到的信息,动画(是的,场景工具包视图动画设置在IB中设置为“播放”和“循环”)应将球体尽可能靠近y-上的点2.0和-2.0旋转立方体来旋转轴。但是,球体只是保持静止。我还尝试通过直接操纵其位置矢量而不是通过距离约束来设置球体和立方体的初始位置,但是动画仍然没有执行任何操作。
另外,我尝试将距离约束与具有lookAt约束的框结合使用,以使其旋转以不断观察球体-这些导致框和球体的渲染完全异常。
我感觉好像我在这里的文档中缺少某些东西,例如另一种约束或某种用于设置某种初始值的转换矩阵。但是我遇到了其他一些有关约束,动画和骨架的问题,这使我开始相信SceneKit存在错误或某些未记录的方面。
最佳答案
您已将sphereNode添加为boxNode的子级。如果移动boxNode,则所有子项也将移动,并且约束无效。
关于swift - SCNIKConstraint如何工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50870921/