SceneKit 物理碰撞

前言

SceneKit使用SCNPhysicsWorld來管理這種物理模擬,讓物體的碰撞、連接、掉落等具有真實(shí)感。
SCNPhysicsBody:想要一個(gè)SCNNode參與到物理模擬中,只需要給node.physicsBody賦值一個(gè)合適的值,SCNPhysicsBody有三種類型

  • dynamic: 動(dòng)態(tài)的物體,受力的影響(applyForce)。
  • static: 靜態(tài)的物體,不受力的影響,且不能移動(dòng)。適合場(chǎng)景中地面、墻體等。
  • kinematic: 不受碰撞、力影響,在空間變換中,會(huì)對(duì)dynamic的物體產(chǎn)生力的影響。
實(shí)踐
 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è)置運(yùn)動(dòng)速度
        sceneView.scene?.physicsWorld.speed = 5
        view.addSubview(sceneView)
    
        //添加照相機(jī)
        let cameraNode = SCNNode()
        cameraNode.camera = SCNCamera()
        cameraNode.position = SCNVector3(0, 10, 20)
        // 因?yàn)橐@示地板 多以要傾斜一點(diǎn)角度(繞X軸旋轉(zhuǎn),繞哪個(gè)軸旋轉(zhuǎn)哪個(gè)軸的值就為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
        // 如果沒有這一行代碼,柱狀物體會(huì)直接下沉到不見為止
        floorNode.physicsBody = SCNPhysicsBody.static()
        sceneView.scene?.rootNode.addChildNode(floorNode)
        
        // 添加動(dòng)態(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ù)添加動(dòng)態(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)
        }
}
  • 效果圖


    碰撞.gif
碰撞.gif
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 相關(guān) 到底有多強(qiáng)?蘋果的增強(qiáng)現(xiàn)實(shí)框架:ARKitARKit進(jìn)階:材質(zhì)ARKit實(shí)戰(zhàn):如何實(shí)現(xiàn)任意門 寫在前面 AR...
    皮皮Warrior閱讀 2,815評(píng)論 1 16
  • SceneKit的物理引擎是很強(qiáng)大的, 你只需要告訴引擎你想使用的物理學(xué)效果, 接下來的一切都有引擎來完成, 模擬...
    冰三尺閱讀 1,540評(píng)論 0 0
  • 首先要熟悉一些基本的力學(xué)名詞及相關(guān)公式 剛體(Rigidbody):剛體是指在運(yùn)動(dòng)中和受到力的作用后,形狀和大小不...
    FLY旳影子閱讀 12,184評(píng)論 0 11
  • 平臺(tái):fortiweb 類型:虛擬機(jī)鏡像 軟件包:linux basic software Fortinet se...
    ITknight閱讀 1,152評(píng)論 0 0
  • java存在三種方法交換變量值 1.中間變量 2.算術(shù)運(yùn)算 3.位運(yùn)算 其中第三種面試???。
    wkhuahuo閱讀 284評(píng)論 0 1

友情鏈接更多精彩內(nèi)容