SCNNode 用法講解
學(xué)習(xí)目標(biāo)
理解游戲場(chǎng)景和節(jié)點(diǎn)的概念
你必須知道的概念
場(chǎng)景
簡(jiǎn)單的說(shuō),就是把人物,地圖,道具等放在一個(gè)空間里,組成一個(gè)大的環(huán)境,這個(gè)大的環(huán)境就被稱為場(chǎng)景!
節(jié)點(diǎn)
在SceneKit 節(jié)點(diǎn)是個(gè)抽象的概念,節(jié)是個(gè)看不見(jiàn),摸不到的東西,沒(méi)有幾何形狀,但是它有位置,以及自身坐標(biāo)系。通俗的講,在場(chǎng)景中創(chuàng)建一個(gè)添加節(jié)點(diǎn)后,你就可以在這個(gè)節(jié)點(diǎn)上放我們游戲元素了,比如人物模型,燈光,攝像機(jī)等等! 節(jié)點(diǎn)上可以添加節(jié)點(diǎn)的,每個(gè)節(jié)點(diǎn)都有自身坐標(biāo)系。如圖,我們把節(jié)點(diǎn)2添加到節(jié)點(diǎn)1上去。
實(shí)戰(zhàn)目標(biāo)
1.掌握如何添加節(jié)點(diǎn)到場(chǎng)景中 2.給節(jié)點(diǎn)綁定幾何物體 3.給節(jié)點(diǎn)添加節(jié)點(diǎn)
開(kāi)始吧
第一步.創(chuàng)建工程
我們已經(jīng)完成了創(chuàng)建工程的任務(wù),有的人就問(wèn)了,你不是要將SceneKit 游戲開(kāi)發(fā),怎么創(chuàng)建的是應(yīng)用工程,往下看,就這么任性!
第二步,添加我們的游戲框架到我們的控制器ViewController中
到這里,準(zhǔn)備工作已經(jīng)全部做完,開(kāi)始敲代碼啦!
第三步:創(chuàng)建一個(gè)游戲引擎專屬View視圖(SCNView)
@property(nonatomic,strong)SCNView *gameView; // 設(shè)置一個(gè)引用屬性
- (void)addSCNView{
// 1.創(chuàng)建一個(gè)邊長(zhǎng)為300 的視圖,放在屏幕中心
self.gameView = [[SCNView alloc]initWithFrame:CGRectMake(0, 0, 300, 300)];
self.gameView.center = CGPointMake(CGRectGetMidX(self.view.bounds), CGRectGetMidY(self.view.bounds));
// 2.設(shè)置背景顏色為黑色
self.gameView.backgroundColor = [UIColor blackColor];
// 3.添加到父視圖中去
[self.view addSubview:self.gameView];
}
- (void)viewDidLoad {
[super viewDidLoad];
[self addSCNView];
}
此刻運(yùn)行一下程序結(jié)果如下圖
第四步.添加場(chǎng)景
-(void)createScene{
SCNScene *scene = [SCNScene scene];
self.gameView.scene = scene;
}
此時(shí),如果你運(yùn)行程序,就和上面的效果一樣,沒(méi)有變化,因?yàn)槲覀兊膱?chǎng)景中什么都沒(méi)有。
第五步.添加節(jié)點(diǎn)
// 創(chuàng)建節(jié)點(diǎn),添加到scene的根節(jié)點(diǎn)上
SCNNode *node = [SCNNode node];
[scene.rootNode addChildNode:node];
提示:
scene.rootNode 有些朋友很好奇,為什么Scene也有一個(gè)節(jié)點(diǎn),上面說(shuō)個(gè),沒(méi)有節(jié)點(diǎn)你沒(méi)法放游戲元素上去,并且它有自身坐標(biāo)系,這就是為什么scene也有一個(gè)根節(jié)點(diǎn)的原因。
此時(shí)你運(yùn)行程序也和上面結(jié)果一樣,因?yàn)楣?jié)點(diǎn)沒(méi)有幾何形狀!
第六步.給節(jié)點(diǎn)綁定一個(gè)幾何形狀的物體
// 創(chuàng)建一個(gè)球體幾何綁定到節(jié)點(diǎn)上去
SCNSphere *sphere = [SCNSphere sphereWithRadius:0.5];
node.geometry = sphere;
運(yùn)行一下
此時(shí)我們已經(jīng)完成了實(shí)戰(zhàn)任務(wù)的1和2,繼續(xù)加油!
第七步.給節(jié)點(diǎn)添加節(jié)點(diǎn)
// 創(chuàng)建子節(jié)點(diǎn) 給子節(jié)點(diǎn)添加幾何形狀
SCNNode *childNode = [SCNNode node];
// 設(shè)置節(jié)點(diǎn)的位置
childNode.position = SCNVector3Make(-0.5, 0, 1);
// 設(shè)置幾何形狀,我們選擇立體字體
SCNText *text = [SCNText textWithString:@"讓學(xué)習(xí)成為一種習(xí)慣" extrusionDepth:0.03];
// 設(shè)置字體顏色
text.firstMaterial.diffuse.contents = [UIColor redColor];
// 設(shè)置字體大小
text.font = [UIFont systemFontOfSize:0.15];
// 給幾點(diǎn)綁定幾何物體
childNode.geometry = text;
[node addChildNode:childNode];
友情提示:
extrusionDepth 字體的深度 firstMaterial.diffuse.contents 不知道沒(méi)關(guān)系,后面會(huì)講的,單詞意思就可以理解.firstMaterial 第一個(gè)材質(zhì) diffuse 自身發(fā)散的contents內(nèi)容,我們?cè)O(shè)置為red 也可以設(shè)置圖片的!
我們用一鍵大招讓你自由旋轉(zhuǎn)物體
self.gameView.allowsCameraControl = true;
本節(jié)內(nèi)容已將講解完畢,趕緊動(dòng)手操練一遍吧!讓學(xué)習(xí)成為一種習(xí)慣