ios 3D引擎 SceneKit 开发(6) --SCNAction

前面关于旋转的两篇我们利用CABasicAnimation来实现旋转动画,其实在SceneKit中,有一种更为简单的方法去实现一些基础动画,那就是SCNAction,它的执行对象是SCNNode。

一个简单的例子:

SCNAction *shipMoveAction = [SCNAction moveTo:SCNVector3Make(10,10,5) duration:4];

[shipRotationNode runAction:shipMoveAction];

上面代码很容易理解shipRotationNode 动画移动到(10,10,5)这个位置,时间间隔为4s。

我们下面简单介绍一下 SCNAction 主要的API:


+ (SCNAction *)moveByX:(CGFloat)deltaX
                     y:(CGFloat)deltaY
                     z:(CGFloat)deltaZ
              duration:(NSTimeInterval)duration  

 //将node从x,y,z上各移动多少距离

+ (SCNAction *)moveBy:(SCNVector3)delta
             duration:(NSTimeInterval)duration    

 //同上,只不过传入参数为SCNVector3

+ (SCNAction *)moveTo:(SCNVector3)location
             duration:(NSTimeInterval)duration

//将node移动到location这个位置

+ (SCNAction *)rotateByX:(CGFloat)xAngle
                       y:(CGFloat)yAngle
                       z:(CGFloat)zAngle
                duration:(NSTimeInterval)duration

//将node从x,y,z上各旋转多少度

+ (SCNAction *)rotateToX:(CGFloat)xAngle
                       y:(CGFloat)yAngle
                       z:(CGFloat)zAngle
                duration:(NSTimeInterval)duration

//将node从x,y,z上旋转到指定角度

+ (SCNAction *)rotateToX:(CGFloat)xAngle
                       y:(CGFloat)yAngle
                       z:(CGFloat)zAngle
                duration:(NSTimeInterval)duration
         shortestUnitArc:(BOOL)shortestUnitArc

// 同上,与上面的方法区别在于多了shortestUnitArc 这个参数,BOOL值。
//举个例子:我们需要将一个node从 0度旋转到270度,
//如果将shortestUnitArc设置为NO,node会顺时针旋转到270度;
//如果将shortestUnitArc设置为YES,node会逆时针旋转90度到270度,
//即选择最小的旋转角度旋转到特定的度数。默认为NO。

+ (SCNAction *)rotateByAngle:(CGFloat)angle
                  aroundAxis:(SCNVector3)axis
                    duration:(NSTimeInterval)duration

// 沿着特定的轴旋转angle度。前面旋转都是沿x,y,z轴旋转,都是互相垂直的,
//大家有没有想过如何沿着与x轴成45度夹角的方向旋转node?
//这个API大家这里留意一下,
//上篇提到的不在X-Z 这个平面旋转,会用这个方法在后面的demo中解决。

+ (SCNAction *)rotateToAxisAngle:(SCNVector4)axisAngle
                        duration:(NSTimeInterval)duration

// SCNVector4(x,y,z,angle)  沿着特定的轴旋转到angle度。
//这里解释一下angle 类似π,如果angle=2,
//我们可不能理解为旋转到2度,而是旋转到2/π*180 度。

+ (SCNAction *)scaleBy:(CGFloat)scale
              duration:(NSTimeInterval)sec

//缩小(放大)多少

+ (SCNAction *)scaleTo:(CGFloat)scale
              duration:(NSTimeInterval)sec

//缩小(放大)到多少

+ (SCNAction *)fadeInWithDuration:(NSTimeInterval)sec

//字面意思可以理解,淡入。将node 的opacity 渐渐变成1

+ (SCNAction *)fadeOutWithDuration:(NSTimeInterval)sec

// 淡出

+ (SCNAction *)fadeOpacityBy:(CGFloat)factor
                    duration:(NSTimeInterval)sec

//将node 的opacity 渐渐变化特定的数值

