SCNPhysicsBody学习

创建SCNPhysicsBody

+ (instancetype)staticBody;

staticBody是一个不受外力或碰撞影响的物体,不能移动。比如地板、墙壁等。
必须把它附加到SCNNodephysicsBody属性上。附加到节点上后,会自动为节点创建物理形状。
对于包含自定义几何的节点,SceneKit出于对准确性和性能的折衷,创建的只是一个近似的物理形状。基于基本几何类(SCNBox, SCNSphere, SCNPyramid, SCNCone, SCNCylinder, 或者 SCNCapsule)的节点体验效果最好。
如果想手动创建物理形状,使用SCNPhysicsShape类方法。

+ (instancetype)dynamicBody;

dynamicBody是一个可以受力和碰撞影响的物体。
其余同staticBody

+ (instancetype)kinematicBody;

kinematicBody是一个不受外力或碰撞影响的物理实体,但它会在移动时造成碰撞影响其他物体。
其余同staticBody

举一个简单的例子:桌球游戏中,球桌是staticBody,球是dynamicBody,球杆是kinematicBody

+ (instancetype)bodyWithType:(SCNPhysicsBodyType)type shape:(nullable SCNPhysicsShape *)shape;

根据指定类型和形状创建一个物理实体。
如果将nil传递给shape,在将它附加到节点上时,会自动根据节点创建物理性状。
其余同staticBody

定义力如何影响物体

@property(nonatomic, retain) SCNPhysicsShape *physicsShape;

在碰撞检测中物体的形状。
在碰撞检测时往往没必要用真实的几何形状,用简单的形状可以得到更好的性能。通常我们把physicsShape设置为一个简单的形状,把真实的几何形状放里面。
当然对于精准的碰撞测试,我们需要使用更详细的几何图形。
创建物理图形的细节参见SCNPhysicsShape类。

@property(nonatomic) SCNPhysicsBodyType type;

typedef enum SCNPhysicsBodyType : NSInteger {
    SCNPhysicsBodyTypeStatic,
    SCNPhysicsBodyTypeDynamic,
    SCNPhysicsBodyTypeKinematic
} SCNPhysicsBodyType;

物体的类型,枚举类型,就是上文中的staticBodydynamicBodykinematicBody

@property(nonatomic) SCNVector3 velocityFactor;

移动因子
例如,可以通过将其速度因子设置为{1.0,1.0,0.0},从而使物体只能在在两个维度中移动。

@property(nonatomic) SCNVector3 angularVelocityFactor;

旋转因子
例如,可以通过将其旋转因子设置为{0.0,1.0,0.0},从而使物体只能在一个轴上旋转。

@property(nonatomic, getter=isAffectedByGravity) BOOL affectedByGravity;

是否受重力影响
这个属性默认是YES

定义物体的属性

@property(nonatomic) CGFloat mass;

质量,以千克为单位。
质量会影响物体对力的反应。dynamicBody的默认质量是1。staticBodykinematicBody的默认质量为0,但它们不受质量影响。
物理模拟的影响取决于不同物体的相对质量,而不是绝对值。所以你不需要对应用程序中的物体进行实际测量。

@property(nonatomic) CGFloat charge;

电荷,以库仑为单位。
当受到电场或磁场影响时,带有正电荷或负电荷的物体的行为会不同。三种类型的物体的默认电荷均为0,即不会受电场和磁场的影响。
同样不需要去做实际测量。

@property(nonatomic) CGFloat friction;

滑动摩擦力。
当两个物体接触并滑动时,摩擦力决定它们对运动的阻力。如果两个物体的摩擦力都是0,它们会自由地滑动。如果都是1,就不会滑动。默认值为0.5。

@property(nonatomic) CGFloat rollingFriction;

滚动摩擦力。
圆型物体在滚动时的阻力。如果是0,将持续滚动而不减速,除非另有动作。如果是1,将无法滚动。默认值为0。

@property(nonatomic) CGFloat restitution;

可以理解成弹性。
决定了物体在碰撞过程中会保留多少动能。比如一个球掉在地面,如果是0,就不会反弹。如果是1,就会弹回原处。如果大于1,它会弹得比原来更高。默认值是0.5。

@property(nonatomic) CGFloat damping;

移动阻尼。
类似空气摩擦或水摩擦,就是在移动中的阻力。与其他的力独立并共存。如果是0,表示没有阻力,不会造成速度损失。如果是1,就会阻止物体移动。默认值是0.1。

@property(nonatomic) CGFloat angularDamping;

旋转阻尼。
同上,影响物体在旋转中的阻力。默认值是0.1。

@property(nonatomic) SCNVector3 momentOfInertia;

惯性矩阵。
比如x<y时,表示物体在x轴上旋转时的惯性更小,就能够更加自由旋转。
默认情况下,SceneKit会根据物体的形状和质量自动确定惯性矩阵。如果要自定义,需要设置usesDefaultMomentOfInertiaNO

@property(nonatomic) BOOL usesDefaultMomentOfInertia;

是否自动计算物体的惯性矩矩形。
YES为自动计算,NO为自定义设置。

分类

@property(nonatomic) NSUInteger categoryBitMask;

