hello ,大家好,我是Roc.Tian,最近一直在研究苹果自家的3D 引擎 SceneKit ,适当写写博客,总结一下,与大家分享一下,也希望跟大家交流,共同进步。
SceneKit 是一个OC 框架,开始之前,先熟悉一下SceneKit 的三维坐标系:
很清楚的看到,SceneKit 中的坐标系是右手坐标系(笛卡尔坐标系),如果需要与其他3D框架共享数据,先了解其框架是右手坐标系还是左手坐标系。其实也很好转化,就是Z 轴的正负不一样而已。
在开始开发之前,一定要了解下面这几个非常重要的类
类 / 协议 |
描述 |
SCNView & SCNSceneRenderer |
类似UIView,用来显示 SceneKit 的内容,定义了一些代理方法,可以用 addSubView 方法添加到UiView 中 |
SCNScene |
SceneKit 内容的容器. 你可以从3D建模工具生成的.dae文件中加载一个场景,或者用代码创建一个 ,然后把它显示在视图上 |
SCNNode |
一个场景的基本构建块,你可以把摄像机,灯光,几何体附加到节点上 |
SCNGeometry |
一个可以连接到一个节点的三维物体。一个几何体(有时称为模型或网格)只定义了一个可见物体的形状。要定义对象的表面颜色图案,你必需要给几何体要附加材料。然后给材料贴图,或者上色,这个几何体表面才会有颜色,或者图案。 你可以从3D建模工具生成的.dae文件中加载一个几何体,也可以用代码创建,SceneKit 提供了几种常见几何体,是SCNGeometry 的子类,比如长方体,球,圆柱球等等,后面我们会写一个demo会把官方提供的几何体给大家列出来,给大家一个直观的感受。 当然我们也可以用三维坐标,法向量自定义几何体,也可以讲一个2D 图案转化成一个具有深度(厚度)的三维几何体。后面应该专门有一篇会讲到利用贝塞尔曲线将一个2D 图案转化成一个具有深度(厚度)的三维几何体。
|
SCNMaterial |
材质,由于在3D建模工具中呈现球形,所以也叫材质球。上色,贴图全靠它。 |
SCNLight |
光源可以附加到节点上,在渲染场景中提供着色 |
SCNCamera |
虚拟摄像机可以附加到节点上,提供了一个场景的视图。 |
了解以上知识,那我们就来动手开发吧,我们可以在Xcode 中新建一个SceneKit 项目:
运行效果如下:
这个新建的SceneKit 项目 里面会有一些示例代码,我们接下来挑一些重要的注释一下:
SCNScene *scene = [SCNScene sceneNamed:@"art.scnassets/ship.scn"];
SCNNode *ship = [scene.rootNode childNodeWithName:@"ship" recursively:YES];
[ship runAction:[SCNAction repeatActionForever:[SCNAction rotateByX:0 y:2 z:0 duration:1]]];
scnView.allowsCameraControl = YES;
gestureRecognizers addObjectsFromArray:scnView.gestureRecognizers];
scnView.showsStatistics = YES; 控制下方的统计栏是否显示
单击手势中:
// check what nodes are tapped
CGPoint p = [gestureRecognize locationInView:scnView];
NSArray *hitResults = [scnView hitTest:p options:nil];
[SCNTransaction begin];
[SCNTransaction setAnimationDuration:0.5];
// on completion - unhighlight
[SCNTransaction setCompletionBlock:^{
[SCNTransaction begin];
[SCNTransaction setAnimationDuration:0.5];
material.emission.contents = [UIColor blackColor];
[SCNTransaction commit];
}];
material.emission.contents = [UIColor redColor];
[SCNTransaction commit];
OK ,起始篇 就简单到这了,下一篇跟大家分享交流 几何体如何贴图,希望大家关注。
我是Roc.Tian , 欢迎大家拍砖,交流。 邮箱:[email protected]。 也欢迎上海的小伙伴周末约喝下午茶,交流,学习。