+ (SCNAction *)fadeOpacityTo:(CGFloat)opacity
                    duration:(NSTimeInterval)sec

//将node 的opacity 渐渐变化到特定的数值

+ (SCNAction *)hide

// 隐藏node

+ (SCNAction *)unhide

//显示node

+ (SCNAction *)removeFromParentNode

//移除node

+ (SCNAction *)playAudioSource:(SCNAudioSource *)source
             waitForCompletion:(BOOL)wait

//播放音频。 waitForCompletion,BOOL值,
//如果为YES Action的duration就是音频的时长;
//如果为NO,可以认为duration 为0。
//可以去看SCNAudioPlayer 的API.

+ (SCNAction *)group:(NSArray<SCNAction *> *)actions

//group 被用来并发执行多个SCNAction

+ (SCNAction *)sequence:(NSArray<SCNAction *> *)actions

//顺序执行多个SCNAction,上个SCNAction执行结束后,才执行下个SCNAction

+ (SCNAction *)repeatAction:(SCNAction *)action
                      count:(NSUInteger)count

//将一个SCNAction执行count 次

+ (SCNAction *)repeatActionForever:(SCNAction *)action

// 一直执行某个SCNAction

+ (SCNAction *)waitForDuration:(NSTimeInterval)sec

//延迟SCNAction,比如用sequence 顺序执行多个SCNAction时,
//可以给SCNAction a,c  中间添加一个SCNAction b,
//等a执行结束后,延迟一会,再去执行c

+ (SCNAction *)runBlock:(void (^)(SCNNode *node))block

//自定义SCNAction ,你可以在block 做一些操作

+ (SCNAction *)runBlock:(void (^)(SCNNode *node))block
                  queue:(dispatch_queue_t)queue

//在一个特定的队列中,执行block

+ (SCNAction *)customActionWithDuration:(NSTimeInterval)seconds
                            actionBlock:(void (^)(SCNNode *node,
                                                  CGFloat elapsedTime))block

//上篇数学旋转用到的方法,当这个SCNAction执行时,
//SceneKit 在这个时间间隔内会重复调用actionBlock,
//并将已逝去的时间传给actionBlock

+ (SCNAction *)javaScriptActionWithScript:(NSString *)script
                                 duration:(NSTimeInterval)seconds

//在时间间隔内,执行一段JavaScript代码

- (SCNAction *)reversedAction

//逆转一个已经创建的SCNAction,很好理解,
//相当于CABasicAnimation的autoreverses属性。哪里来的,回哪里去。

@property(nonatomic) NSTimeInterval duration

//SCNAction 的属性,时间间隔,真实时间间隔受speed影响

@property(nonatomic) CGFloat speed

//SCNAction 的属性,速度系数。假设duration 为10,但speed 为2的话,
//就是速度是以前的2倍,实际duration 就为5

@property(nonatomic) SCNActionTimingMode timingMode

//SCNAction 的属性,定时模式,有四个常量值:

Constants
SCNActionTimingModeLinear
//匀速

SCNActionTimingModeEaseIn
//一开始慢,慢慢加快

SCNActionTimingModeEaseOut
//一开始快,逐渐变慢

SCNActionTimingModeEaseInEaseOut
//开始慢慢地,通过中间的时候加速,然后再次放缓

OK,了解过SCNAction的API后,我们就可以解决上一篇的问题了:添加一艘飞船,让它绕着与x轴成45度的方向做圆周运动。

用到的API :

+ (SCNAction *)rotateByAngle:(CGFloat)angle
                  aroundAxis:(SCNVector3)axis
                    duration:(NSTimeInterval)duration

最终实现效果:

代码全在demo里面,感兴趣的同学可以下载

https://github.com/pzhtpf/SceneKitRoationDemo

时间: 2024-10-13 07:04:42

ios 3D引擎 SceneKit 开发(6) --SCNAction的相关文章

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

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

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

