小编典典

SCNCamera极限弧球旋转

swift

我有一个SCNCamera场景设置,可以围绕一个对象旋转。

限制相机围绕物体旋转的最佳方式是什么?

示例:除了能够围绕整个球体旋转之外,我如何将旋转限制为单个半球?

我的第一个尝试是查看.allowsCameraControl是否存在任何限制。找不到任何东西。

然后,我尝试使用c#Unity:鼠标轨道脚本,不走运。

关于如何解决或解决此问题的一些指示将非常有用。

var lastWidthRatio: Float = 0
var lastHeightRatio: Float = 0

let camera = SCNCamera()
let cameraNode = SCNNode()
let cameraOrbit = SCNNode()

override func viewDidLoad() {
    super.viewDidLoad()

    // create a new scene
    let scene = SCNScene(named: "art.scnassets/ship.scn")!

    // create and add a camera to the scene

    camera.usesOrthographicProjection = true
    camera.orthographicScale = 9
    camera.zNear = 0
    camera.zFar = 100

    cameraNode.position = SCNVector3(x: 0, y: 0, z: 50)
    cameraNode.camera = camera

    cameraOrbit.addChildNode(cameraNode)
    scene.rootNode.addChildNode(cameraOrbit)

    // retrieve the ship node
    let ship = scene.rootNode.childNodeWithName("ship", recursively: true)!

    // retrieve the SCNView
    let scnView = self.view as! SCNView

    // set the scene to the view
    scnView.scene = scene

    // add a tap gesture recognizer
    let gesture = UIPanGestureRecognizer(target: self, action: "panDetected:");
    scnView.addGestureRecognizer(gesture);
}


func panDetected(sender: UIPanGestureRecognizer) {
    let translation = sender.translationInView(sender.view!)
    let widthRatio = Float(translation.x) / Float(sender.view!.frame.size.width) + lastWidthRatio
    let heightRatio = Float(translation.y) / Float(sender.view!.frame.size.height) + lastHeightRatio
    self.cameraOrbit.eulerAngles.y = Float(-2 * M_PI) * widthRatio
    self.cameraOrbit.eulerAngles.x = Float(-M_PI) * heightRatio

    print(Float(-2 * M_PI) * widthRatio)
    if (sender.state == .Ended) {
        lastWidthRatio = widthRatio % 1
        lastHeightRatio = heightRatio % 1
    }
}

阅读 314

收藏
2020-07-07

共1个答案

小编典典

您似乎就快要到了,仅使用您引用的答案中的@Rickster代码。

您可以进行的更改将在以下几行中:

self.cameraOrbit.eulerAngles.y = Float(-2 * M_PI) * widthRatio
self.cameraOrbit.eulerAngles.x = Float(-M_PI) * heightRatio

隐含地允许俯仰和偏航覆盖整个球体。那是您可以进行限制的地方。例如eulerAngles.x,您可以执行以下操作,而不是让音高()从0到-π变化

self.cameraOrbit.eulerAngles.x = Float(-M_PI_2) + Float(-M_PI_2) * heightRatio

使用全屏垂直滚动覆盖该范围,可以在-π/ 2和-π之间平滑地变化。或者,您可以在这两行中设置严格的最小/最大限制/检查,以约束到地球的特定区域。

(编辑以解决惯性注释)

对于旋转阻尼或惯性,我会使用内置的SceneKit
Physics进行处理,并可能将相机放在不可见(无几何形状)的SCNNode上。该相机节点变成了一个万向节,类似于本项目中采用的方法:一个完全由RubyMotion和SceneKit创建的交互式七英尺地球仪

然后,虚拟万向节将SCNPhysicsBody带有some(您添加,默认情况下不附带一个)damping。或者,也许您将物理场放在中心对象上,然后给该对象一些东西angularDamping

2020-07-07