Ios SceneKit摄影机约束行为问题

Ios SceneKit摄影机约束行为问题,ios,swift,scenekit,Ios,Swift,Scenekit,目前正在与swift一起在scenekit中开发一款游戏,我正在尝试实施相机限制,以充分利用scenekit提供的一切。我很快就要得到我想要的,但是我缺少了一部分,似乎无法找到它。下面是该问题的视频 显示了我的相机用我编写的代码跟踪我的飞船。方向和角度都很好,并且有很好的惯性。我通过以下代码实现这一点: func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) { updateCameraPo

目前正在与swift一起在scenekit中开发一款游戏,我正在尝试实施相机限制,以充分利用scenekit提供的一切。我很快就要得到我想要的,但是我缺少了一部分,似乎无法找到它。下面是该问题的视频

显示了我的相机用我编写的代码跟踪我的飞船。方向和角度都很好,并且有很好的惯性。我通过以下代码实现这一点:

func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) {
    updateCameraPosition()
}

func updateCameraPosition () {
    let currentPosition = player.node.presentation.position
    let newVector = getNewCameraVector(currentPosition: currentPosition, t: 0.03 )

    cameraNode.runAction( SCNAction.move(to: newVector, duration: 0.2) )

    prevCameraPosition = currentPosition
}

func getNewCameraVector (currentPosition:SCNVector3, t: Float) -> SCNVector3 {
    let x = (1 - t) * prevCameraPosition.x + t * currentPosition.x
    let y = cameraZoom
    let z = ((1 - t) * prevCameraPosition.z + t * currentPosition.z) + cameraZPos!

    return SCNVector3(x,y,z)
}
    // look at "lookAtTarget"
    let lookAtConstraint = SCNLookAtConstraint(target: player.node)
    lookAtConstraint.influenceFactor = 0.07
    lookAtConstraint.isGimbalLockEnabled = true

    // distance constraints
    let distanceConstraint = SCNDistanceConstraint(target: player.node)
    let distance = CGFloat(simd_length(cameraNode.simdPosition))
    distanceConstraint.minimumDistance = distance
    distanceConstraint.maximumDistance = distance

    // configure a constraint to maintain a constant altitude relative to the character
    //let desiredAltitude = abs(cameraNode.simdWorldPosition.y)
    //weak var weakSelf = self

    let keepAltitude = SCNTransformConstraint.positionConstraint(inWorldSpace: true, with: {(_ node: SCNNode, _ position: SCNVector3) -> SCNVector3 in
        return SCNVector3(0, self.cameraZoom, self.cameraZoom)
    })

    let accelerationConstraint = SCNAccelerationConstraint()
    accelerationConstraint.maximumLinearVelocity = 1500.0
    accelerationConstraint.maximumLinearAcceleration = 50.0
    accelerationConstraint.damping = 0.05

    cameraNode.constraints = [distanceConstraint, keepAltitude, accelerationConstraint, lookAtConstraint]
显示相机在约束条件下跟随我的飞船。它似乎只是在x,z轴上旋转。所以我真的希望它像我写的代码一样在x,z轴上来回移动。。。或者类似的东西。这些约束来自WWDC 2017 scenekit fox演示,我是这样实现的:

func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) {
    updateCameraPosition()
}

func updateCameraPosition () {
    let currentPosition = player.node.presentation.position
    let newVector = getNewCameraVector(currentPosition: currentPosition, t: 0.03 )

    cameraNode.runAction( SCNAction.move(to: newVector, duration: 0.2) )

    prevCameraPosition = currentPosition
}

func getNewCameraVector (currentPosition:SCNVector3, t: Float) -> SCNVector3 {
    let x = (1 - t) * prevCameraPosition.x + t * currentPosition.x
    let y = cameraZoom
    let z = ((1 - t) * prevCameraPosition.z + t * currentPosition.z) + cameraZPos!

    return SCNVector3(x,y,z)
}
    // look at "lookAtTarget"
    let lookAtConstraint = SCNLookAtConstraint(target: player.node)
    lookAtConstraint.influenceFactor = 0.07
    lookAtConstraint.isGimbalLockEnabled = true

    // distance constraints
    let distanceConstraint = SCNDistanceConstraint(target: player.node)
    let distance = CGFloat(simd_length(cameraNode.simdPosition))
    distanceConstraint.minimumDistance = distance
    distanceConstraint.maximumDistance = distance

    // configure a constraint to maintain a constant altitude relative to the character
    //let desiredAltitude = abs(cameraNode.simdWorldPosition.y)
    //weak var weakSelf = self

    let keepAltitude = SCNTransformConstraint.positionConstraint(inWorldSpace: true, with: {(_ node: SCNNode, _ position: SCNVector3) -> SCNVector3 in
        return SCNVector3(0, self.cameraZoom, self.cameraZoom)
    })

    let accelerationConstraint = SCNAccelerationConstraint()
    accelerationConstraint.maximumLinearVelocity = 1500.0
    accelerationConstraint.maximumLinearAcceleration = 50.0
    accelerationConstraint.damping = 0.05

    cameraNode.constraints = [distanceConstraint, keepAltitude, accelerationConstraint, lookAtConstraint]

如果有人知道我如何才能做到这一点,我很乐意听到!没有任何关于这些新约束的文档,所以我只是在猜测什么时候会用到它们。

回答我自己的问题,希望它能帮助其他人。我最终能够在以下限制条件下复制相机代码:

func setupCamera () {
    cameraNode.camera = SCNCamera()
    cameraZPos = cameraZoom / 2 // cameraZoom == 100

    if let cam = cameraNode.camera {
        cam.zFar = cameraZFar
    }

    let replicatorConstraint = SCNReplicatorConstraint(target: player.node)
    replicatorConstraint.positionOffset = SCNVector3(0,cameraZoom,cameraZPos!)
    replicatorConstraint.replicatesOrientation = false

    let lookAtConstraint = SCNLookAtConstraint(target: player.node)
    lookAtConstraint.influenceFactor = 0.07
    lookAtConstraint.isGimbalLockEnabled = true

    let accelerationConstraint = SCNAccelerationConstraint()
    accelerationConstraint.maximumLinearAcceleration = 300.0

    cameraNode.constraints = [replicatorConstraint, lookAtConstraint, accelerationConstraint]
}

如果你有任何问题,请评论这个答案,我很乐意分享我所学到的

非常有用的答案-很难找到关于SCNConstraint内容的工作示例代码。