目前網(wǎng)上關(guān)于SceneKit的教程還是略少葫男。對(duì)于完全沒有任何游戲開發(fā)經(jīng)驗(yàn)的人(我)來(lái)說還是有一定挑戰(zhàn)。記下此篇崔列,加深理解梢褐。文中不保證完全正確,如有錯(cuò)誤赵讯,感謝斧正盈咳。
本文不會(huì)像教材一樣循規(guī)蹈矩,按部就班边翼。而是通過實(shí)例鱼响,用到了什么再去學(xué)習(xí)什么。
進(jìn)入正題:
Hello World
1讯私、創(chuàng)建工程
很多沒基礎(chǔ)的人(我)都栽在了第一步热押。Xcode->File->New->Project->Game->SceneKit->Run!
看到一個(gè)很炫酷的飛船斤寇,在原地不停轉(zhuǎn)圈桶癣。一看代碼,不明覺厲娘锁。于是就放棄了牙寞。
其實(shí)SceneKit沒有那么神秘,他就是一個(gè)framework莫秆,我們完全可以使用他间雀,就像使用任意一個(gè)framework一樣。
所以在這里镊屎,我們新建一個(gè)Single View App就可以了惹挟。
接下來(lái),如所有開發(fā)一樣缝驳,來(lái)開發(fā)一個(gè)
HelloWorld
作為學(xué)習(xí)的開頭吧连锯。
2、引入SceneKit
如前文所說用狱,就像我們使用任意一個(gè)framework运怖,我們首先引入它。
#import <SceneKit/SceneKit.h>
到這夏伊,我們先想一個(gè)概念:SceneKit
開發(fā)的東西摇展,自然應(yīng)該放在SceneKit
自己的容器上,SCNView
就是這個(gè)容器(記不住前綴的可以腦補(bǔ)英文發(fā)音s ~ c ~ n:scene)溺忧。它提供一個(gè)場(chǎng)景SCNScene
咏连,而我們具體的每一個(gè)組件都將放在場(chǎng)景里盯孙,這些組件便是節(jié)點(diǎn)SCNNode
。
于是我設(shè)定了以下3步來(lái)完成HelloWorld
祟滴。
- (void)viewDidLoad {
[super viewDidLoad];
[self makeScene];//1镀梭、初始化場(chǎng)景
[self makeNode]; //2踱启、初始化節(jié)點(diǎn)
[self rotation]; //3埠偿、旋轉(zhuǎn)節(jié)點(diǎn)
}
3冠蒋、初始化場(chǎng)景
查看API可以看到SCNView
其實(shí)就是一個(gè)基于UIView
的控件乾胶,我們可以像初始化UIView
一樣初始化它识窿。
#pragma mark - 初始化Scene
-(void)makeScene {
_scnView = [[SCNView alloc]initWithFrame:CGRectMake(0, 0, 300, 300)];
[self.view addSubview:_scnView];
_scnView.center = self.view.center;
[_scnView setBackgroundColor:[UIColor lightGrayColor]];
//設(shè)置場(chǎng)景
SCNScene *scene = [SCNScene new];
_scnView.scene = scene;
}
初始化SCNView
之后必須做的是給它設(shè)置一個(gè)場(chǎng)景喻频,SCNScene
可以像上文中一樣使用+(instancetype)new;
或者+(instancetype)scene;
初始化一個(gè)空?qǐng)鼍啊R部梢愿鶕?jù)資源創(chuàng)建場(chǎng)景+(instancetype)sceneNamed:(NSString *)name;
這個(gè)資源可以是.scn文件也可以是.dae文件锻煌。(然而我并不知道去哪找現(xiàn)成的資源宋梧,所以接下來(lái)的實(shí)例捂龄,都只能以圖形加顏色為主)
.scn文件可以->New->File->SceneKit Scene File創(chuàng)建
4跺讯、初始化節(jié)點(diǎn)
什么是節(jié)點(diǎn)刀脏?
A structural element of a scene graph, representing a position and transform in a 3D coordinate space, to which you can attach geometry, lights, cameras, or other displayable content.
場(chǎng)景里的元素愈污,表示在三維坐標(biāo)空間中的一個(gè)位置和變換,你可以將幾何暂雹、燈光杭跪、相機(jī)或其他可顯示的內(nèi)容附加到其中。
就是說系奉,節(jié)點(diǎn)本身不是東西缺亮,他只是代表一個(gè)位置和變換桥言。我們可以把具體的組件附加到節(jié)點(diǎn)上,從而使組件顯示出來(lái)号阿。
#pragma mark - 初始化Node
-(void)makeNode {
//創(chuàng)建節(jié)點(diǎn)
_node = [SCNNode new];
//將節(jié)點(diǎn)附加到根節(jié)點(diǎn)上
[_scnView.scene.rootNode addChildNode:_node];
//設(shè)置節(jié)點(diǎn)形狀
SCNText *text = [SCNText textWithString:@"Hello World" extrusionDepth:0.5];//extrusionDepth厚度
text.font = [UIFont systemFontOfSize:1];
_node.geometry = text;
//初始化光線(不是在目標(biāo)上直接設(shè)置而是新建節(jié)點(diǎn)來(lái)作為光源)
SCNNode *lightNode = [SCNNode node];
lightNode.light = [SCNLight light];
lightNode.light.type = SCNLightTypeOmni;
lightNode.position = SCNVector3Make(0, 10, 10);
[_scnView.scene.rootNode addChildNode:lightNode];
SCNNode *ambientLightNode = [SCNNode node];
ambientLightNode.light = [SCNLight light];
ambientLightNode.light.type = SCNLightTypeAmbient;
ambientLightNode.light.color = [UIColor darkGrayColor];
[_scnView.scene.rootNode addChildNode:ambientLightNode];
//初始化虛擬相機(jī)(主要是調(diào)整鏡頭)
SCNNode *cameraNode = [SCNNode node];
cameraNode.camera = [SCNCamera camera];
[_scnView.scene.rootNode addChildNode:cameraNode];
_scnView.allowsCameraControl = YES;
cameraNode.position = SCNVector3Make(0, 1, 12);
}
首先初始化node能真,并且把它添加到場(chǎng)景里粉铐。
接下來(lái)把“Hello World”附加給他卤档,這樣我們想要的文字就會(huì)出現(xiàn)在node的位置劝枣,并跟著node的變化而變化。
在這里我們想要顯示文字溪胶、顯示圖形都是通過設(shè)置node的幾何形狀node.geometry
完成的哗脖。
接下來(lái)練手順便創(chuàng)建了光線和相機(jī)才避。這里要注意,光源并不是想我們(我)想象的那樣棘劣,直接設(shè)置給node茬暇,而是寡喝,新建額外的node作為光源,實(shí)際物件上的光是光源映射在物件上的效果。
虛擬相機(jī)可以調(diào)整鏡頭珊皿,從而調(diào)整物件顯示的位置蟋定,大小等草添。還可以通過設(shè)置
_scnView.allowsCameraControl = YES;
對(duì)場(chǎng)景進(jìn)行一些操作远寸。這里先不深究。
5肆资、旋轉(zhuǎn)
其實(shí)就是SCNNode
的變換郑原∫固椋可以通過CABasicAnimation
- (void)addAnimation:(id <SCNAnimation>)animation forKey:(NSString *)key;
或者SCNAction
- (void)runAction:(SCNAction *)action;
等來(lái)實(shí)現(xiàn)女器。
恰好兩種都不熟悉,于是從簡(jiǎn)單的學(xué)起吧簇捍。
#pragma mark - 旋轉(zhuǎn)
-(void)rotation {
SCNAction *customAction = [SCNAction rotateByX:0 y:1 z:0 duration:1];//沿y軸旋轉(zhuǎn)
SCNAction *repeatAction = [SCNAction repeatActionForever:customAction];
[_node runAction:repeatAction];
}
創(chuàng)建一個(gè)沿y軸旋轉(zhuǎn)的操作暑塑,并讓它永遠(yuǎn)重復(fù)。
以上惕艳,完成了我們的第一個(gè)SceneKit程序驹愚。
說得有些啰嗦逢捺,實(shí)際上Demo代碼一共只有幾十行劫瞳。主要是第一篇,所有知識(shí)點(diǎn)都是新概念志于。實(shí)際上還有一些知識(shí)點(diǎn)并不詳細(xì)伺绽,將在之后陸續(xù)完善。