iOS开发之SceneKit框架--SCNAction.h
1、SCNAction简介
主要负责节点SCNNode的属性,实现node的渐变、移动、出现、消失、实现动画等。
2、相关API
- 节点的移动(earthNode的初始坐标(5,0,0))
//从当前位置移动指定的距离X轴:deltaX Y轴:deltaY Z轴:deltaZ
+ (SCNAction *)moveByX:(CGFloat)deltaX y:(CGFloat)deltaY z:(CGFloat)deltaZ duration:(NSTimeInterval)duration;
+ (SCNAction *)moveBy:(SCNVector3)delta duration:(NSTimeInterval)duration;
[self.earthNode runAction:[SCNAction moveByX: y: z: duration:]];
[self.earthNode runAction:[SCNAction moveBy:SCNVector3Make(5, 5, 0) duration:]];
//移动到指定坐标location
+ (SCNAction *)moveTo:(SCNVector3)location duration:(NSTimeInterval)duration;
[self.earthNode runAction:[SCNAction moveTo:SCNVector3Make(5, 5, 0) duration:]];
- 节点的旋转
//当前的节点基础上进行旋转指定的角度X轴:xAngle Y轴:yAngle Z轴:zAngle
+ (SCNAction *)rotateByX:(CGFloat)xAngle y:(CGFloat)yAngle z:(CGFloat)zAngle duration:(NSTimeInterval)duration; //旋转到指定的角度X轴:xAngle Y轴:yAngle Z轴:zAngle
//shortestUnitArc:YES是顺时针,NO为逆时针
+ (SCNAction *)rotateToX:(CGFloat)xAngle y:(CGFloat)yAngle z:(CGFloat)zAngle duration:(NSTimeInterval)duration;
+ (SCNAction *)rotateToX:(CGFloat)xAngle y:(CGFloat)yAngle z:(CGFloat)zAngle duration:(NSTimeInterval)duration shortestUnitArc:(BOOL)shortestUnitArc;
[self.earthNode runAction:[SCNAction rotateByX: y:M_PI_2 z: duration:]];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)( * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self.earthNode runAction:[SCNAction rotateToX: y: z: duration:]];
});
//axis和原点组成轴向量,旋转angle角度
//axisAngle:是四分量,前三个坐标相当于axis的值,第四个值为旋转角度
+ (SCNAction *)rotateByAngle:(CGFloat)angle aroundAxis:(SCNVector3)axis duration:(NSTimeInterval)duration;
+ (SCNAction *)rotateToAxisAngle:(SCNVector4)axisAngle duration:(NSTimeInterval)duration;
[self.earthNode runAction:[SCNAction rotateByAngle:M_PI_2 aroundAxis:SCNVector3Make(, , ) duration:]];
[self.earthNode runAction:[SCNAction rotateToAxisAngle:SCNVector4Make(, , , M_PI_2) duration:]];
- 节点的缩放
//在原来基础上进行缩放
+ (SCNAction *)scaleBy:(CGFloat)scale duration:(NSTimeInterval)sec;
//在初始化的基础上进行缩放
+ (SCNAction *)scaleTo:(CGFloat)scale duration:(NSTimeInterval)sec;
[self.earthNode runAction:[SCNAction scaleTo: duration:]];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)( * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self.earthNode runAction:[SCNAction scaleBy:0.5 duration:]];
});
[self.earthNode runAction:[SCNAction scaleBy: duration:]];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)( * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self.earthNode runAction:[SCNAction scaleTo:0.5 duration:]];
});
- 节点的透明度
//透明度变换到1的动画
+ (SCNAction *)fadeInWithDuration:(NSTimeInterval)sec;
//透明度变换到0的动画
+ (SCNAction *)fadeOutWithDuration:(NSTimeInterval)sec;
//原来的透明度基础上 变换值为factor
+ (SCNAction *)fadeOpacityBy:(CGFloat)factor duration:(NSTimeInterval)sec;
//变换到指定的透明度opacity
+ (SCNAction *)fadeOpacityTo:(CGFloat)opacity duration:(NSTimeInterval)sec;
[self.earthNode runAction:[SCNAction fadeOutWithDuration:]];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)( * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self.earthNode runAction:[SCNAction fadeInWithDuration:]];
});
- 节点的可视性
//隐藏node
+ (SCNAction *)hide API_AVAILABLE(macos(10.11), ios(9.0));
//不隐藏node
+ (SCNAction *)unhide API_AVAILABLE(macos(10.11), ios(9.0));
- 移除节点
//移除节点
+ (SCNAction *)removeFromParentNode;
- 添加音频播放
//播放音频。 waitForCompletion:YES Action的duration就是音频的时长;NO duration为0。
+ (SCNAction *)playAudioSource:(SCNAudioSource *)source waitForCompletion:(BOOL)wait API_AVAILABLE(macos(10.11), ios(9.0));
- 创建节点的动画组或者重复节点的动画
//所有动画串行运行
+ (SCNAction *)sequence:(NSArray<SCNAction *> *)actions;
//所有动画并行运行
+ (SCNAction *)group:(NSArray<SCNAction *> *)actions; //重复action动画,count次
+ (SCNAction *)repeatAction:(SCNAction *)action count:(NSUInteger)count;
//一直重复action动画
+ (SCNAction *)repeatActionForever:(SCNAction *)action;
[self.earthNode runAction:[SCNAction group:@[[SCNAction rotateToX: y: z: duration:],[SCNAction fadeOutWithDuration:]]]];
[self.earthNode runAction:[SCNAction sequence:@[[SCNAction rotateToX: y: z: duration:],[SCNAction fadeOutWithDuration:]]]];
- 动画延迟设置(适用于//所有动画串行运行+ (SCNAction *)sequence:(NSArray<SCNAction *> *)actions;)
//动画延迟时间
+ (SCNAction *)waitForDuration:(NSTimeInterval)sec;
//动画延迟时间 随机数范围【sec,durationRange/2]
+ (SCNAction *)waitForDuration:(NSTimeInterval)sec withRange:(NSTimeInterval)durationRange;
[self.earthNode runAction:[SCNAction sequence:@[[SCNAction rotateToX: y: z: duration:],[SCNAction waitForDuration: withRange:],[SCNAction fadeOutWithDuration:]]]];
- 节点自定义动画
//执行动画开始时立即调用,node是正在动画的节点
+ (SCNAction *)runBlock:(void (^)(SCNNode *node))block;
+ (SCNAction *)runBlock:(void (^)(SCNNode *node))block queue:(dispatch_queue_t)queue; /**
反复运行脚本,直到动作的持续时间结束。每次SceneKit运行脚本时,它计算自操作开始执行以来的运行时间(作为操作在0.0到1.0之间的时间的一部分),并使脚本作为一个名为elapsedTime的变量可用。 @param script 包含JavaScript源代码的字符串。
@param seconds 动作的持续时间,以秒为单位。
*/
+ (SCNAction *)javaScriptActionWithScript:(NSString *)script duration:(NSTimeInterval)seconds; /**
自定义动作执行时反复调用 @param seconds 动作时间
@param block 节点node,和动作开始经过的时间elapsedTime
*/
+ (SCNAction *)customActionWithDuration:(NSTimeInterval)seconds actionBlock:(void (^)(SCNNode *node, CGFloat elapsedTime))block;
- 节点动画逆转
- (SCNAction *)reversedAction;
- 基础属性
//动画时间
@property(nonatomic) NSTimeInterval duration;
//定时模式
@property(nonatomic) SCNActionTimingMode timingMode;
typedef NS_ENUM(NSInteger, SCNActionTimingMode) {
SCNActionTimingModeLinear,//匀速
SCNActionTimingModeEaseIn,//先慢后快
SCNActionTimingModeEaseOut,//先快后慢
SCNActionTimingModeEaseInEaseOut//先慢中快后慢
} API_AVAILABLE(macos(10.10), ios(8.0));
//使用这个输入来计算定制的计时功能,它的输出决定了动画的计时
@property(nonatomic, nullable) SCNActionTimingFunction timingFunction;
//自定义计时功能。输入时间在0.0到1.0之间。在行动期间。返回值必须为0-1.0并增加。当输入时间达到1.0时,函数必须返回1.0。
typedef float (^SCNActionTimingFunction)(float time);
action.timingMode = SCNActionTimingModeLinear;
action.timingFunction = ^float(float time) {
return 1.0 - time*time;
};
//速度系数
@property(nonatomic) CGFloat speed;
- SCNActionable协议
//运行动画
- (void)runAction:(SCNAction *)action API_AVAILABLE(macos(10.10));
//运行动画,动画结束block块
- (void)runAction:(SCNAction *)action completionHandler:(nullable void (^)(void))block API_AVAILABLE(macos(10.10));
//运行动画设置key值
- (void)runAction:(SCNAction *)action forKey:(nullable NSString *)key API_AVAILABLE(macos(10.10));
//运行动画设置key值,动画结束block块
- (void)runAction:(SCNAction *)action forKey:(nullable NSString *)key completionHandler:(nullable void (^)(void))block API_AVAILABLE(macos(10.10)); //是否正在动画
@property(nonatomic, readonly) BOOL hasActions API_AVAILABLE(macos(10.10));
//通过key值获取动画
- (nullable SCNAction *)actionForKey:(NSString *)key API_AVAILABLE(macos(10.10));
//通过key值移除动画
- (void)removeActionForKey:(NSString *)key API_AVAILABLE(macos(10.10));
//移除所有动画
- (void)removeAllActions API_AVAILABLE(macos(10.10));
//读取所有动画key值
@property(nonatomic, readonly) NSArray<NSString *> *actionKeys API_AVAILABLE(macos(10.10));
iOS开发之SceneKit框架--SCNAction.h的更多相关文章
- iOS开发之SceneKit框架--SCNParametricGeometry.h
1.SCNParametricGeometry简介 SCNParametricGeometry用于创建简单的3D模型,比如SCNPlane 平面.SCNPyramid 锥形(金字塔).SCNBox 立 ...
- iOS开发之SceneKit框架--SCNNode.h
1.SCNNode简介 SCNNode是场景图的结构元素,表示3D坐标空间中的位置和变换,您可以将模型,灯光,相机或其他可显示内容附加到该元素.也可以对其做动画. 2.相关API简介 初始化方法 // ...
- iOS开发之SceneKit框架--SCNLight.h
1.SCNLight简介 用于添加光源,连接到一个节点照亮现场,可以给场景添加不同的灯光,模拟逼真的环境. 2.四种灯光的简介 添加一个box立方体.一个tube圆柱管道和一个地板floor,没有灯光 ...
- iOS开发之SceneKit框架--SCNCamera.h
1.SCNCamera简介 被称为照相机或者摄像机,可以附加到节点以提供显示场景的角度.其实就是用户视角和人的眼睛一样. 2.相关API简介 初始化 //懒加载 + (instancetype)cam ...
- iOS开发之SceneKit框架--SCNGeometry.h
1.SCNGeometry简介 SCNGeometry负责呈现三维模型的类,它管理者物体的形状.纹理等.它可以由SCNGeometrySource和SCNGeometryElement来构造, 一个S ...
- iOS开发之SceneKit框架--SCNScene.h
1.SCNScene SCNScene是一个场景图——具有附加几何形状.光照.摄像机和其他属性的节点的层次结构,共同形成可显示的3D场景. 2.相关API简介 初始化方法 //懒加载 + (insta ...
- iOS开发之SceneKit框架--SCNView.h
1.SCNView 在macOS中,SCNView是NSView的子类,在iOS和tvOS中,SCNView是UIView的子类.SCNView用于显示SceneKit的3D场景,而需要设置场景的相关 ...
- iOS开发之SceneKit框架--加载多个模型.dae/.scn文件
1.通过SCNGeometry或子类SCNParametricGeometry创建 相关链接:iOS开发之SceneKit框架--SCNGeometry.h iOS开发之SceneKit框架--SCN ...
- iOS开发之SceneKit框架--实战地月系统围绕太阳旋转
1.创建地月太阳系统scn文件 注意:moon在earth结构下,earth和moon在sun结构下. 2.获取scn中模型的对应节点和自转(太阳为例) 获取节点: name是对应的Identity字 ...
随机推荐
- Hexo next主题添加站内搜索功能
根据关键字搜索博文,站内搜索的功能很实用.hexo开启站内搜索很方便,已经有现成的插件可以使用,也是为了方便自己 安装插件 npm install hexo-generator-search --sa ...
- SolidWorks直线命令快捷转换为圆弧命令
在进行草图绘制的时候,有时候需要切换到圆弧命令,此时来回切换比较麻烦, 我们可以将鼠标回碰线段起点,此时便成为了圆弧工具. 再次回碰,可改变圆心方向 利用鼠标操作,快捷切换绘图工具.
- cin,cout优化
https://www.cnblogs.com/PrayG/p/5749832.html ios_base::sync_with_stdio(0); cin.tie(0); 涨知识了
- JavaScript ---- 闭包(什么是闭包,为什么使用闭包,闭包的作用)
经常被问到什么是闭包? 说实话闭包这个概念很难解释.JavaScript权威指南里有这么一段话:“JavaScript函数是将要执行的代码以及执行这些代码作用域构成的一个综合体.在计算机学术语里,这种 ...
- C中空指针、NULL与0
空指针是指确保可以没有指向任何一个对象的指针.空指针常量值通常使用宏定义NULL来表示. 空指针和任何非空指针比较都不相等,因此经常作为函数异常时的返回值使用. 链表也经常在数据末尾放一个空指针提示后 ...
- 区别 |mysql |Timestamp、time、datetime
Timestamp 时间格式为 类似 2012-11-11 12:23:00 ,默认值为当前时间 time 时间格式类似12:23:00 默认值为null datetime 时间格式类似2012-11 ...
- thinkphp 缓存驱动
缓存驱动默认位于Think\Cache\Driver命名空间下面,目前已经提供了包括APC.Db.Memcache.Shmop.Sqlite.Redis.Eaccelerator和Xcache缓存方式 ...
- thinkphp 输入过滤
永远不要相信客户端提交的数据,所以对于输入数据的过滤势在必行,我们建议: 开启令牌验证避免数据的重复提交: 使用自动验证和自动完成机制进行初步过滤: 使用系统提供的I函数获取用户输入数据: 对不同的应 ...
- 「题解」:y
问题 B: y 时间限制: 1 Sec 内存限制: 256 MB 题面 题面谢绝公开. 题解 考虑双向搜索. 定义$cal_{i,j,k}$表示当前已经搜索状态中是否存在长度为i,终点为j,搜索过边 ...
- python 远程执行命令
1.简单版 # coding: utf-8 import paramiko import re from time import sleep def ssh(): ssh = paramiko.SSH ...