SCNNode类

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容