SceneKit自学之路(1)

目前网上关于SceneKit的教程还是略少。对于完全没有任何游戏开发经验的人(我)来说还是有一定挑战。记下此篇,加深理解。文中不保证完全正确,如有错误,感谢斧正。

本文不会像教材一样循规蹈矩,按部就班。而是通过实例,用到了什么再去学习什么。

进入正题:


Hello World

1、创建工程

很多没基础的人(我)都栽在了第一步。Xcode->File->New->Project->Game->SceneKit->Run!
看到一个很炫酷的飞船,在原地不停转圈。一看代码,不明觉厉。于是就放弃了。

其实SceneKit没有那么神秘,他就是一个framework,我们完全可以使用他,就像使用任意一个framework一样。

所以在这里,我们新建一个Single View App就可以了。

创建工程

接下来,如所有开发一样,来开发一个HelloWorld作为学习的开头吧。

2、引入SceneKit

如前文所说,就像我们使用任意一个framework,我们首先引入它。

#import <SceneKit/SceneKit.h>

到这,我们先想一个概念:SceneKit开发的东西,自然应该放在SceneKit自己的容器上,SCNView就是这个容器(记不住前缀的可以脑补英文发音s ~ c ~ n:scene)。它提供一个场景SCNScene,而我们具体的每一个组件都将放在场景里,这些组件便是节点SCNNode

于是我设定了以下3步来完成HelloWorld

- (void)viewDidLoad {
    [super viewDidLoad];
    [self makeScene];//1、初始化场景
    [self makeNode]; //2、初始化节点
    [self rotation]; //3、旋转节点
}
3、初始化场景

查看API可以看到SCNView其实就是一个基于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]];
    //设置场景
    SCNScene *scene = [SCNScene new];
    _scnView.scene = scene;
}

初始化SCNView之后必须做的是给它设置一个场景,SCNScene可以像上文中一样使用+(instancetype)new;或者+(instancetype)scene;初始化一个空场景。也可以根据资源创建场景+(instancetype)sceneNamed:(NSString *)name;
这个资源可以是.scn文件也可以是.dae文件。(然而我并不知道去哪找现成的资源,所以接下来的实例,都只能以图形加颜色为主)
.scn文件可以->New->File->SceneKit Scene File创建

新建.scn文件

.scn文件

4、初始化节点

什么是节点?

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.
场景里的元素,表示在三维坐标空间中的一个位置和变换,你可以将几何、灯光、相机或其他可显示的内容附加到其中。

就是说,节点本身不是东西,他只是代表一个位置和变换。我们可以把具体的组件附加到节点上,从而使组件显示出来。

#pragma mark - 初始化Node
-(void)makeNode {
    //创建节点
    _node = [SCNNode new];
    //将节点附加到根节点上
    [_scnView.scene.rootNode addChildNode:_node];
    //设置节点形状
    SCNText *text = [SCNText textWithString:@"Hello World" extrusionDepth:0.5];//extrusionDepth厚度
    text.font = [UIFont systemFontOfSize:1];
    _node.geometry = text;
    //初始化光线(不是在目标上直接设置而是新建节点来作为光源)
    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];
    //初始化虚拟相机(主要是调整镜头)
    SCNNode *cameraNode = [SCNNode node];
    cameraNode.camera = [SCNCamera camera];
    [_scnView.scene.rootNode addChildNode:cameraNode];
    _scnView.allowsCameraControl = YES;
    cameraNode.position = SCNVector3Make(0, 1, 12);
}

首先初始化node,并且把它添加到场景里。
接下来把“Hello World”附加给他,这样我们想要的文字就会出现在node的位置,并跟着node的变化而变化。
在这里我们想要显示文字、显示图形都是通过设置node的几何形状node.geometry完成的。

默认提供的几何图形

接下来练手顺便创建了光线和相机。这里要注意,光源并不是想我们(我)想象的那样,直接设置给node,而是,新建额外的node作为光源,实际物件上的光是光源映射在物件上的效果。
默认提供的光源类型

虚拟相机可以调整镜头,从而调整物件显示的位置,大小等。还可以通过设置_scnView.allowsCameraControl = YES;对场景进行一些操作。这里先不深究。

5、旋转

其实就是SCNNode的变换。可以通过CABasicAnimation

- (void)addAnimation:(id <SCNAnimation>)animation forKey:(NSString *)key;

或者SCNAction

- (void)runAction:(SCNAction *)action;

等来实现。
恰好两种都不熟悉,于是从简单的学起吧。

#pragma mark - 旋转
-(void)rotation {
    SCNAction *customAction = [SCNAction rotateByX:0 y:1 z:0 duration:1];//沿y轴旋转
    SCNAction *repeatAction = [SCNAction repeatActionForever:customAction];
    [_node runAction:repeatAction];
}

创建一个沿y轴旋转的操作,并让它永远重复。

以上,完成了我们的第一个SceneKit程序。

效果图

说得有些啰嗦,实际上Demo代码一共只有几十行。主要是第一篇,所有知识点都是新概念。实际上还有一些知识点并不详细,将在之后陆续完善。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容