iOS学习开发 SceneKit学习iOS开发技术分享

SCNNode类

2018-11-08  本文已影响104人  弹吉他的少年

SCNNode 被称为节点,一个大型的游戏场景结构就是由无数个小的节点组成,它有自己的位置和自身坐标系统,我们可以把几何模型,灯光,摄像机的游戏中的真实元素,吸附到SCNNode 节点上

class 名称
CIFilter 过滤器 筛选
SCNLight 灯光
SCNCamera 相机
SCNGeometry 几何学
SCNSkinner -
SCNMorpher 变形器
SCNConstraint 约束
SCNPhysicsBody 物理体
SCNPhysicsField 物理领域
SCNPhysicsBody -
SCNHitTestResult 点击测试结果
SCNRenderer 渲染器

渲染代理

@property(nonatomic,assign,nullable)id <SCNNodeRendererDelegate> rendererDelegate;

指定接收器的渲染器委托对象
设置渲染器委托可防止SceneKit渲染器绘制节点,并允许您使用自定义OpenGL代码
自定义渲染的首选方法是调整节点几何的不同材质的材质属性。 SCNMaterial符合SCNShadable协议,并允许使用GLSL进行更高级的渲染。
您通常使用具有没有几何节点,并且仅用作空间中位置的渲染代理。 例如将粒子系统附加到该节点,并用自定义的OpenGL代码渲染它。

当一个节点被渲染时调用

- (void)renderNode:(SCNNode *)node renderer:(SCNRenderer *)renderer arguments:(NSDictionary<NSString *, id> *)arguments;

node:要渲染的节点
renderer:渲染到的场景渲染器
arguments:(参数) 字典,其值是包装在NSValue对象中的SCNMatrix4矩阵

自定义渲染的首选方法是调整节点几何的不同材质的材质属性。 SCNMaterial符合SCNShadable协议,并允许使用GLSL进行更高级的渲染。
您通常使用具有没有几何的节点的渲染器代理,并且仅用作空间中的位置。 一个例子是将粒子系统附加到该节点,并用自定义的OpenGL代码渲染它。
只有绘图调用和实现它们的方法应该在渲染器委托回调期间执行,模型(节点,几何体...)中的任何更改都会导致意外的结果。

FOUNDATION_EXTERN NSString *const SCNModelTransform;//模型转换
FOUNDATION_EXTERN NSString *const SCNViewTransform;//视图转换
FOUNDATION_EXTERN NSString *const SCNProjectionTransform;//投影转换
FOUNDATION_EXTERN NSString *const SCNNormalTransform;//正常转换
FOUNDATION_EXTERN NSString *const SCNModelViewTransform;//正常模型视图转换
FOUNDATION_EXTERN NSString *const SCNModelViewProjectionTransform;//模型视图投影转换

可移动的提示

typedef NS_ENUM(NSInteger, SCNMovabilityHint) {
    SCNMovabilityHintFixed,//fixed 固定的
    SCNMovabilityHintMovable,//Movable 可移动的
} 

节点

+ (instancetype)node;

创造和初始化一个节点实例

创建并初始化附加了指定几何的节点实例

+ (SCNNode *)nodeWithGeometry:(nullableSCNGeometry *)geometry;

geometry:要附加的几何体

复制节点

- (instancetype)clone;

返回接收器的副本。 返回的实例是自动释放的
复制是递归的:每个子节点也将被克隆。 对于非递归复制,请改用复制
复制的节点将与原始实例共享其附加对象(光,几何,摄像机,...)
如果您想要独立于原始对象更改副本的材质,则必须单独复制节点的几何。

平面克隆

- (instancetype)flattenedClone;

返回包含连接节点层次结构中包含的所有几何的几何的节点的克隆。
返回的克隆是自动释放的

管理节点属性

@property(nonatomic,copy,nullable)NSString *name;

确定接收器的名称

光源

@property(nonatomic,retain,nullable)SCNLight *light;

确定附加到接收器的光

相机

@property(nonatomic,retain,nullable)SCNCamera *camera;

确定附加到接收器的相机

geometry

@property(nonatomic,retain,nullable)SCNGeometry *geometry;

返回附加到接收器的几何体

skinner

@property(nonatomic,retain,nullable)SCNSkinner *skinner

返回附加到接收器的skinner

形态结构贴图

@property(nonatomic,retain,nullable)SCNMorpher *morpher;

返回附加到接收器的形态结构贴图

修饰节点的改变

改变

@property(nonatomic)SCNMatrix4 transform;

确定接收器的变化
变换是下面定义的位置,旋转和刻度的组合。 因此,当设置变换时,接收器的位置,旋转和缩放比例将更改为匹配新的变换

位置

@property(nonatomic)SCNVector3 position;

确定接收器的位置

旋转

@property(nonatomic)SCNVector4 rotation;

确定接收器的旋转
旋转是轴角旋转。 三个第一分量是轴,第四分量是旋转(弧度)

方向

@property(nonatomic)SCNQuaternion orientation

将接收器的方向确认为方向四元数

欧拉角

@property(nonatomic)SCNVector3 eulerAngles

确认接收器的欧拉角.动画
此向量中组件的顺序与旋转轴相匹配:

SceneKit以与组件相反的顺序应用这些旋转:

规模/比例

@property(nonatomic)SCNVector3 scale;

确定接收器比例

枢轴/中心

@property(nonatomic)SCNMatrix4 pivot;

确定接收器的中心

返回接收器的世界改变

@property(nonatomic,readonly)SCNMatrix4 worldTransform;

一个世界变化是相对于场景变化的

修饰节点的可见性

@property(nonatomic,getter=isHidden)BOOL hidden;

确认是否显示接收器.默认为NO

不透明的/不透明度

@property(nonatomic)CGFloat opacity;

确认接收器的不透明度.默认为1

渲染顺序/渲染命令

@property(nonatomic)NSInteger renderingOrder;

确定接收器的渲染顺序
渲染顺序是最后渲染最大节点.默认为0

投下阴影

@property(nonatomic)BOOL castsShadow;

确定节点是否在阴影贴图中呈现.默认为YES

可移动的线索

@property (nonatomic)SCNMovabilityHint movabilityHint;

提示忽略接收器的可移动性。 有关详细信息,请参阅上面的枚举。 默认为SCNMovabilityHintFixed

管理节点层次

父节点

@property(nonatomic,readonly,nullable)SCNNode *parentNode;

返回接收器的父节点

子节点

@property(nonatomic,readonly)NSArray<SCNNode *> *childNodes;

返回接收器的子节点数组

添加子节点

- (void)addChildNode:(SCNNode *)child;

child:要添加到接收器子节点数组的节点
返回:将节点追加到接收器的子节点数组

在指定索引处的子节点数组中插入节点

- (void)insertChildNode:(SCNNode *)child atIndex:(NSUInteger)index;

child:要插入的节点
index:在子节点数组中插入节点的索引

从父节点删除

- (void)removeFromParentNode;

删除的节点是来自于接收器父节点的子节点数组

从接收者的childNode数组中删除`child',如果非零,则插入'child2'

- (void)replaceChildNode:(SCNNode *)oldChild with:(SCNNode *)newChild;

oldChild:要替换的节点在childNodes数组中
newChild:将替换前一个节点的新节点。替换oldChild
如果child的parentNode不是接收者,则行为是未定义的

搜索节点的层次结构

- (nullableSCNNode *)childNodeWithName:(NSString *)name recursively:(BOOL)recursively;

name:要搜索的节点名称
recursively:如果你想搜索通过[递归]
返回在指定的节点树中找到的第一个节点,用遍历去搜索预订的树

通过测试的子节点

- (NSArray<SCNNode *> *)childNodesPassingTest:(NS_NOESCAPEBOOL (^)(SCNNode *child,BOOL *stop))predicate;

predicate:(谓语、断言)应用于接收器的子节点的block。 该block有两个参数:“child”是子节点,“stop”是对布尔值的引用。 该block可以将值设置为YES以停止进一步处理节点层次结构。 stop参数是一个out-only参数。 您应该只在block内将此布尔设置为YES。 该block返回一个布尔值,指示“child”是否通过测试。
返回在给定的block中通过测试的接收器的子节点,搜索是递归的,并且使用预定树遍历

罗列使用block的子节点

- (void)enumerateChildNodesUsingBlock:(NS_NOESCAPEvoid (^)(SCNNode *child,BOOL*stop))block;

block:应用于接收器子节点的block。 该block有两个参数:“child”是子节点,“stop”是对布尔值的引用。 该block可以将值设置为YES以停止进一步处理节点层次结构。 stop参数是一个out-only参数。 你应该只在block内将此布尔设置为YES。
在接收器下的每个子节点上执行给定的block,搜索是递归的,并且使用预定树遍历

列举使用block的层级

- (void)enumerateHierarchyUsingBlock:(NS_NOESCAPEvoid (^)(SCNNode *node,BOOL*stop))block;

block:应用于接收器及其子节点的block。 该block采用两个参数:“节点”是接收器(包括接收器)的层次结构中的节点,“停止”是对布尔值的引用。 该block可以将值设置为YES以停止进一步处理节点层次结构。 stop参数是一个out-only参数。 你应该只在block内将此布尔设置为YES。
执行在接收器和子节点上给定的block,搜索是递归的,并且使用预定树遍历

在节点坐标系之间转换

改变位置:到节点,将接收器的坐标系统的位置转换为指定节点的位置

- (SCNVector3)convertPosition:(SCNVector3)position toNode:(nullableSCNNode *)node;

position:(位置) 在接收器的本地坐标系中指定的位置
node:(节点)要转换其坐标系“位置”的节点. 如果“node”为nil,此方法将转换为世界坐标

改变位置: 从节点,将位置从给定节点的坐标系转换为接收器的坐标系

- (SCNVector3)convertPosition:(SCNVector3)position fromNode:(nullableSCNNode *)node;

position:在"节点"的局部坐标系中指定位置)
node:要转换其坐标系“位置”的节点。 如果“node”为nil,则此方法将从世界坐标转换。

将接收器的坐标系统的变换转换为指定节点的坐标系

- (SCNMatrix4)convertTransform:(SCNMatrix4)transform toNode:(nullableSCNNode *)node;

transform:(变换,改变,使...变形),在接收器的局部坐标系中指定的变换
node:要转换其坐标系“变换”的节. 如果“node”为nil,此方法将转换为世界坐标

将从给定节点的坐标系变换到接收器的坐标系的变换

- (SCNMatrix4)convertTransform:(SCNMatrix4)transform fromNode:(nullableSCNNode *)node;

transform:在“node”的局部坐标系中指定的变换)
node:要转换其坐标系“变换”的节点。 如果“node”为nil,则此方法将从世界坐标转换

管理SCNNodel的物理体,接收器的物理体的描述

@property(nonatomic,retain,nullable)SCNPhysicsBody *physicsBody;

管理节点的物理场

@property(nonatomic,retain,nullable)SCNPhysicsField *physicsField;

接收器的物理场的描述,默认为nil

管理节点的约束

@property(copy,nullable)NSArray<SCNConstraint *> *constraints;

应用于接收器的SCNConstraint数组
可以基于当前事务来隐式动画添加或删除约束

访问节点的过滤器

@property(nonatomic,copy,nullable)NSArray<CIFilter *> *filters;

应用于接收器及其子节点的渲染的Core Image过滤器数组。
默认为nil。 应该通过在过滤器附加到的每个节点上调用setValue:forKeyPath:来修改过滤器属性。 如果在将过滤器附加到节点之后直接修改过滤器的输入,则行为是未定义的

访问描述节点

@property(nonatomic,readonly)SCNNode *presentationNode;

返回包含当前事务开始时所有属性的节点的副本,并应用任何活动动画
这给出了当前显示的节点的版本的近似,尝试以任何方式修改返回的节点的效果未定义。 返回的节点不具有父节点和子节点

暂停

@property(nonatomic,getter=isPaused)BOOL paused;

控制节点的动作和动画是否已更新或已暂停. 默认为NO

Hit Testing in the Node,命中测试从段到点:到点:选项:

- (NSArray<SCNHitTestResult *> *)hitTestWithSegmentFromPoint:(SCNVector3)pointA toPoint:(SCNVector3)pointB options:(nullableNSDictionary<NSString *,id> *)options;

pointA:段相对于接收器的第一点
pointB:段相对于接收器的第二点
options:可选参数(有关可用选项,请参阅SCNSceneRenderer.h中的“命中测试选项”一节
返回接收器子树中与指定段相交的每个节点的SCNHitTestResult数组
有关屏幕空间命中测试方法,请参阅SCNSceneRenderer.h

上一篇下一篇

猜你喜欢

热点阅读