我该怎么做"缩放"在模特脸上?我想要实现的效果是模型的面部占据了整个圆圈。 Link to pic
我尝试将cameraNode.position
的 Z 值更改为小于 2 ,但随后是模型剪辑。我也试过改变cameraNode.camera.zNear
& cameraNode.camera.zFar
然后没有任何表现。如果我不做更改,cameraNode.camera.xFov
和cameraNode.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)
答案 0 :(得分:1)
相机使用情况细分:
Camera.position
:
调整相机的位置(显然)。
这就像在“真实世界”中移动相机一样。
Camera.zNear
:
这可以控制何时剪切对象。
为什么?
在现实世界中,如果您尝试将相机移动到墙上......它将无效!
然而,在SceneKit
你可以做到这一点,但是如果你试图将相机移到墙上会发生什么呢?
相机是否应该断开?
墙壁破裂且相机是否通过?
当墙壁靠近相机时,墙壁是不可见的吗?
第三种选择是SceneKit使用的。
zNear
告诉相机物体需要多近才能变得不可见。
Camera.zFar
:
这是为了优化SceneKit。
如果你有一个大场景,而且相机可以看到所有东西,即使它很远(虽然它真的很小),它会占用额外的内存。
这告诉相机可以看到多远。
Camera.xFov
/ Camera.yFov
:
理解它们有点棘手。
这些用于控制您可以看到的角度大小,例如, 人眼可以看到大约180度,而你的默认相机可以看到大约60度。
这是一个例子:(相机的位置不动)
这对xyFov来说是一个更“正常”的角度:
正如您现在所看到的,您可以看到相机周围的一些房间有更大的xyFov。
并且有一个疯狂的大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。对于复杂的相机移动,这将更容易。但只需移动焦点节点就可以进行缩放。