您的位置:首页 > 移动开发 > IOS开发

SceneKit初识

2016-06-18 17:10 417 查看
公司的需求是在应用中内嵌一个简单的3D场景。在考察了webOpenGL和unity3d之后还有苹果自家的SceneKit,还是准备用原生的API。原因有两点:一,公司都没有人懂这几个技术,做都需要请外边的人来,扩展性比较差。二,web的用户体验毕竟没有native的好,但是我们的app只有部分使用3d,场景并不复杂,接入unity的成本比较高。所以看了几天scenekit的api,基本实现了需求所需要的。发现中文的资料比较少,可能因为unity在处理3d能力上跨平台和普及度都远远高于这个。所以准备写一点东西帮助需要的人。

好,正式进入学习。

首先了解SceneKit的坐标系

x轴y轴和二维是相同的,多了一个z轴,z+即为屏幕向外,z-为屏幕向内。

创建一个SceneKit的默认文件。


在打开之后直接运行会有一个旋转的飞机样式,这个是苹果官方的demo。有一些简单的设置我们来看一下。

可以看到在demo中比一般的文件多了一个scnasssets文件夹,这个是存放3d模型的文件夹,打开可以看到.scn后缀的文件,这个就是xcode识别的模型文件后缀的一种,导入3d模型的方法请见 pzhtpf的博客点击打开链接

// create a new scene
SCNScene *scene = [SCNScene sceneNamed:@"art.scnassets/ship.scn"];
实例化SCNcene,场景本身并不可见,需要添加在SceneView的场景上。这点可以参考image。image本身并不可见,需要imageView设置image。(若理解有误欢迎指正,下同)

<span style="font-size:14px;"> // create and add a camera to the scene
SCNNode *cameraNode = [SCNNode node];
cameraNode.camera = [SCNCamera camera];
[scene.rootNode addChildNode:cameraNode];

// place the camera
cameraNode.position = SCNVector3Make(0, 0, 15);</span>

这段代码是用来创建并配置摄像机。摄像机处于的位置即视角所看的位置。  注意这里创建摄像机是创建了一个SCNNode,赋值了node的属性。这里需要了解一下node的作用。在SceneKit中,node即节点是非常关键的部分。node本身同样是不可见的,它的作用是节点化各个部件。比如一辆车,车身和方向盘都是模型,可以把方向盘的node添加在车身模型的node上,这样在车移动的时候,车模型的子node也会一起移动。车身各部件之间的相对位置是不变的。这样可以大大节省工作量。在渲染场景的时候,sceneKit会遍历所有的子node,cameraNode设置了属性camera,并把自己添加在了scene的rootNode上才会在scene显示的时候起作用
<span style="font-size:14px;">// create and add a light to the scene
SCNNode *lightNode = [SCNNode node];
lightNode.light = [SCNLight light];
lightNode.light.type = SCNLightTypeOmni;
lightNode.position = SCNVector3Make(0, 10, 10);
[scene.rootNode addChildNode:lightNode];

// create and add an ambient light to the scene
SCNNode *ambientLightNode = [SCNNode node];
ambientLightNode.light = [SCNLight light];
ambientLightNode.light.type = SCNLightTypeAmbient;
ambientLightNode.light.color = [UIColor darkGrayColor];
[scene.rootNode addChildNode:ambientLightNode];

</span>这段代码用来创建并配置灯光效果。在3d成像中,灯光是很重要的一个环节。灯光和阴影可以让物体更有质感。light的type有四种,大家可以尝试。
<span style="font-size:14px;">// retrieve the ship node
SCNNode *ship = [scene.rootNode childNodeWithName:@"ship" recursively:YES];

</span>得到飞机模型。注意这个方法recursively:(BOOL)的意思为是否在子node中查询。node是树形结构,会返回第一个遇到的@“ship”node。
<span style="font-size:14px;"> // animate the 3d object
[ship runAction:[SCNAction repeatActionForever:[SCNAction rotateByX:0 y:2 z:0 duration:1]]];</span>让飞机绕y轴飞行。这里的动画是SCNAction,封装性和使用方法与UIVIew的二维动画类似,相当便捷。
// retrieve the SCNView
SCNView *scnView = (SCNView *)self.view;

// set the scene to the view
scnView.scene = scene;
得到用于展示的SCNView,并配置scnView的scene。
// allows the user to manipulate the camera
scnView.allowsCameraControl = YES;

// show statistics such as fps and timing information
scnView.showsStatistics = YES;

// configure the view
scnView.backgroundColor = [UIColor blackColor];


设置允许用户控制摄像机,显示状态,(fps等)一般是在开发中用作调试的。

好了,这就是官方demo的基本内容。实现了一个模型的显示和动画。告诉了我们模型想变为可见,需要摄像机模拟视角,灯光和周围灯光展示,添加在根node中。之后会更新我为了实现公司的需求写的很丑的基本移动操作类demo。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ios api 3d