Apple Engine

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

iOS で SceneKit を試す(Swift 3) その20 - ビルトインジオメトリ SCNFloor(無限の大きさを持つ平面)

Y軸 0、XZ 軸が無限の大きさを持つ平面。 初期値では原点に配置される。

f:id:x67x6fx74x6f:20170711161008p:plain

 

Scene Editor でのパラメーター

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

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

f:id:x67x6fx74x6f:20170711161036p:plain

 

Reflectivity

0 〜 1 の範囲の値で反射率を表す。 1 が完全に反射し 0 が反射なしとなり、デフォルトは 0.25

 

デフォルト値 0.25

f:id:x67x6fx74x6f:20170711161106p:plain

 

値 1

f:id:x67x6fx74x6f:20170711161143p:plain

 

Falloff start / Falloff end

反射の減退の開始と終わり。 デフォルトは共に 0 減退はしない。

start 0、end 0.6 にするとこのシーンの場合は以下のようになる。

f:id:x67x6fx74x6f:20170711161207p:plain

 

start、end の間が少なすぎると急に減退し違和感が出るので注意。

 

Resolution factor

鏡面反射はシーンをオフスクリーンでシーンをレンダリング後、さらに床のテクスチャーをレンダリングして、 最終的にそれらを合わせたものを画面にレンダリングする。 この値は鏡面反射のレンダリング画質で 0 〜 1 の間で設定する。 デフォルトは iOS は 0.5、macOS は 1 となっており、iOS は負荷が少ないように設定されている。

値 0.1(反射画像の球の輪郭が荒い)

f:id:x67x6fx74x6f:20170711161401p:plain

 

値 1.0(反射画像の球の輪郭が綺麗)

f:id:x67x6fx74x6f:20170711161451p:plain

 

コード

コードで設定できる値で、幅、長さ、反射用のビットマスクがあるが、ほとんどの場合で使用する必要がないため割愛。

// シーン設定
let scnView = self.view as! SCNView
scnView.showsStatistics = true
scnView.allowsCameraControl = true

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)

// SCNFloor
let floor = SCNFloor()
floor.reflectivity = 0.25
floor.reflectionFalloffStart = 0
floor.reflectionFalloffEnd = 0
floor.reflectionResolutionScaleFactor = 0.5

let floorNode = SCNNode(geometry: floor)
scene.rootNode.addChildNode(floorNode)

// 鏡面反射用の球
let ball = SCNSphere(radius: 0.5)
let ballNode = SCNNode(geometry: ball)
ballNode.position = SCNVector3(0,1,0)
scene.rootNode.addChildNode(ballNode)

 

今回はここまで。