目標は、この OBJ ファイルの照明を再作成することです: https://poly.google.com/view/cKryD9VnDEZ
OBJ ファイルを SceneKit にロードするコード (上記のリンクからファイルをダウンロードできます):
let modelPath = "model.obj"
let url = NSURL(string: modelPath)
let scene = SCNScene(named: modelPath)!
sceneView.autoenablesDefaultLighting = true
sceneView.allowsCameraControl = true
sceneView.scene = scene
sceneView.backgroundColor = UIColor.white
これまでに試したオプション:
1) デフォルトのアンビエント ライティングは、Google Poly ライティングよりもはるかに厳しいです。アンビエント ライティングを削除すると、すべてがフラットになりすぎました。
2) 4 つの指向性ライトを使用する: モデルの前、後ろ、下、上にそれぞれ 1 つずつ。すべてのライトは、モデルを指すように角度が付けられています。これは最高でしたが、Google Polymer では見られなかったいくつかの影や粗い領域が残っていました。
3) オプション #2 にさらに 2 つのライトを追加しました。今回はライトを左右に追加します。追加のライトが 4 つの既存のライトと組み合わされ、モデルが白塗りされたため、これはオプション #2 よりも悪いものでした。
提案に従って更新してください:
コードは、環境光と指向性光を実装するようになりました。
ディレクショナル ライトをカメラ ノードに追加しても、シーン ルート ノードに追加しても、何らかの理由で違いはありませんでした。
ライトコードは以下です。
2 つの問題があります。
1) スクリーンショット 1 では、胸の右側が明るすぎてエッジが見えません。胸の左端の顔が暗すぎます。照明が最適な顔が中央にあります。どのようにすれば、すべての顔の照明をこのようにすることができますか (または、Google Poly の照明とよりよく一致させることができますか)?
2) スクリーンショット 2 では、ディレクショナル ライトは効果がないように見えます。1 つのアンビエント ライトと 1 つのディレクショナル ライトの推奨アーキテクチャを使用して、モデルの背面を前面と同じくらい軽量にするにはどうすればよいでしょうか?
コード:
// Create ambient light
let ambientLightNode = SCNNode()
ambientLightNode.light = SCNLight()
ambientLightNode.light!.type = .ambient
ambientLightNode.light!.color = UIColor(white: 0.50, alpha: 1.0)
// Add ambient light to scene
scene.rootNode.addChildNode(ambientLightNode)
// Create directional light
let directionalLight = SCNNode()
directionalLight.light = SCNLight()
directionalLight.light!.type = .directional
directionalLight.light!.color = UIColor(white: 0.40, alpha: 1.0)
directionalLight.eulerAngles = SCNVector3(x: Float.pi, y: 0, z: 0)
// Add directional light
scene.rootNode.addChildNode(directionalLight)