Apple Engine

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

iOS で SceneKit を試す(Swift 3) その22 - ビルトインジオメトリ SCNCapsule(カプセル型)

円柱の上下に半球をつけたカプセル型のジオメトリ。

f:id:x67x6fx74x6f:20170711175106p:plain

 

Scene Editor でのパラメーター

オブジェクトライブラリの Capsule を Scene Editor にドラッグ&ドロップして、Attribute Inspector を開く(Command + Option + 4)

1番上の Capsule の項目で設定値が変更できる

f:id:x67x6fx74x6f:20170711175122p:plain

 

Dimensions

Cap radius

カプセルの半径。
初期値は 0.25。

 

Cap radius

カプセルの高さ(半球部分も含む)
初期値は 1。

 

高さは半球含むため、高さ 1、半径 0.5 にすると球体になる。

 

Segment Count

Radial

半球外周部分のポリゴンの分割数。
初期値は 48。

 

Height

円柱の分割数。
初期値は 1。

 

Cap

半球の高さ部分のポリゴンの分割数。
初期値は 24。

 

下記のコードのセグメントを分割した例。

  • 半球外周部分 16
  • 半球の高さ 3
  • 円柱の高さ 2

f:id:x67x6fx74x6f:20170711175218p:plain

 

コード

// シーン設定
let scnView = self.view as! SCNView
scnView.showsStatistics = true
scnView.allowsCameraControl = true
scnView.debugOptions = .showWireframe // ワイヤーフレーム表示

let scene = SCNScene()
scene.background.contents = UIColor.white
scnView.scene = scene

// カメラ設定
let cameraNode = SCNNode()
cameraNode.camera = SCNCamera()
cameraNode.position = SCNVector3(2.372,1.473,2.399)
cameraNode.eulerAngles = SCNVector3(-Float.pi * 0.125,Float.pi * 0.25,0)
scene.rootNode.addChildNode(cameraNode)

// ライト設定
let lightNode = SCNNode()
let omniLight = SCNLight()
omniLight.type = .omni
lightNode.light = omniLight
lightNode.position = SCNVector3(0,5,0)
scene.rootNode.addChildNode(lightNode)

// SCNCapsule
let capsule = SCNCapsule(capRadius: 0.25, height: 2)

/*
capsule.capRadius = 0.25
capsule.height = 2
*/

capsule.radialSegmentCount = 16
capsule.heightSegmentCount = 2
capsule.capSegmentCount = 3

capsule.firstMaterial?.diffuse.contents = UIColor.black // ワイヤーフレームを見やすくするため黒色に。

let node = SCNNode(geometry: capsule)
node.eulerAngles = SCNVector3(Float.pi * 0.2, 0, -Float.pi * 0.075)
scene.rootNode.addChildNode(node)

 

注意点

ノードの拡大縮小を変更した場合、半球の部分を保って変形されることはない。
特に Y 軸の変更の際は注意。

f:id:x67x6fx74x6f:20170711175733p:plain

 

今回はここまで。