Apple Engine

Apple, iPhone, iOS, その周辺のことについて

iOS で SceneKit を試す(Swift 3) その66 - PhysicsBody の当たり判定 PhysicsShape について

まず、最初にあたり判定から。

Scene Editor のデフォルト、もしくはコードで SCNPhysicsBody 設定の際 nil を渡すと、 そのジオメトリの形状が当たり判定となる。

また、当たり判定のジオメトリが荒いほど物理シミュレーションの演算が軽くなる。

 

Scene Editor での表示

Scene Editor では当たり判定が緑色のワイアーフレームで表示される。

デフォルトの場合、その形状になるため、
球を配置すると、球の当たり判定となる。

f:id:x67x6fx74x6f:20170815165903p:plain

 

Scene Editor での設定

SceneEditor で ノードを選択し、Physics Inspector (Command + Option + 6) を開くと下の方に Physics Shape の設定がある。

こちらを編集することで当たり判定を変更することができる。

f:id:x67x6fx74x6f:20170815165935p:plain

 

Shape

Default shape はジオメトリの形状を使用し、以下はビルトインのジオメトリ、最後の Custom Node は自前で設定したジオメトリを適応する。

f:id:x67x6fx74x6f:20170815170316p:plain

  • Default shape
  • Sphere
  • Cylinder
  • Panel
  • Pyramid
  • Cone
  • Tube
  • Capsule
  • Torus
  • Custom Node

 

Type

  • Convex
  • Bounding Box

Convex はデフォルトで Shape で設定したおおよその形状を利用し、Bounding Box はジオメトリを囲んだ直方体を変邸に利用する。

 

Scale

当たり判定である Shape の大きさ。デフォルトは 1 でフィットする。

 

Collision Margin

ドキュメントに説明がないが、文字通り当たり判定である Shape にマージンを加える。

Scale 1、Collision Margin 2 の時と、Scale 2、Collision Margin 1 の場合はほぼ同等の振る舞い。

 

コード

コード上にのみあるものは keepAsCompound の設定と、Type になかった SCNPhysicsShape.ShapeType.concavePolyhedron

keepAsCompound はデフォルトで true。
当たり判定となる SCNNode の形状を合成する模様。

ShapeType の concavePolyhedron は Convex よりもちゃんとした形状で当たり判定をつくる模様。  

let ball = SCNSphere(radius: 1)
let ballNode = SCNNode(geometry: ball)
ballNode.position.y = 10

let ballShape = SCNPhysicsShape(geometry: ball, options: [
        SCNPhysicsShape.Option.scale : 1,
        SCNPhysicsShape.Option.type : SCNPhysicsShape.ShapeType.convexHull,
        SCNPhysicsShape.Option.collisionMargin : 0,
        SCNPhysicsShape.Option.keepAsCompound : true
    ])

ballNode.physicsBody = SCNPhysicsBody(type: .dynamic, shape: ballShape)

scene.rootNode.addChildNode(ballNode)

 

今回はここまで。