关于ios:锁定摄像头旋转

 2021-04-27 

Lock camera rotation around

我正在创建一个使用SceneKit的应用程序。该模型位于固定位置,用户可以围绕场景平移和旋转摄像机。

平移效果很好,旋转相机也可以-只要只旋转一个轴即可。
当摄像头朝下或朝上并且向左或向右旋转时,它不仅绕着该轴旋转,而且绕着看起来很奇怪的第二根轴旋转。

我尝试移动枢轴点,但这没有帮助。

这是我用来旋转和移动相机的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
fileprivate func translateCamera(_ x: Float, _ y: Float)
{
    if let cameraNode = self.cameraNode
    {
        let moveX = x * 2 // TODO Settings.speed
        let moveY = -y * 2 // TODO Settings.speed

        let position = SCNVector3Make(moveX, 0, moveY)
        let rotatedPosition = self.position(position, cameraNode.rotation)
        let translated = SCNMatrix4Translate(cameraNode.transform, rotatedPosition.x, rotatedPosition.y, rotatedPosition.z)

        cameraNode.transform = translated

        if cameraNode.position.y < 25
        {
            cameraNode.position.y = 25
        }
    }
}

fileprivate func position(_ position: SCNVector3, _ rotation: SCNVector4) -> SCNVector3
{
    if rotation.w == 0
    {
        return position
    }

    let gPosition: GLKVector3 = SCNVector3ToGLKVector3(position)
    let gRotation = GLKMatrix4MakeRotation(rotation.w, rotation.x, rotation.y, rotation.z)
    let r = GLKMatrix4MultiplyVector3(gRotation, gPosition)

    return SCNVector3FromGLKVector3(r)
}

fileprivate func rotateCamera(_ x: Float, _ y: Float)
{
    if let cameraNode = self.cameraNode
    {
        let moveX = x / 50.0
        let moveY = y / 50.0

        let rotated = SCNMatrix4Rotate(SCNMatrix4Identity, -moveX, 0, 1, 0)
        cameraNode.transform = SCNMatrix4Mult(rotated, cameraNode.transform)

        let rotated2 = SCNMatrix4Rotate(SCNMatrix4Identity, moveY, 1, 0, 0)
        cameraNode.transform = SCNMatrix4Mult(rotated2, cameraNode.transform)
    }
}

将摄像机"锁定"以使其仅绕所需轴移动的正确方法是什么?我制作了一个显示该行为的小视频:

https://www.youtube.com/watch?v=ctK-hnw7JxY

  • 只要只旋转一根轴,它就可以正常工作。
  • 但是,一旦第二根轴旋转,它也会向侧面倾斜。

创建一个空节点,并将cameraNode添加为其子节点。旋转x的cameraNode和y的emptyNode。