Apple Engine

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

Xcode 11 での SceneKit の変更点 その2 - エリアライト

エリアライト (Area Light) が追加された。
ライトタイプを area に変更するだけ。

let light = SCNLight()
light.type = .area

プロパティやメソッドなどは過去記事参照。

 

エリアライト

いわゆる面光源。
diffuse に柔らかに光を当て、面光源の形状のハイライトを付加する。

f:id:x67x6fx74x6f:20190930232427p:plain f:id:x67x6fx74x6f:20190930232530p:plain

 

3DCG DCC ツールのオフラインレンダラーの様なエリアシャドウの様な影を落とすことができない。
というか、影が落ちないので、スポットライトかディレクショナルライトを使用して別途 Differed にして影を落とす。

f:id:x67x6fx74x6f:20190930233131p:plain
Directional Light で影を追加したもの

 

エリアライトはノードのスケール以外に、エリアライト自体で大きさを設定でき、両面の描画したり、ハイライトとして光を落とすが面光源自体を描画しない設定がある。

用意されている設定は矩形しかないが、NSValue で X、Y を設定した配列を使い自由な形状の面光源を設定できる。

f:id:x67x6fx74x6f:20190930233500p:plain

let light = SCNLight()
light.type = .area

light.areaPolygonVertices = [
    NSValue(cgPoint: CGPoint(x: 0, y: 0)),
    NSValue(cgPoint: CGPoint(x: 0.2361, y: 0.7265)),
    NSValue(cgPoint: CGPoint(x: 1.0, y: 0.7265)),
    NSValue(cgPoint: CGPoint(x: 0.382, y: 1.1756)),
    NSValue(cgPoint: CGPoint(x: 0.618, y: 1.9021)),
    NSValue(cgPoint: CGPoint(x: 0.0, y: 1.4531)),
    NSValue(cgPoint: CGPoint(x: -0.618, y: 1.9021)),
    NSValue(cgPoint: CGPoint(x: -0.382, y: 1.1756)),
    NSValue(cgPoint: CGPoint(x: -1.0, y: 0.7265)),
    NSValue(cgPoint: CGPoint(x: -0.2361, y: 0.7265))
]

 

エリアライトは 2D 平面のライトを設定するため、3D 形状の光を与えたい場合はライトプローブを使用する。

 

エリアライトのバグ

エリアライトの描画が欠けることがある。
Feedback へバグリポート済み。

 

次回はリフレクションプローブについて。