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<NSString*,id>*)arguments;
node:要渲染的节点
renderer:渲染到的场景渲染器
arguments:(参数) 字典,其值是包装在NSValue对象中的SCNMatrix4矩阵
自定义渲染的首选方法是调整节点几何的不同材质的材质属性。 SCNMaterial符合SCNShadable协议,并允许使用GLSL进行更高级的渲染。
您通常使用具有没有几何的节点的渲染器代理,并且仅用作空间中的位置。 一个例子是将粒子系统附加到该节点,并用自定义的OpenGL代码渲染它。
只有绘图调用和实现它们的方法应该在渲染器委托回调期间执行,模型(节点,几何体...)中的任何更改都会导致意外的结果。
FOUNDATION_EXTERN NSString*constSCNModelTransform;//模型转换FOUNDATION_EXTERN NSString*constSCNViewTransform;//视图转换FOUNDATION_EXTERN NSString*constSCNProjectionTransform;//投影转换FOUNDATION_EXTERN NSString*constSCNNormalTransform;//正常转换FOUNDATION_EXTERN NSString*constSCNModelViewTransform;//正常模型视图转换FOUNDATION_EXTERN NSString*constSCNModelViewProjectionTransform;//模型视图投影转换
可移动的提示
typedefNS_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 *)namerecursively:(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)positiontoNode:(nullableSCNNode *)node;
position:(位置) 在接收器的本地坐标系中指定的位置
node:(节点)要转换其坐标系“位置”的节点. 如果“node”为nil,此方法将转换为世界坐标
改变位置: 从节点,将位置从给定节点的坐标系转换为接收器的坐标系
-(SCNVector3)convertPosition:(SCNVector3)positionfromNode:(nullableSCNNode *)node;
position:在"节点"的局部坐标系中指定位置)
node:要转换其坐标系“位置”的节点。 如果“node”为nil,则此方法将从世界坐标转换。
将接收器的坐标系统的变换转换为指定节点的坐标系
-(SCNMatrix4)convertTransform:(SCNMatrix4)transformtoNode:(nullableSCNNode *)node;
transform:(变换,改变,使...变形),在接收器的局部坐标系中指定的变换
node:要转换其坐标系“变换”的节. 如果“node”为nil,此方法将转换为世界坐标
将从给定节点的坐标系变换到接收器的坐标系的变换
-(SCNMatrix4)convertTransform:(SCNMatrix4)transformfromNode:(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<SCNHitTestResult*>*)hitTestWithSegmentFromPoint:(SCNVector3)pointA toPoint:(SCNVector3)pointB options:(nullableNSDictionary<NSString*,id>*)options;
pointA:段相对于接收器的第一点
pointB:段相对于接收器的第二点
options:可选参数(有关可用选项,请参阅SCNSceneRenderer.h中的“命中测试选项”一节
返回接收器子树中与指定段相交的每个节点的SCNHitTestResult数组
有关屏幕空间命中测试方法,请参阅SCNSceneRenderer.h