【问题标题】:Stop Camera from rotating around a rotating parent阻止相机围绕旋转的父对象旋转
【发布时间】:2018-01-23 20:45:19
【问题描述】:

我有一个滚动的弹珠,我希望我的相机跟随它。我的问题是我的相机在旋转时也在围绕我的对象旋转。

这是我的代码。

-(void) setupCameraOnMarble:(SCNNode*)marble
{
    [cameraNode removeFromParentNode];

    [marble addChildNode:cameraNode];

    SCNLookAtConstraint *marbleStare = [SCNLookAtConstraint lookAtConstraintWithTarget:marble];

    marbleStare.gimbalLockEnabled = YES;

    cameraNode.constraints = @[marbleStare];    
}

我认为转换约束应该可以工作,但我不明白它是如何工作的。

【问题讨论】:

  • 您使用的是 SceneKits 物理系统吗? iOS 11 添加了SCNDistanceConstraint。您是否也需要适用于 iOS 10 的解决方案?
  • @orangenkopf 是的,我肯定需要 iOS 10 的解决方案。谢谢!

标签: objective-c scenekit


【解决方案1】:

您确定需要让 cameraNode 成为大理石的子节点吗?

因为根据 SKNode 文档:当一个节点的坐标系被缩放或旋转时,这种变换既适用于节点自己的内容,也适用于其后代的内容see SKNode

所以我假设您需要从大理石中取消子相机。为了实现跟随对象相机的行为,您可以在代码中的某处更新相机坐标,从而移动弹珠

【讨论】:

    【解决方案2】:

    我已将我的相机从我的球体中取出,并将我的类设为 SCNSceneRendererDelegate 协议,并将其添加到渲染循环中: -(void) renderer:(id)renderer updateAtTime:(NSTimeInterval)time { [cameraNode setPosition: SCNVector3Make(marbleNode.presentationNode.position.x, marbleNode.presentationNode.position.y + 5, marbleNode.presentationNode.position.z + 10)]; }

    如果我记录了 marble.presentationNode 的坐标,它们正在改变,但我的相机仍然没有移动!

    【讨论】:

    • 相机和弹珠都是同一个父级的子级?您是否将自己设置为SCNSceneViewdelegate,以便实际调用该方法?
    • 是的,我有。我还设置了scnView.isPlaying = YES...我还添加了一个NSLog来返回marbleNode.presentationNode的位置。我将用完整的代码回答下面的问题。感谢您的帮助!
    • 显然我不再被允许回答问题了!所以我不能给你我的代码@#$!%&
    • 我建议你给相机加一个变换约束,而不是给渲染器加代码。
    猜你喜欢
    • 2016-11-23
    • 2021-09-13
    • 2019-01-26
    • 1970-01-01
    • 2013-08-30
    • 2021-03-13
    • 1970-01-01
    • 2014-12-28
    • 1970-01-01
    相关资源
    最近更新 更多