iOS で SceneKit を試す(Swift 3) その20 - ビルトインジオメトリ SCNFloor(無限の大きさを持つ平面)
Y軸 0、XZ 軸が無限の大きさを持つ平面。 初期値では原点に配置される。
Scene Editor でのパラメーター
オブジェクトライブラリの Floor を Scene Editor にドラッグ&ドロップして、Attributes Inspector を開く(Command + Option + 4)
1番上の Floor の項目で設定値が変更できる
Reflectivity
0 〜 1 の範囲の値で反射率を表す。 1 が完全に反射し 0 が反射なしとなり、デフォルトは 0.25
デフォルト値 0.25
値 1
Falloff start / Falloff end
反射の減退の開始と終わり。 デフォルトは共に 0 減退はしない。
start 0、end 0.6 にするとこのシーンの場合は以下のようになる。
start、end の間が少なすぎると急に減退し違和感が出るので注意。
Resolution factor
鏡面反射はシーンをオフスクリーンでシーンをレンダリング後、さらに床のテクスチャーをレンダリングして、 最終的にそれらを合わせたものを画面にレンダリングする。 この値は鏡面反射のレンダリング画質で 0 〜 1 の間で設定する。 デフォルトは iOS は 0.5、macOS は 1 となっており、iOS は負荷が少ないように設定されている。
値 0.1(反射画像の球の輪郭が荒い)
値 1.0(反射画像の球の輪郭が綺麗)
コード
コードで設定できる値で、幅、長さ、反射用のビットマスクがあるが、ほとんどの場合で使用する必要がないため割愛。
// シーン設定 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)
今回はここまで。