SceneKit_入門(mén)01_旋轉(zhuǎn)人物
SceneKit_入門(mén)02_如何創(chuàng)建工程
SceneKit_入門(mén)03_節(jié)點(diǎn)
SceneKit_入門(mén)04_燈光
SceneKit_入門(mén)05_照相機(jī)
SceneKit_入門(mén)06_行為動(dòng)畫(huà)
SceneKit_入門(mén)07_幾何體
SceneKit_入門(mén)08_材質(zhì)
SceneKit_入門(mén)09_物理身體
SceneKit_入門(mén)10_物理世界
SceneKit_入門(mén)11_粒子系統(tǒng)
SceneKit_入門(mén)12_物理行為
SceneKit_入門(mén)13_骨骼動(dòng)畫(huà)
SceneKit_中級(jí)01_模型之間的過(guò)渡動(dòng)畫(huà)
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)畫(huà)事件
SceneKit_高級(jí)01_GLSL
SceneKit_高級(jí)02_粒子系統(tǒng)深入研究
SceneKit_高級(jí)03_自定義力
SceneKit_高級(jí)04_自定義場(chǎng)景過(guò)渡效果
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_彈幕來(lái)襲
SceneKit_大神03_navigationbar上的3D文字
本節(jié)學(xué)習(xí)任務(wù)
掌握SceneKit游戲框架中的物理行為。
正式開(kāi)始
- 物理行為的定義
定義一個(gè)或多個(gè)物理組織的高級(jí)行為箕憾,行為包括連接多個(gè)物體的關(guān)節(jié)僚碎,可以讓他們一起移動(dòng),也可以定義車輪這種行為洲胖,讓身體想騎車一樣滾動(dòng)休傍。
- 相關(guān)的類(SCNPhysicsBehavior)
你不不會(huì)直接使用這個(gè)類,你實(shí)例化這個(gè)類的一個(gè)子類的定義你想要的行為,并且添加到物理世界去搭儒。
接下來(lái),我們介紹這個(gè)類都有哪些屬性
我去在文檔中找,只要這樣一句話
SCNPhysicsBehavior is an abstract class that represents a behavior in the physics world.
看來(lái)這個(gè)類是物理行為的一個(gè)基類
雖然這個(gè)類我們沒(méi)法沒(méi)法它的屬性,但是它有四個(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)昌妹。滑塊關(guān)節(jié)像電機(jī)一樣工作握截,在兩個(gè)物理身體之間施加力或轉(zhuǎn)矩飞崖。
d.SCNPhysicsVehicle
作用: 組合物理身體成為類似汽車底板的東西,你可以控制汽車的駕駛,剎車和加速。使用SCNPhysicsVehicleWheel 對(duì)象定義車輪的外觀和物理屬性谨胞。
- 使用步驟
- 創(chuàng)建一個(gè)或者多個(gè)SCNPhysicsBody 綁定他們到每個(gè)節(jié)點(diǎn)上,作為物理行為的執(zhí)行者固歪。
- 創(chuàng)建配置上面列表中的行為
- 使用物理世界(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 物理身體沒(méi)啥好說(shuō)的.
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)建工程
2.添加SceneKit框架
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:@"庫(kù)"];
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)行:
結(jié)合上一節(jié)的內(nèi)容可以制作下面的效果:
思路很簡(jiǎn)單灰署,給每個(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é)
由于本篇作為入門(mén)篇,就先做這樣一個(gè)小的練習(xí),幫助大家理解一下概念,后面在高級(jí)篇的時(shí)候,我會(huì)把其他幾個(gè)的使用方法詳細(xì)進(jìn)行講解判帮。
代碼庫(kù),聽(tīng)說(shuō)經(jīng)常給人點(diǎn)贊都當(dāng)老板了!