物体的分类。
每个分类都是位掩码的一个位。我们可以通过位运算给物体设置一个或多个类别。
physicsshapecontacttestbitmask一起使用可以定义物体间的相互作用。
dynamicBodykinematicBody的默认类别是SCNPhysicsCollisionCategoryDefaultstaticBody的默认类别为SCNPhysicsCollisionCategoryStatic

@property(nonatomic) NSUInteger contactTestBitMask;

定义哪些类别的物体与这个物体接触时会收到通知。
当物体A与物体B接触时,SceneKit会比较A.contactTestBitMask&&B.categoryBitMask,如果结果是一个非零的值,会创建一个SCNPhysicsContact对象,我们可以通过contactDelegate来处理我们需要自定义的一些操作。通常为了获得最好的性能,只需为我们感兴趣的交互中的物体设置contactTestBitMask
iOS8或者OS X v10.10的环境下,当且仅当碰撞发生了,SceneKit才会触发delegate。iOS9或者OS X v10.11以后的版本,这个值默认是0,且不管是碰撞,还是穿过彼此,都会触发delegate.

@property(nonatomic) NSUInteger collisionBitMask;

定义哪些分类的物体可以和这个物体发生碰撞。
当物体A与物体B接触时,可能会发生碰撞。SceneKit会比较A.collisionBitMask&&B.categoryBitMask。如果结果是一个非零值,那么物体会发生碰撞。每个物体可以单独选择想发生碰撞的物体。
默认值是SCNPhysicsCollisionCategoryAll,将于所有的类别发生碰撞。

用力

- (void)applyForce:(SCNVector3)direction impulse:(BOOL)impulse;

给物体的质心施加一个力或冲量。
direction:力的大小和方向
impulse:YES,施加的是冲量;NO,施加的是力
物体线性加速度与质量成正比。
impulse参数决定了这个方法如何进行物理模拟。(复习力学知识)
如果设置为YES,会把direction参数作为一个冲量。单位是牛秒(kgm/s 或 N·s = Huygens Hy),并立即加速物体。比如发射炮弹等。
如果设置为NO,会把direction参数作为一个力。单位是牛顿(N),SceneKit会在每一帧的最后,将所有的力都应用到物体上,从而得到一个加速度。
impulse参数改变了量值的单位,如果是冲量,将在每一帧上连续产生一定的加速度,如果紧在一帧里应用,那么加速度将大大降低。
同样不需要去做实际测量。

- (void)applyForce:(SCNVector3)direction atPosition:(SCNVector3)position impulse:(BOOL)impulse;

给物体的某个位置施加一个力或冲量。
position:物体所在的SCNNode的自身坐标系中,施加力或冲量的点。
其余参数同上
在物体的质心以外的位置上施加一个力或冲量,可以是线性加速度或角加速度,这取决于物体在物理世界中的位置,以及作用于它的其他力。

- (void)applyTorque:(SCNVector4)torque impulse:(BOOL)impulse;

给物体施加一个扭矩(旋转的力)或角动量(旋转的冲量)。
torque :方向和大小的扭矩(牛·米)或角动量的变化(在newton-meter-seconds),相对于场景的世界坐标空间。
impulse :YES,施加的是角动量;NO,施加的是扭矩
施加扭矩或角动量到物体上,其角速度与物体的质量、形状有关,此外这并不会影响到物体的线性加速度。

- (void)clearAllForces;

取消所有持续的力或扭矩。

管理物体运动

@property(nonatomic) SCNVector3 velocity;

物体当前运动速度(米/秒)和方向。
在SCNSceneRendererDelegate协议中的任何方法中调用,返回的是物理模拟的当前结果,设置属性会立即应用更改。
在其他时间调用,返回的是最后一次设置的值,设置属性会在下一次渲染循环的过程时生效。

@property(nonatomic) SCNVector4 angularVelocity;

物体当前的旋转轴和旋转速度(弧度/秒)。
从旋转轴指定的方向看,正值代表逆时针旋转。
其余同上。

@property(nonatomic, readonly) BOOL isResting;

表示物体是否出于静止状态。
默认是NO。但是物体没有动,并且没有收到任何力。SceneKit会自动将值变成YES。

@property(nonatomic) BOOL allowsResting;

是否自动将物体设置为“静止”
物理模拟的物体越少,可以提升模拟的性能。
设为YES,将提高模拟性能。
设为NO,将提高准确性。


这里涉及到了很多编程以外的物理知识,需要彻底搞懂的话需要恶补物理先。笑cry。

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

推荐阅读更多精彩内容

  • 首先要熟悉一些基本的力学名词及相关公式 刚体(Rigidbody):刚体是指在运动中和受到力的作用后,形状和大小不...
    FLY旳影子阅读 11,435评论 0 11
  • 简介 增强现实技术(Augmented Reality,简称 AR),是一种实时地计算摄影机影像的位置及角度并加上...
    牛奈奈阅读 1,251评论 1 3
  • 111. [动画系统]如何将其他类型的动画转换成关键帧动画? 动画->点缓存->关键帧 112. [动画]Unit...
    胤醚貔貅阅读 12,948评论 3 90
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,596评论 18 139
  • 实践100天走来第44天,养成从早起到跑步再到早睡,3个好习惯,真是个神奇的体验。 最大的收获是爱非坚持的理念体会...
    方锦扬阅读 285评论 0 0