显示较大型号Swift SceneKit

时间:2016-08-09 21:00:39

标签: swift scenekit

我该怎么做"缩放"在模特脸上?我想要实现的效果是模型的面部占据了整个圆圈。 Link to pic

我尝试将cameraNode.position Z 值更改为小于 2 ,但随后是模型剪辑。我也试过改变cameraNode.camera.zNear& cameraNode.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)

2 个答案:

答案 0 :(得分:1)

相机使用情况细分:

Camera.position

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

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

Camera.zNear

这可以控制何时剪切对象。

为什么?

在现实世界中,如果您尝试将相机移动到墙上......它将无效!

然而,在SceneKit你可以做到这一点,但是如果你试图将相机移到墙上会发生什么呢?

相机是否应该断开?

墙壁破裂且相机是否通过?

当墙壁靠近相机时,墙壁是不可见的吗?

第三种选择是SceneKit使用的。

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

Camera.zFar

这是为了优化SceneKit。

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

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

Camera.xFov / Camera.yFov

理解它们有点棘手。

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

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

这对xyFov来说是个小角度: small xyFov

这对xyFov来说是一个更“正常”的角度: normal xyFov 正如您现在所看到的,您可以看到相机周围的一些房间有更大的xyFov。

并且有一个疯狂的大xyFov: large xyFov 即使你可以在静态图像中看到它,这个相机也能清楚地看到旁边的东西。它可能看起来不那么糟糕,但如果你动画任何东西,它看起来超级“鱼眼”。

现在,基于这些知识:

如果你将相机放在不剪辑场景的位置,你可能会得到你想要的东西,然后将你的xyFov设置为20,然后玩这个数字,直到它是正确的。

希望这有帮助!

答案 1 :(得分:0)

老实说,我对你的代码应该做些什么有点困惑。但有时候思考一个不同的方向会有所帮助。我大多使用这样的东西:

    //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))
}

在此示例中,只要您为该方法赋予新高度,相机的高度就会发生变化。但是现在我还没弄明白如何在相机上使用Actions。对于复杂的相机移动,这将更容易。但只需移动焦点节点就可以进行缩放。