本部分我们主要在Xcode通过原生方法实现一个小案例(发射一个火箭)掌握ARKit的physics特性。
首先下载基础工程,在此基础上进行开发:
https://pan.baidu.com/s/1-LOv4kvEy1oS8fQyoD1ALw 密码:vmv7
Step 1: 前提
在Xcode打开下载的项目,并build运行:
需要将physics body附加到SCNPhysicsBody中。SCNPhysicsBody是向节点添加物理模拟的对象。
SceneKit在渲染帧之前,对场景中具有附加物理实体的节点执行物理计算。这些计算包括重力、摩擦力和与其他物体的碰撞。基本上,在每个渲染帧之前,都要进行物理计算。
physics body有三种类型static, dynamic, and kinematic。
1.static:静态physics body类型不受力或碰撞的影响,不能移动。
2.dynamic:动态物理体是一种受力和碰撞影响的物理体。
3.kinematic:当你创造一个游戏,你需要用你的手指推一个方块。所以你创造了一个“隐形”的推砖器,它是由你的手指运动触发的。“隐形”块不受其他块的影响,但是“隐形”块在接触时移动其他块。kinematic物理体是一种不受力或碰撞影响的物理体,但它在运动时能引起影响其他物体的碰撞。
Step 2: 创建Physics Body
首先是检测到水平面,然后为其添加physics body
func update(_ node: inout SCNNode, withGeometry geometry: SCNGeometry, type: SCNPhysicsBodyType) {
let shape = SCNPhysicsShape(geometry: geometry, options: nil)
let physicsBody = SCNPhysicsBody(type: type, shape: shape)
node.physicsBody = physicsBody
}
在这个方法中,我们创建了一个SCNPhysicsShape对象。SCNPhysicsShape对象表示物理体的形状。当SceneKit检测到场景中SCNPhysicsBody对象的接触时,它使用你定义的物理形状。
接下来,创建一个SCNPhysicsBody对象,方法是将.static传递给类型参数,并将SCNPhysicsShape对象传递给shape参数。
添加静态Physics Body
在renderer(_:didAdd:for:)方法中为检测到的平面附加一个静态物理体。在添加planeNode作为子节点之前,调用以下方法:
update(&planeNode, withGeometry: plane, type: .static)
renderer(_:didAdd:for:)方法的完整代码如下:
fun