SceneKit_入門12_物理行為

SceneKit_入門01_旋轉(zhuǎn)人物
SceneKit_入門02_如何創(chuàng)建工程
SceneKit_入門03_節(jié)點(diǎn)
SceneKit_入門04_燈光
SceneKit_入門05_照相機(jī)
SceneKit_入門06_行為動(dòng)畫
SceneKit_入門07_幾何體
SceneKit_入門08_材質(zhì)
SceneKit_入門09_物理身體
SceneKit_入門10_物理世界
SceneKit_入門11_粒子系統(tǒng)
SceneKit_入門12_物理行為
SceneKit_入門13_骨骼動(dòng)畫
SceneKit_中級(jí)01_模型之間的過渡動(dòng)畫
SceneKit_中級(jí)02_SCNView 詳細(xì)講解
SceneKit_中級(jí)03_切換照相機(jī)視角
SceneKit_中級(jí)04_約束的使用
SceneKit_中級(jí)05_力的使用
SceneKit_中級(jí)06_場(chǎng)景的切換
SceneKit_中級(jí)07_動(dòng)態(tài)修改屬性
SceneKit_中級(jí)08_陰影詳解
SceneKit_中級(jí)09_碰撞檢測(cè)
SceneKit_中級(jí)10_濾鏡效果制作
SceneKit_中級(jí)11_動(dòng)畫事件
SceneKit_高級(jí)01_GLSL
SceneKit_高級(jí)02_粒子系統(tǒng)深入研究
SceneKit_高級(jí)03_自定義力
SceneKit_高級(jí)04_自定義場(chǎng)景過渡效果
SceneKit_高級(jí)05 檢測(cè)手勢(shì)點(diǎn)擊到節(jié)點(diǎn)
SceneKit_高級(jí)06_加載頂點(diǎn)、紋理、法線坐標(biāo)
SceneKit_高級(jí)07_SCNProgram用法探究
SceneKit_高級(jí)08_天空盒子制作
SceneKit_高級(jí)09_霧效果
SceneKit_大神01_掉落的文字
SceneKit_大神02_彈幕來襲
SceneKit_大神03_navigationbar上的3D文字

讓學(xué)習(xí)成為一種習(xí)慣

本節(jié)學(xué)習(xí)任務(wù)

掌握SceneKit游戲框架中的物理行為。

正式開始

  • 物理行為的定義

定義一個(gè)或多個(gè)物理組織的高級(jí)行為,行為包括連接多個(gè)物體的關(guān)節(jié),可以讓他們一起移動(dòng),也可以定義車輪這種行為,讓身體想騎車一樣滾動(dòng)。

  • 相關(guān)的類(SCNPhysicsBehavior)

你不不會(huì)直接使用這個(gè)類,你實(shí)例化這個(gè)類的一個(gè)子類的定義你想要的行為,并且添加到物理世界去。

接下來,我們介紹這個(gè)類都有哪些屬性

我去在文檔中找,只要這樣一句話

SCNPhysicsBehavior is an abstract class that represents a behavior in the physics world.

看來這個(gè)類是物理行為的一個(gè)基類

雖然這個(gè)類我們沒法沒法它的屬性,但是它有四個(gè)子類,我們就從它的四個(gè)子類入手,去發(fā)掘子類的作用。

  • SCNPhaysicBehavior 子類的介紹

a. SCNPhysicsHingeJoint
作用:

連接兩個(gè)物體,并允許他們?cè)谝粋€(gè)單一的軸上圍繞對(duì)方轉(zhuǎn)動(dòng)

b.SCNPhysicsBallSocketJoint
作用:

連接兩個(gè)物體,并允許他們?cè)谌魏畏较蛏蠂@對(duì)方轉(zhuǎn)動(dòng)

c.SCNPhysicsSliderJoint
作用:

連接兩個(gè)物體,并允許他們彼此之間滑動(dòng)或旋轉(zhuǎn)?;瑝K關(guān)節(jié)像電機(jī)一樣工作,在兩個(gè)物理身體之間施加力或轉(zhuǎn)矩。

d.SCNPhysicsVehicle
作用: 組合物理身體成為類似汽車底板的東西,你可以控制汽車的駕駛,剎車和加速。使用SCNPhysicsVehicleWheel 對(duì)象定義車輪的外觀和物理屬性。

  • 使用步驟
  1. 創(chuàng)建一個(gè)或者多個(gè)SCNPhysicsBody 綁定他們到每個(gè)節(jié)點(diǎn)上,作為物理行為的執(zhí)行者。
  2. 創(chuàng)建配置上面列表中的行為
  3. 使用物理世界(SCNPhysicsWorld)的方法addBehavior: 添加到行為到物理世界中去。

在進(jìn)入一下一個(gè)話題,有必要介紹一個(gè)方法

@interface SCNPhysicsHingeJoint : SCNPhysicsBehavior

+ (instancetype)jointWithBodyA:(SCNPhysicsBody *)bodyA axisA:(SCNVector3)axisA anchorA:(SCNVector3)anchorA bodyB:(SCNPhysicsBody *)bodyB axisB:(SCNVector3)axisB anchorB:(SCNVector3)anchorB;

參數(shù):

bodyA bodyB 物理身體沒啥好說的.
axisA axisB 沿著哪個(gè)軸轉(zhuǎn)動(dòng),比如(1,0,0)沿著X軸轉(zhuǎn)動(dòng)
anchorA anchorB 錨點(diǎn)A,錨點(diǎn)B。有些幾何體的錨點(diǎn)不在幾何體的中心,比如字體的這樣幾何體,它的錨點(diǎn)在左下角,使用時(shí)請(qǐng)注意一下。

