第五節(jié) - SCNNode 用法講解

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)建工程

和創(chuàng)建普通工程沒(méi)啥區(qū)別
讓學(xué)習(xí)成為一種習(xí)慣

我們已經(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é)果如下圖

運(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)行一下

運(yùn)行結(jié)果

此時(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í)慣

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容