×

[SceneKit]Motion Control(十一)

96
里脊糖醋
2017.07.27 18:40 字数 322

在游戏中, 我们的物体总是会移动, 此时如果物体移动, 而相机并没有移动, 则我们的物体就会变小, 变大, 变形, 或者移动到相机能够看到的范围而消失了.
假如一个人在场景中奔跑, 随着他的奔跑他并没有变大或者变下, 这就需要使用到相机跟随, 需要让相机一直跟随者物体运动, 他们两个之间的相对位置是不变的.
假设有两个节点, cameraNode和ballNode, 要想使ballNode运动时相机跟随, 可以添加他们之间的约束

var cameraNode:SCNNode!
var ballNode:SCNNode!
// 1
cameraNode = scnScene.rootNode.childNodeWithName("camera", recursively:true)!
// 2
let constraint = SCNLookAtConstraint(target: ballNode)
cameraNode.constraints = [constraint]

Gimbal locking

当给cameraNode设置SCNLookAtConstraint时,无论ballNode如何运动, 相机都会跟随球一起运动, 但是这就会产生一个问题, 当球运动时, 有可能会让相机产生旋转或者倾斜.
如果此时你正在控制一个光照, 但是因为你控制一个相机这种行为可能会导致一些奇怪的视角的显示。 相反,我们的目的是希望照相机始终保持水平。

constraint.gimbalLockEnabled = true

获取加速度

小球的运动使用CoreMotion框架来获取加速度, 并把这个值赋值给ball, 来使小球动起来

  let motionManager = CMMotionManager()

        func startAccelerometerUpdates() {
            guard self.motionManager.isAccelerometerAvailable else {
                return
            }
            self.motionManager.accelerometerUpdateInterval = interval // 刷新间隔
            self.motionManager.startAccelerometerUpdates(to: OperationQueue()) { (accelerometerData, error) in
                if self.motionManager.isAccelerometerActive {
                    print(accelerometerData?.acceleration as Any)
                }
            }
        }
SceneKit
Web note ad 1