走進(jìn)代碼的世界

1.創(chuàng)建工程

學(xué)習(xí)是一件很開心的事情

2.添加SceneKit框架

讓學(xué)習(xí)成為一種習(xí)慣

3.添加SCNView到View中去

 SCNView *scnView  = [[SCNView alloc]initWithFrame:self.view.bounds];
scnView.backgroundColor = [UIColor blackColor];
scnView.scene = [SCNScene scene];
scnView.allowsCameraControl = TRUE; // 允許手動(dòng)控制
[self.view addSubview:scnView];

4.添加照相機(jī)到場(chǎng)景中去

SCNCamera *camera = [SCNCamera camera];
SCNNode *cameraNode = [SCNNode node];
cameraNode.camera = camera;    camera.automaticallyAdjustsZRange = TRUE;
cameraNode.position = SCNVector3Make(0, 0, 10);
[scnView.scene.rootNode addChildNode:cameraNode];

5.添加四個(gè)文字幾何對(duì)象模型,并且設(shè)置他們的身體為動(dòng)態(tài)身體

SCNNode *text1 = [self createTextNodeWithString:@"庫"];
SCNNode *text2 = [self createTextNodeWithString:@"走"];
SCNNode *text3 = [self createTextNodeWithString:@"天"];
SCNNode *text4 = [self createTextNodeWithString:@"涯"];

[scnView.scene.rootNode addChildNode:text1];
[scnView.scene.rootNode addChildNode:text2];
[scnView.scene.rootNode addChildNode:text3];
[scnView.scene.rootNode addChildNode:text4];

// 創(chuàng)建文字的函數(shù)
-(SCNNode*)createTextNodeWithString:(NSString*)string{
SCNText *text = [SCNText textWithString:string extrusionDepth:1];
text.font = [UIFont systemFontOfSize:1];
text.firstMaterial.diffuse.contents = @"1.PNG";
SCNNode *node =[SCNNode nodeWithGeometry:text];
// 創(chuàng)建一個(gè)物理身體,使用指定的形狀
node.physicsBody = [SCNPhysicsBody bodyWithType:SCNPhysicsBodyTypeDynamic shape:[SCNPhysicsShape shapeWithGeometry:[SCNBox boxWithWidth:1 height:1 length:1 chamferRadius:0]options:nil]];
return node;
}

6.創(chuàng)建物理身體之前的物理行為

SCNPhysicsHingeJoint *joint0 = [SCNPhysicsHingeJoint jointWithBodyA:boxNode.physicsBody axisA:SCNVector3Make(1, 0, 0) anchorA:SCNVector3Make(0, -0.5, 0) bodyB:text1.physicsBody axisB:SCNVector3Make(1, 0, 0) anchorB:SCNVector3Make(0.5, 1, 0)];
SCNPhysicsHingeJoint *joint1 = [SCNPhysicsHingeJoint jointWithBodyA:text1.physicsBody axisA:SCNVector3Make(1, 0, 0) anchorA:SCNVector3Make(0, -0.5, 0) bodyB:text2.physicsBody axisB:SCNVector3Make(1, 0, 0) anchorB:SCNVector3Make(0, 0.5, 0)];
SCNPhysicsHingeJoint *joint2 = [SCNPhysicsHingeJoint jointWithBodyA:text2.physicsBody axisA:SCNVector3Make(1, 0, 0) anchorA:SCNVector3Make(0, -0.5, 0) bodyB:text3.physicsBody axisB:SCNVector3Make(1, 0, 0) anchorB:SCNVector3Make(0, 0.5, 0)];
SCNPhysicsHingeJoint *joint3 = [SCNPhysicsHingeJoint jointWithBodyA:text3.physicsBody axisA:SCNVector3Make(1, 0, 0) anchorA:SCNVector3Make(0, -0.5, 0) bodyB:text4.physicsBody axisB:SCNVector3Make(1, 0, 0) anchorB:SCNVector3Make(0, 0.5, 0)];

// 將物理行為添加物理世界中去
[scnView.scene.physicsWorld addBehavior:joint0];
[scnView.scene.physicsWorld addBehavior:joint1];
[scnView.scene.physicsWorld addBehavior:joint2];
[scnView.scene.physicsWorld addBehavior:joint3];

運(yùn)行:

讓學(xué)習(xí)成為一種習(xí)慣

結(jié)合上一節(jié)的內(nèi)容可以制作下面的效果:

一知半解的人,多不謙虛;見多識(shí)廣有本領(lǐng)的人,一定謙虛

思路很簡單,給每個(gè)字體幾何模型添加粒子特效,代碼如下:

    SCNParticleSystem *particleSystem = [SCNParticleSystem particleSystemNamed:@"fire.scnp" inDirectory:nil];
    // 創(chuàng)建一個(gè)節(jié)點(diǎn)添加粒子系統(tǒng)
    SCNNode *particleNode = [SCNNode node];
    [particleNode addParticleSystem:particleSystem];
    particleNode.position = SCNVector3Make(0.5, 0, 0);

[node addChildNode:particleNode];

總結(jié)

由于本篇作為入門篇,就先做這樣一個(gè)小的練習(xí),幫助大家理解一下概念,后面在高級(jí)篇的時(shí)候,我會(huì)把其他幾個(gè)的使用方法詳細(xì)進(jìn)行講解。


代碼庫,聽說經(jīng)常給人點(diǎn)贊都當(dāng)老板了!

最后編輯于
?著作權(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),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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