SceneKit的物理引擎是很強(qiáng)大的, 你只需要告訴引擎你想使用的物理學(xué)效果, 接下來的一切都有引擎來完成, 模擬重力, 檢測(cè)碰撞等.
在進(jìn)行物理仿真模擬之前先來解釋下幾個(gè)概念.
首先, 力的作用的相互的, 當(dāng)兩個(gè)物體之間進(jìn)行力的作用時(shí)情況是多樣的, 可能兩者都有運(yùn)動(dòng), 也可能只有其中的一個(gè)會(huì)運(yùn)動(dòng), 試想, 如果拿一個(gè)雞蛋去碰撞一塊很大的石頭, 很顯然, 雞蛋碎了, 石頭不會(huì)有任何變化(以我們?nèi)庋蹃碛^察, 石頭是不會(huì)有變化的, 實(shí)質(zhì)上石頭是有變化的), 物理仿真中的type就是為了定義當(dāng)一個(gè)物體受到力的作用時(shí)該如何去響應(yīng).
static
靜態(tài)物體不會(huì)移動(dòng):當(dāng)其他物體可能與這些物體碰撞時(shí)横朋,靜態(tài)物體本身不受模擬中的任何力和碰撞的影響衷恭。 你可以使用這種類型的墻壁和大塊不動(dòng)的巨石脊髓。
dynamic
動(dòng)力體受力量和碰撞的影響; 您可以使用這種類型的東西绝葡,如活動(dòng)椅子,桌子和杯子播瞳。
kinematic
運(yùn)動(dòng)體類似于靜態(tài)體怀挠,因?yàn)樗鼈円膊皇苡绊?br>
力量和碰撞 但是琢蛤,您可以移動(dòng)這些類型,并且它們也可能與動(dòng)態(tài)主體相沖突蜂嗽。 您可以使用這種類型的身體苗膝,例如移動(dòng)電梯或可以打開和關(guān)閉的門。
在SceneKit中所有的物理對(duì)象都是SCNPhysicsBody
, 然后需要把該對(duì)象綁定到SCNNode的physicsBody實(shí)例屬性, 然后物理引擎就可以進(jìn)行仿真模擬了.
在上一節(jié)中, 我們使用Node去管理一個(gè)幾何體, 同樣, SCNPhysicsBody對(duì)象也管理者物理引擎, 也就是說, 此時(shí)我們的node擁有一個(gè)可以做物理仿真模擬的幾何體
在let geometryNode = SCNNode(geometry: geometry)
下面添加如下代碼
geometryNode.physicsBody = SCNPhysicsBody(type: .dynamic, shape: nil)
創(chuàng)建物理體時(shí)植旧,您可以指定物體應(yīng)具有的類型和形狀辱揭。 如果為nil离唐,Scene Kit將根據(jù)節(jié)點(diǎn)的幾何形狀自動(dòng)生成一個(gè)形狀。
接下來運(yùn)行工程, 千萬不要眨眼, 你會(huì)發(fā)現(xiàn)一個(gè)立方體很快的掉落下來, 然后消失.
接下來我們需要修改下視角, 讓物體受重力作用更明顯一些.
修改下面的代碼
cameraNode.position = SCNVector3(x: 0, y: -5, z: 10)
再次運(yùn)行, 會(huì)看到一個(gè)物體從頂部掉下來
自由落體實(shí)現(xiàn)了, 接下來我們給該物體添加一個(gè)向上的推力
讓物體實(shí)現(xiàn)一個(gè)拋物線的自由落體運(yùn)動(dòng)
在geometryNode.physicsBody = SCNPhysicsBody(type: .dynamic, shape: nil)
下面添加如下代碼
這個(gè)設(shè)置我們的物體要移動(dòng)的重點(diǎn)位置, 下面三個(gè)值得意思是, x為0, 代表從中心帶開始運(yùn)動(dòng), y值為正數(shù), 代表向上, z為0代表我們看的視角的深度不會(huì)變, 如果是負(fù)數(shù), 則會(huì)發(fā)現(xiàn)在運(yùn)動(dòng)過程中, 物體越來越小, 如果為正, 則發(fā)現(xiàn)在運(yùn)動(dòng)過程中物體則會(huì)運(yùn)來越大
let force = SCNVector3(x: 0, y: 15 , z: 0)
作用力的位置
let position = SCNVector3(x: 0.05, y: 0.05, z: 0.05)
給節(jié)點(diǎn)上的幾何體添加一個(gè)作用力, 當(dāng)您向物理機(jī)構(gòu)施加力量時(shí)问窃,您可以使用applyForce(_:atPosition:impluse :)亥鬓,并將SCNVector3的實(shí)例傳遞給要施加該力的力和位置,以及是否強(qiáng)制將被用作沖動(dòng)泡躯。您應(yīng)用的力將影響物理體的線性和角加速度贮竟。
geometryNode.physicsBody?.applyForce(force, at: position, asImpulse: true)
注意
剛剛為了觀察自由落體效果, 我們把視角修改了, 讓物體從頂部掉落, 現(xiàn)在需要把它再改回來, 讓其從底部出現(xiàn)
cameraNode.position = SCNVector3(x: 0, y: 5, z: 10)
OK, 運(yùn)行工程, 會(huì)發(fā)現(xiàn)有一個(gè)幾何體從底部向上拋, 然后在做自由落體運(yùn)動(dòng)
關(guān)與力的一些解釋
物理仿真中的力使用的是向量表示的, 向量是有方向有距離的一個(gè)值.
運(yùn)行使用真機(jī), 模擬器很卡