【问题标题】:Show larger model Swift SceneKit显示更大的模型 Swift SceneKit
【发布时间】:2016-12-16 01:35:32
【问题描述】:

如何“放大”模特的脸?我想要达到的效果是让模特的脸占据整个圆圈。 Link to pic

我尝试将 cameraNode.positionZ 值更改为小于 2,但随后模型剪辑。我也尝试过更改cameraNode.camera.zNearcameraNode.camera.zFar,但没有任何显示。 cameraNode.camera.xFovcameraNode.camera.yFov 如果我不更改它们,它们都是 0.0

    // Get the model height
    var minPoint = SCNVector3Zero
    var maxPoint = SCNVector3Zero
    modelNode.getBoundingBoxMin(&minPoint, max: &maxPoint)
    let modelHeight = maxPoint.y - minPoint.y

    // Remove old camera
    self.cameraNode.removeFromParentNode()
    cameraNode = SCNNode()

    // Set up a new camera
    cameraNode.camera = SCNCamera()
    cameraNode.position = SCNVector3(0, modelHeight, 2)

    // Set up LookAtConstraint
    let constraint = SCNLookAtConstraint(target: SCNNode())
    constraint.target.position = SCNVector3(0, modelHeight, 0)
    cameraNode.constraints = [constraint]

    self.rootNode.addChildNode(cameraNode)

【问题讨论】:

    标签: swift scenekit


    【解决方案1】:

    相机使用细分:


    Camera.position:

    这会调整相机的位置(显然)。

    这就像在“真实世界”中移动相机一样。


    Camera.zNear:

    这控制对象何时被剪裁。

    为什么?

    在现实世界中,如果您尝试将相机穿过墙壁.. 它不会起作用!

    不过在SceneKit 中你可以这样做,但是如果你试图将相机穿过墙壁会发生什么?

    相机应该坏掉吗?

    墙破了,摄像头要穿过去吗?

    墙靠近相机时是否应该看不见?

    第三个选择是 SceneKit 使用的。

    zNear 告诉相机物体需要多近才能变得不可见。


    Camera.zFar:

    这是为了优化 SceneKit。

    如果你有一个大场景并且相机可以看到所有东西,即使它很远(虽然它真的很小)它会占用额外的内存。

    这告诉相机它可以看到多远。


    Camera.xFov/Camera.yFov:

    这些有点难以理解。

    这些用于控制您可以看到多大的角度,例如, 人眼可以看到大约 180 度,而您的默认相机可以看到大约 60 度。

    这里是一个例子:(相机的位置不动)

    这将是 xyFov 上的一个小角度:

    这将是 xyFov 上更“正常”的角度: 正如您现在所看到的,您可以看到摄像机周围的一些空间,其 xyFov 更大。

    还有一个非常大的 xyFov: 即使您可能在静态图像中看到它,这台相机也可以清楚地看到它旁边的东西。它可能看起来没那么糟糕,但如果你为任何东西制作动画,它看起来超级“鱼眼”。


    现在,根据这些知识:

    如果您将相机放置在不会剪辑场景的位置,然后将 xyFov 设置为 20 左右,然后反复调整该数字直到正确,您可能会得到您想要的。

    希望这会有所帮助!

    【讨论】:

    【解决方案2】:

    说实话,我对你的代码应该做什么有点困惑。但有时它有助于思考不同的方向。我主要使用这样的东西:

        //MARK: Init
    override init() {
        super.init()
        self.makeCameraFocusNode()
        self.makeCamera()
    }
    
    //MARK: Setup
    func makeCameraFocusNode() {
        self.cameraHeight = 0
        self.cameraFocusNode = SCNNode.init()
        self.cameraFocusNode?.position = SCNVector3Make(0, 0, 0)
        self.addChildNode(self.cameraFocusNode!)
    }
    
    /* Default Setup for camera. */
    func makeCamera() {
        self.pointOfView = SCNNode.init()
        self.pointOfView?.camera = SCNCamera.init()
        self.pointOfView?.position = SCNVector3Make(13, 16, 13)
    
        let constrain : SCNLookAtConstraint = SCNLookAtConstraint.init(target: self.cameraFocusNode)
        constrain.isGimbalLockEnabled = true
        self.pointOfView?.constraints = [constrain]
        self.cameraFocusNode?.addChildNode(self.pointOfView!)
    }
    

    在那里我设置了一个节点,相机必须聚焦。当您将相机添加到该焦点节点时,您可以通过在焦点节点上执行 SCNAction 来移动相机。就这么简单:

        func moveUp(toHeight: Float) {
        let position = SCNVector3Make((self.cameraFocusNode?.position.x)!,
                                      toHeight,
                                      (self.cameraFocusNode?.position.z)!)
        self.cameraFocusNode?.runAction(SCNAction.move(to: position, duration: 0.3))
    }
    

    在此示例中,仅当您为该方法指定新高度时,相机的高度才会发生变化。但是现在我还没有弄清楚如何在相机本身上使用动作。这对于复杂的相机移动会更容易。但是仅仅移动焦点节点可能有助于缩放。

    【讨论】:

      猜你喜欢
      • 2018-01-13
      • 2018-03-13
      • 2016-02-29
      • 2017-11-19
      • 2016-12-13
      • 2019-07-16
      • 1970-01-01
      • 2020-06-04
      • 2017-11-18
      相关资源
      最近更新 更多