ARKit – 在用户的电话方向上施加力量

我有以下代码创建一个SCNBox并在屏幕上拍摄它。 这可以工作,但只要我在任何其他方向转动手机,那么力量冲动就不会得到更新,它总是在相同的旧位置拍摄盒子。

这是代码:

@objc func tapped(recognizer :UIGestureRecognizer) { guard let currentFrame = self.sceneView.session.currentFrame else { return } / let box = SCNBox(width: 0.2, height: 0.2, length: 0.2, chamferRadius: 0) let material = SCNMaterial() material.diffuse.contents = UIColor.red material.lightingModel = .constant var translation = matrix_identity_float4x4 translation.columns.3.z = -0.01 let node = SCNNode() node.geometry = box node.geometry?.materials = [material] print(currentFrame.camera.transform) node.physicsBody = SCNPhysicsBody(type: .dynamic, shape: nil) node.simdTransform = matrix_multiply(currentFrame.camera.transform, translation) node.physicsBody?.applyForce(SCNVector3(0,2,-10), asImpulse: true) self.sceneView.scene.rootNode.addChildNode(node) } 

第26行是我施加力的地方,但它没有考虑用户当前的电话方向。 我该如何解决这个问题?

在第26行,你将一个常量向量传递给applyForce 。 该方法在世界空间中采用向量,因此传递常量向量意味着您始终在相同方向上施加力 – 如果您想要基于相机或其他指向的方向的方向,则需要根据该方向计算向量。

(新)SCNNode属性worldFront可能在这里certificate是有用的 – 它为您提供节点指向的方向,自动转换为世界空间,因此它对物理方法很有用。 (虽然你可能想要缩放它。)