- 本系列文章的學(xué)習(xí)首先要感謝史前圖騰的共享精神,在他的系列文章中有詳細(xì)的解釋,但是他的代碼都是Swift寫的.并且代碼的解釋比較少,
- 在這里我提供了demo-OC版供大家參考和學(xué)習(xí),
- demo地址:
OC-地址
swif-地址
效果圖
知識(shí)點(diǎn)解析
Scenes:SCNScene
自帶一個(gè)定義了坐標(biāo)系的root node(根節(jié)點(diǎn)),使用scene gragh來(lái)組織場(chǎng)景,可以向內(nèi)部增加樹(shù)狀結(jié)構(gòu)的內(nèi)部節(jié)點(diǎn)(node),例如 lights光源, cameras相機(jī), geometry幾何體, particle emitters粒子發(fā)射源.
需要放到SCNView的實(shí)例中呈現(xiàn),SCNView在OSX(macOS)中是NSView的子類,在iOS中是UIView的子類;
左側(cè)樹(shù)狀結(jié)構(gòu)
坐標(biāo)系,屏幕外是+Z方向,坐標(biāo)使用向量表示,示例SCNVector3(x: 0, y: 5, z: 10)
Nodes:SCNNode
游戲中的每個(gè)元素都被稱為node(節(jié)點(diǎn)),存放在樹(shù)狀結(jié)構(gòu)scene gragh中,例如 lights光源, cameras相機(jī), geometry幾何體, particle emitters粒子發(fā)射源.每個(gè)scene graph中包含一個(gè)特殊的基礎(chǔ)節(jié)點(diǎn):root node(根節(jié)點(diǎn)),可以把其他節(jié)點(diǎn)添加到節(jié)點(diǎn)下面,變成它的子節(jié)點(diǎn).
添加到scene中的node,默認(rèn)在(x:0, y:0, z:0),即相對(duì)于父節(jié)點(diǎn)的位置.要想調(diào)整節(jié)點(diǎn)在父節(jié)點(diǎn)的位置,應(yīng)該調(diào)整local coordinates(本地坐標(biāo)系),而不是調(diào)整world coordinates(世界坐標(biāo)系).
注意
默認(rèn)情況下,如果一個(gè)場(chǎng)景中沒(méi)有任何改變時(shí),Scene Kit會(huì)進(jìn)入"paused"(暫停)狀態(tài),為了防止這種情況,需要在創(chuàng)建SCNView實(shí)例時(shí)設(shè)置playing屬性為true如
scnView.playing = true
camera
攝像機(jī)的顯示范圍控制,小球zNear不顯示,大于zFar不顯示.添加到一個(gè)空節(jié)點(diǎn)的camera屬性里
// SCNScene - 默認(rèn)有一個(gè)根節(jié)點(diǎn)
SCNScene *scene = [SCNScene new];
// 將該場(chǎng)景添加到 SCNView 上 否側(cè)該場(chǎng)景無(wú)法顯示
scenView.scene = _scene = scene;
scene.background.contents = [UIImage imageNamed:@"Background_Diffuse"];
// 創(chuàng)建一個(gè)相機(jī)節(jié)點(diǎn)
SCNNode *node = [SCNNode new];
node.camera = [SCNCamera new];
node.position = SCNVector3Make(0, 5, 10);
// 將其添加到根節(jié)點(diǎn)上
[scene.rootNode addChildNode:node];
primitives geometry(原生幾何體)
系統(tǒng)自帶了很多基礎(chǔ)的幾何體,添加到一個(gè)空節(jié)點(diǎn)的geometry屬性里
第一排從左起:cone(圓錐體), torus(圓環(huán)體), capsule(膠囊體), tube(管道)
第二排從左起:pyramid(四棱錐), box(長(zhǎng)方體), sphere(球體), cylinder(圓柱體)
SCNView內(nèi)置屬性
// SCNView
SCNView *scenView = [SCNView new];
scenView.backgroundColor = [UIColor redColor];
scenView.frame = self.view.bounds;
scenView.showsStatistics = true; // 顯示統(tǒng)計(jì)數(shù)據(jù)
scenView.allowsCameraControl = true; // 打開(kāi)相機(jī)控制
scenView.autoenablesDefaultLighting = true; // 打開(kāi)默認(rèn)光源 _ 如果該選項(xiàng)不打開(kāi) 幾何體的效果將無(wú)法顯示
[self.view addSubview:scenView];
1.showsStatistics在底部顯示一個(gè)實(shí)時(shí)的統(tǒng)計(jì)條,左側(cè)+號(hào)點(diǎn)擊可展開(kāi);
2.showsStatistics允許使用簡(jiǎn)單手勢(shì)控制相機(jī)
-單指滑動(dòng):旋轉(zhuǎn)相機(jī);
-雙指滑動(dòng):移動(dòng)相機(jī);
-雙指捏合:縮放;
-雙擊:如果有兩個(gè)相機(jī)則切換,一個(gè)相機(jī)則返回原始狀態(tài);
3.autoenablesDefaultLighting創(chuàng)建一個(gè)通用的全方向光源;
fps:幀率,每秒渲染的畫面數(shù)
◆:每幀畫面渲染的總物體數(shù),多光源照射同一物體時(shí)會(huì)渲染多次
▲:每幀畫面渲染的多邊形總數(shù)量,
?:可見(jiàn)的光源總數(shù)(影響物體的光源), Scene Kit推薦不要同時(shí)使用3個(gè)以上光源
- 其他代碼詳見(jiàn)demo - OC版