ios SceneKit 3D引擎初探

最近到处搜集资料研究3D最后还是决定锁定OC框架,找到的学习资料随后慢慢整理

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 项目 里面会有一些示例代码,我们接下来挑一些重要的注释一下:

[html] view plain copy

  1. SCNScene *scene = [SCNScene sceneNamed:@"art.scnassets/ship.scn"];

从 SCN 文件中加载一个场景,也可以从.dae 文件中加载

[html] view plain copy

  1. SCNNode *ship = [scene.rootNode childNodeWithName:@"ship" recursively:YES];

获得这个场景中飞机这个节点

[html] view plain copy

  1. [ship runAction:[SCNAction repeatActionForever:[SCNAction rotateByX:0 y:2 z:0 duration:1]]];

让飞机一直绕着他的Y  轴旋转

[html] view plain copy

  1. scnView.allowsCameraControl = YES;

让用户可以控制摄像机,配合下面一句添加手势的代码,用户可以放大,缩小 ,360 度旋转整个场景

[html] view plain copy

  1. gestureRecognizers addObjectsFromArray:scnView.gestureRecognizers];

[html] view plain copy

  1. scnView.showsStatistics = YES;      控制下方的统计栏是否显示

单击手势中:

[html] view plain copy

  1. // check what nodes are tapped
  2. CGPoint p = [gestureRecognize locationInView:scnView];
  3. NSArray *hitResults = [scnView hitTest:p options:nil];

类似射线检测,检测二维这个点向深无限延深,这个射线上的节点,返回一个数组,可用于单击选中,数组中第一个数据一般就是我们需要的节点。

[html] view plain copy

  1. [SCNTransaction begin];
  2. [SCNTransaction setAnimationDuration:0.5];
  3. // on completion - unhighlight
  4. [SCNTransaction setCompletionBlock:^{
  5. [SCNTransaction begin];
  6. [SCNTransaction setAnimationDuration:0.5];
  7. material.emission.contents = [UIColor blackColor];
  8. [SCNTransaction commit];
  9. }];
  10. material.emission.contents = [UIColor redColor];
  11. [SCNTransaction commit];

SceneKit 中的动画区块,类似 UIKit  中的动画区块。

时间: 2024-10-03 22:47:40

ios SceneKit 3D引擎初探的相关文章

ios 3D引擎 SceneKit 开发(5) --关于旋转的几点问题(2)

如果还没看前一篇,可以移驾看看:ios 3D引擎 SceneKit 开发(4) –关于旋转的几点问题(1) 上一篇我们用CABasicAnimation 来模拟了太阳-地球-月球的天体运动.其中月球绕太阳运动和月球绕地球运动都可以看做一个点绕另一个点作圆周运动.(当然现实中是椭圆运动,有远地点,近地点,这里我们看作圆周运动) 一个点绕另一个点作圆周运动,是不是很熟悉.对,就是我们之前学习的数学知识,这里完全可以用数学知识做. 相关数学知识点: 任意点a(x,y),绕一个坐标点b(rx0,ry0)

Android 3D引擎推荐

============问题描述============ 最近接到一个项目需要使用3D引擎,请教下Android平台下哪个3D游戏引擎比较好啊,最好是开源的,资料比较多的. ============解决方案1============ 很 多初学Android游戏开发 href="http://edu.gamfe.com/gamedev.html">游戏开发的朋友,往往会显得有些无所适从,他们常常不知道该从何处入手,每当遇到自己无法解决的难题时,又往往会一边羡慕于 iPhone下有

iOS cocos2d游戏引擎的了解之一

ios游戏引擎之Cocos2d(一) cocos2d是一个免费开源的ios游戏开发引擎,并且完全采用object-c进行编写,这对于已经用惯object-c进行ios应用开发的童鞋来说非常容易上手.这些也是我推荐使用cocos2d进行ios游戏开发的原因,当然从字面上已经可以开出来,这是一款专注于"2d"游戏的开发引擎,您也可以自己编写3d渲染代码或者使用第三方的解决方案,在cocos2d里加载显示3d模型.此外对于3d,也可以选用cocos3d来进行游戏开发.好了,废话不多说,还是先

