SceneKit 在移动相机时遇到测试错误
SceneKit hit test error while moving camera
我在初始化时这样声明我的相机:
defaultCameraNode.camera = SCNCamera()
defaultCameraNode.position = SCNVector3Make(0, 200, 500)
defaultCameraNode.camera?.zFar = 1000.0
defaultCameraNode.camera?.zNear = 10.0
defaultCameraNode.camera?.xFov = 30.0
defaultCameraNode.camera?.yFov = 30.0
scene.rootNode.addChildNode(defaultCameraNode)
sceneView.pointOfView = defaultCameraNode
defaultCameraNode.constraints = [SCNLookAtConstraint(target: rootNode)]
在此之后,我在 tapGesture 块中进行了命中测试:
let hitResults = sceneView.hitTest(sender.locationInView(sceneView), options: nil)
这个returns我要的,节点搞定了。
添加新相机并更改场景视角后
var cameraNode = SCNNode()
cameraNode.name = "cameraNode"
cameraNode.position = SCNVector3Make(position.x, position.y + 50.0, position.z + Float(radius * 3))
cameraNode.rotation = SCNVector4Make(1, 0, 0, -atan2f(20.0, 40.0))
var camera = SCNCamera()
camera.zNear = 0.0
camera.zFar = 1000.0
camera.xFov = 40.0
camera.yFov = 40.0
cameraNode.camera = camera
node.addChildNode(cameraNode)
SCNTransaction.begin()
SCNTransaction.setAnimationDuration(animationDuration)
sceneView.pointOfView = cameraNode
SCNTransaction.commit()
当相机位置发生变化时,我在 returns 0 长度数组之前使用了相同的命中测试,但在控制台上出现了这个错误:
SceneKit: error, error in _C3DUnProjectPoints
谁能帮我解决这个问题?
谢谢
您似乎正在将另一个节点(没有连接相机的节点)设置为场景视角。
看看你的代码。您要将相机节点附加到的节点是 cameraNode
,您要制作视点的节点是 node
(您要将相机节点添加到的节点)。
我开始了一个新的项目,一步步弄明白hittest什么时候出问题了。我没有在 Apple 官方文档中的任何地方找到它,但我的经验如下:
如果您想更改相机的位置或任何其他 属性,您可以通过将新相机添加到具有新位置、参数等的新节点来实现。然后设置 SCNView 的 pointOfView 属性,你可以像这样制作动画:
SCNTransaction.begin()
SCNTransaction.setAnimationDuration(2.0)
sceneView.pointOfView = cameraNode
SCNTransaction.commit()
这里有一点很重要:必须将持有新 SCNCamera 的节点添加到 SCNScene 的 rootView 中,否则(如果将其添加到 rootView 的 childNode 中)hittest 将给您一个错误,而不是您触摸的 SCNNode .
我在初始化时这样声明我的相机:
defaultCameraNode.camera = SCNCamera()
defaultCameraNode.position = SCNVector3Make(0, 200, 500)
defaultCameraNode.camera?.zFar = 1000.0
defaultCameraNode.camera?.zNear = 10.0
defaultCameraNode.camera?.xFov = 30.0
defaultCameraNode.camera?.yFov = 30.0
scene.rootNode.addChildNode(defaultCameraNode)
sceneView.pointOfView = defaultCameraNode
defaultCameraNode.constraints = [SCNLookAtConstraint(target: rootNode)]
在此之后,我在 tapGesture 块中进行了命中测试:
let hitResults = sceneView.hitTest(sender.locationInView(sceneView), options: nil)
这个returns我要的,节点搞定了。 添加新相机并更改场景视角后
var cameraNode = SCNNode()
cameraNode.name = "cameraNode"
cameraNode.position = SCNVector3Make(position.x, position.y + 50.0, position.z + Float(radius * 3))
cameraNode.rotation = SCNVector4Make(1, 0, 0, -atan2f(20.0, 40.0))
var camera = SCNCamera()
camera.zNear = 0.0
camera.zFar = 1000.0
camera.xFov = 40.0
camera.yFov = 40.0
cameraNode.camera = camera
node.addChildNode(cameraNode)
SCNTransaction.begin()
SCNTransaction.setAnimationDuration(animationDuration)
sceneView.pointOfView = cameraNode
SCNTransaction.commit()
当相机位置发生变化时,我在 returns 0 长度数组之前使用了相同的命中测试,但在控制台上出现了这个错误:
SceneKit: error, error in _C3DUnProjectPoints
谁能帮我解决这个问题? 谢谢
您似乎正在将另一个节点(没有连接相机的节点)设置为场景视角。
看看你的代码。您要将相机节点附加到的节点是 cameraNode
,您要制作视点的节点是 node
(您要将相机节点添加到的节点)。
我开始了一个新的项目,一步步弄明白hittest什么时候出问题了。我没有在 Apple 官方文档中的任何地方找到它,但我的经验如下: 如果您想更改相机的位置或任何其他 属性,您可以通过将新相机添加到具有新位置、参数等的新节点来实现。然后设置 SCNView 的 pointOfView 属性,你可以像这样制作动画:
SCNTransaction.begin()
SCNTransaction.setAnimationDuration(2.0)
sceneView.pointOfView = cameraNode
SCNTransaction.commit()
这里有一点很重要:必须将持有新 SCNCamera 的节点添加到 SCNScene 的 rootView 中,否则(如果将其添加到 rootView 的 childNode 中)hittest 将给您一个错误,而不是您触摸的 SCNNode .