旋转模型是经常遇到了,我们之前用CABasicAnimation 可以旋转一个view,其实它也可以旋转一个SCNNode. 首先我们要明白一个概念,每个SCNNode 都有自身的三维坐标系,用CABasicAnimation就是让SCNNode绕自身的三维坐标轴旋转,所以要特别注意是坐标轴,不是这个SCNNode的几何中心.一般SceneKit 的自带的几个几何体的坐标系原点(0,0,0)就是这个它的几何中心,比如说SCNBox:SCNSphere等等,所以看上去跟绕几何中心旋转一模一样. 我

iOS 3D 之 SceneKit框架Demo分析

Scene Kit 是Apple 向 OS X 开发者们提供的 Cocoa 下的 3D 渲染框架. Scene Kit 建立在 OpenGL 的基础上,包含了如光照.模型.材质.摄像机等高级引擎特性,这些组件都是面向对象的,你可以用熟悉的 Objective-C 或 Swift 语言来编写代码.假如你用过 OpenGL 最早的版本,那时还没有 shader,只能苦逼的使用各种底层受限制的 API 开发.而 Scene Kit 就好了很多,对于大多数需求 (甚至像动态阴影等高级特性),使用它提供的

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

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

用函数式编程,从0开发3D引擎和编辑器(一)

介绍 大家好,欢迎你踏上3D编程之旅- 本系列的素材来自我们的产品:Wonder-WebGL 3D引擎和编辑器 的整个开发过程,探讨了在从0开始构建3D引擎和编辑器的过程中,每一个重要的功能点.设计方案的思考.讨论.总结和延伸. 本系列避免陷入细节的实现代码,使用伪代码代替.所以没有可直接运行的代码,取而代之的是经过抽象和提炼的伪代码/模式. 为什么要写这个系列 我有三个小目标: 1.完全创造 完全从0开始,创造一个有深度.有难度.有挑战的产品. 所以Wonder被创造出来了,并且会持续地发展.

用函数式编程,从0开发3D引擎和编辑器(二):函数式编程准备

大家好,本文介绍了本系列涉及到的函数式编程的主要知识点,为正式开发做好了准备. 函数式编程的优点 1.粒度小 相比面向对象编程以类为单位,函数式编程以函数为单位,粒度更小. 正所谓: 我只想要一个香蕉,而面向对象却给了我整个森林 2.性能好 大部分人认为函数式编程差,主要基于下面的理由(参考 JavaScript 函数式编程存在性能问题么?): 1)柯西化.函数组合等操作增加时间开销 2)map.reduce等操作,会进行多次遍历,增加时间开销 3)Immutable数据每次操作都会被拷贝为新的

Android 3D引擎推荐

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

三年一个人使用虚幻引擎(UDK)开发的一个游戏心路

三年一个人使用虚幻引擎(UDK)开发的一个游戏心路 转载   出处来源http://mobile.51cto.com/news-488590.htm 对于我个人来说,完成她的意义不仅在与完成了一个儿时的愿望,也是一次战胜自我的旅程,3年的时光,经历了种种变荡.最终,通过压榨自己的业余时光,学习新语言,新游戏平台,3D建模,3D动画,美工,音效,FLASH,各种配置. 作者:来源:CocoaChina|2015-08-18 09:57 收藏 分享 这个游戏没有做任何宣传(这个帖子算是第一个吧),其

【课程下载】基于Cocos2d-x游戏引擎实战开发炸弹超人

我这里有套课程想和大家分享,需要的朋友可以加我qq和我联系.QQ2059055336. 课程讲师:Jason.Z 课程分类:ios适合人群:初级课时数量:31课时更新程度:完毕 一.本课程是怎么样的一门课程(全面介绍) 1.1.课程的背景 Cocos2d-x 是一个支持多平台的 2D 手机游戏引擎,使用 C++ 开发,基于OpenGL ES,基于Cocos2d-iphone,支持 WOPhone, iOS 4.1, Android 2.1 及更高版本, WindowsXP & Windows7,