前言
SceneKit
使用SCNPhysicsWorld
來管理這種物理模擬饲鄙,讓物體的碰撞、連接圆雁、掉落等具有真實感忍级。
SCNPhysicsBody
:想要一個SCNNode參與到物理模擬中,只需要給node.physicsBod
y賦值一個合適的值,SCNPhysicsBody
有三種類型
-
dynamic
: 動態(tài)的物體伪朽,受力的影響(applyForce)轴咱。 -
static
: 靜態(tài)的物體,不受力的影響,且不能移動驱负。適合場景中地面嗦玖、墻體等。 -
kinematic
: 不受碰撞跃脊、力影響宇挫,在空間變換中,會對dynamic
的物體產(chǎn)生力的影響酪术。
實踐
override func viewDidLoad() {
super.viewDidLoad()
let sceneView = SCNView(frame: view.bounds)
sceneView.backgroundColor = UIColor.black
sceneView.scene = SCNScene()
sceneView.allowsCameraControl = true
sceneView.showsStatistics = true
//設(shè)置運動速度
sceneView.scene?.physicsWorld.speed = 5
view.addSubview(sceneView)
//添加照相機(jī)
let cameraNode = SCNNode()
cameraNode.camera = SCNCamera()
cameraNode.position = SCNVector3(0, 10, 20)
// 因為要顯示地板 多以要傾斜一點角度(繞X軸旋轉(zhuǎn)器瘪,繞哪個軸旋轉(zhuǎn)哪個軸的值就為1)
cameraNode.rotation = SCNVector4(1, 0, 0, -Double.pi * 0.1)
cameraNode.camera?.automaticallyAdjustsZRange = true
sceneView.scene?.rootNode.addChildNode(cameraNode)
//添加地板
let floorNode = SCNNode()
let floor = SCNFloor()
floor.firstMaterial?.diffuse.contents = "floor.jpg"
floorNode.geometry = floor
// 如果沒有這一行代碼翠储,柱狀物體會直接下沉到不見為止
floorNode.physicsBody = SCNPhysicsBody.static()
sceneView.scene?.rootNode.addChildNode(floorNode)
// 添加動態(tài)事物
for _ in 0..<10 {
let box = SCNBox(width: 0.5, height: 3, length: 1, chamferRadius: 0)
box.firstMaterial?.diffuse.contents = "1.PNG"
let node = SCNNode(geometry: box)
node.physicsBody = SCNPhysicsBody.dynamic()
node.position = SCNVector3(Float(arc4random_uniform(5)) - 2, 1.5, Float(arc4random_uniform(5)))
sceneView.scene?.rootNode.addChildNode(node)
}
// 繼續(xù)添加動態(tài)事物
for _ in 0..<5 {
let node = SCNNode()
let sphere = SCNSphere(radius: 1)
sphere.firstMaterial?.diffuse.contents = "sun.jpg"
node.geometry = sphere
node.physicsBody = SCNPhysicsBody.dynamic()
node.position = SCNVector3(Float(arc4random_uniform(5)) - 2, 10, Float(arc4random_uniform(5)))
sceneView.scene?.rootNode.addChildNode(node)
}
}
-
效果圖