cocos2dx 3.2中的物理引擎初探(一)

cocos2dx在设计之初就集成了两套物理引擎,它们是box2d和chipmunk.我目前使用的是最新版的cocos2dx 3.2.引擎中默认使用的是chipmunk,如果想要改使用box2d的话,需要修改对应的android工程或者是ios工程的配置文件. 在2.x版本的cocos中,使用物理引擎的步骤十分繁琐.但在3.x版本中变得非常方便了.我这次的学习目标是制作一个打砖块的小游戏. 首先,现在的Scene类提供了一个静态工厂方法,用以创造一个集成物理引擎的场景. Scene::initWi

iOS开发之UISearchBar初探

iOS开发之UISearchBar初探 UISearchBar也是iOS开发常用控件之一,点进去看看里面的属性barStyle.text.placeholder等等.但是这些属性显然不足矣满足我们的开发需求.比如:修改placeholder的颜色.修改UISearchBar上面的UITextfield的背景颜色.修改UITextfield上面的照片等等. 为了实现上述的需求,最好写一个UISearchBar的子类就叫LSSearchBar吧 LSSearchBar.h如下: #import <U

【原创】Linux环境下的图形系统和AMD R600显卡编程(10)——R600显卡的3D引擎编程

3D图形处理流水线需要流经多个硬件单元才能得到最后的渲染结果,流水线上的所有的硬件单元必须被正确编程,才能得到正确的结果. 总体上看,从图形处理流水线的源头开始,需要准备好vertex和index,在立即模式下,index可以直接编程在命令中,通过配置寄存器告诉GPU vertex buffer的位置,在启动GPU流水线之前,还需要将vertex shader程序和pixel shader程序加载到vram 中,并通过配置寄存器告示GPU shader程序的位置,在vertex shader和p

famo.us 一个JavaScript游戏引擎初探

好久之前就看到了famo.us的优良特性,尤其是它避开浏览器弊病的跳跃思维,再加上自己使用JQM来开发Web App时的页面切换的白屏bug,又比对了sencha touch,最后还是决定将famo.us作为开发框架,它是基于浏览器的,目标就是使页面呈现性能最大化,而我不会拿它来做游戏,只是做简单的WebApp,要的就是这个界面显示性能. 但悲剧的是国内没有关于famo.us的教程,近些日子Google被天朝打压的挺惨,幸运的是famo.us官网还是可以访问的,所以以下的学习结果都来自官网htt

3d引擎列表

Agar - 一个高级图形应用程序框架,用于2D和3D游戏. Allegro library - 基于 C/C++ 的游戏引擎,支持图形,声音,输入,游戏时钟,浮点,压缩文件以及GUI. Axiom 引擎 - OGRE的衍生引擎. Baja 引擎 - 专业品质的图像引擎,用于The Lost Mansion. Boom - Doom代码的一部分.由TeamTNT开发 Build 引擎 - 一个第一人称射击游戏引擎,用于Duke Nukem 3D. BYOND - “Build Your Own

万圣节福利:红孩儿3D引擎开发课程《3ds max导出插件初步》

红孩儿3D引擎开发课堂 QQ群:275220292 国内最详尽教授怎样开发3D引擎的地方!揭开3D引擎开发最不为人知的秘密! 万圣节福利,国内最详尽的3ds max导出插件编程指南0基础篇免费发放!            前言:今天网易的<乱斗西游>上线AppStore ,将继完美世界<黑暗黎明>后再次证明自研引擎的实力!假设你想成为引擎研发高手,那么,一切,将从3ds max导出插件起步~ 第九章课程<3ds max导出插件初步> 一.3ds max导出插件简单介绍: