SCNNode 被称为节点,一个大型的游戏场景结构就是由无数个小的节点组成,它有自己的位置和自身坐标系统,我们可以把几何模型,灯光,摄像机的游戏中的真实元素,吸附到SCNNode 节点上
class | 名称 |
---|---|
CIFilter | 过滤器 筛选 |
SCNLight | 灯光 |
SCNCamera | 相机 |
SCNGeometry | 几何学 |
SCNSkinner | - |
SCNMorpher | 变形器 |
SCNConstraint | 约束 |
SCNPhysicsBody | 物理体 |
SCNPhysicsField | 物理领域 |
SCNPhysicsBody | - |
SCNHitTestResult | 点击测试结果 |
SCNRenderer | 渲染器 |
渲染代理
@property(nonatomic,assign,nullable)id rendererDelegate;
指定接收器的渲染器委托对象
设置渲染器委托可防止SceneKit渲染器绘制节点,并允许您使用自定义OpenGL代码
自定义渲染的首选方法是调整节点几何的不同材质的材质属性。 SCNMaterial符合SCNShadable协议,并允许使用GLSL进行更高级的渲染。
您通常使用具有没有几何节点,并且仅用作空间中位置的渲染代理。 例如将粒子系统附加到该节点,并用自定义的OpenGL代码渲染它。
当一个节点被渲染时调用
- (void)renderNode:(SCNNode *)node renderer:(SCNRenderer *)renderer arguments:(NSDictionary *)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
确认接收器的欧拉角.动画
此向量中组件的顺序与旋转轴相匹配:
- 1.节距(x分量)是关于节点x轴的旋转(以弧度表示)
- 2.Yaw(y分量)是围绕节点的y轴的旋转(以弧度表示)
- 3.滚动(z分量)是关于节点的z轴的旋转(以弧度表示)
SceneKit以与组件相反的顺序应用这些旋转:
- 1.首先滚动/转动
- 2.然后偏航
- 3.然后俯仰
规模/比例
@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 *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 *)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 *constraints;
应用于接收器的SCNConstraint数组
可以基于当前事务来隐式动画添加或删除约束
访问节点的过滤器
@property(nonatomic,copy,nullable)NSArray *filters;
应用于接收器及其子节点的渲染的Core Image过滤器数组。
默认为nil。 应该通过在过滤器附加到的每个节点上调用setValue:forKeyPath:来修改过滤器属性。 如果在将过滤器附加到节点之后直接修改过滤器的输入,则行为是未定义的
访问描述节点
@property(nonatomic,readonly)SCNNode *presentationNode;
返回包含当前事务开始时所有属性的节点的副本,并应用任何活动动画
这给出了当前显示的节点的版本的近似,尝试以任何方式修改返回的节点的效果未定义。 返回的节点不具有父节点和子节点
暂停
@property(nonatomic,getter=isPaused)BOOL paused;
控制节点的动作和动画是否已更新或已暂停. 默认为NO
Hit Testing in the Node,命中测试从段到点:到点:选项:
- (NSArray *)hitTestWithSegmentFromPoint:(SCNVector3)pointA toPoint:(SCNVector3)pointB options:(nullableNSDictionary *)options;
pointA
:段相对于接收器的第一点
pointB
:段相对于接收器的第二点
options
:可选参数(有关可用选项,请参阅SCNSceneRenderer.h中的“命中测试选项”一节
返回接收器子树中与指定段相交的每个节点的SCNHitTestResult数组
有关屏幕空间命中测试方法,请参阅SCNSceneRenderer.h