iOS で SceneKit を試す(Swift 3) その66 - PhysicsBody の当たり判定 PhysicsShape について
まず、最初にあたり判定から。
Scene Editor のデフォルト、もしくはコードで SCNPhysicsBody 設定の際 nil を渡すと、 そのジオメトリの形状が当たり判定となる。
また、当たり判定のジオメトリが荒いほど物理シミュレーションの演算が軽くなる。
Scene Editor での表示
Scene Editor では当たり判定が緑色のワイアーフレームで表示される。
デフォルトの場合、その形状になるため、
球を配置すると、球の当たり判定となる。
Scene Editor での設定
SceneEditor で ノードを選択し、Physics Inspector (Command + Option + 6) を開くと下の方に Physics Shape の設定がある。
こちらを編集することで当たり判定を変更することができる。
Shape
Default shape はジオメトリの形状を使用し、以下はビルトインのジオメトリ、最後の Custom Node は自前で設定したジオメトリを適応する。
- 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)
今回はここまで。