Apple Engine

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

SceneKit の変更点 (Xcode 11 Beta 1)

今回も SceneKit のセッションがなく、ドキュメントの説明もないのでメソッドやプロパティ名から予想。
間違っていたらすみません。

ちなみに、Scene Editor の変更がそれなりにありそうなのだが NDA 的に紹介できないのでそのうち。

 

長いので最初にまとめ

以下、主な更新内容

  • エリアライトの追加
  • リフレクションプローブの追加
  • シーン全体のスクリーンスペースリフレクションの追加
  • カメラエフェクトの追加と調整
  • マテリアルでクリアコートのプロパティが追加

 

SCNScene

シーン全体での Screen Space Reflection が追加。
wantsScreenSpaceReflection で有効 / 無効、
MaximumDistance は有効距離、SampleCount はサンプリング回数、
Stride は多分レイトレーシングのステップ数で反射回数。

var wantsScreenSpaceReflection: Bool { get set }
var screenSpaceReflectionMaximumDistance: CGFloat { get set }
var screenSpaceReflectionSampleCount: Int { get set }
var screenSpaceReflectionStride: CGFloat { get set }

 

SCNView

以下のものが廃止され、macOS 10.15 から OpenGL での描画が使用できなくなる。

var openGLContext: NSOpenGLContext?
var pixelFormat: NSOpenGLPixelFormat?

 

macOS 10.15 で追加。
ウインドウがリサイズされた時に描画の変更を非同期で行うか否か。
現状でも非同期になっていると思われるのでデフォルトは true。

var drawableResizesAsynchronously: Bool { get set }

 

SCNNode

SCNHitTestOption で ignoreLightArea が追加された。
LightType で追加されたエリアライトで表示されるジオメトリをヒットテストの対象から外すものだと思われる。

static let ignoreLightArea: SCNHitTestOption

 

SCNSceneRenderer

以下、3つが追加。ドキュメント上は必須の設定 (Required)
多分でデフォルト値が設定されているため、開発者側ですることはないと思われる。

var currentViewport: CGRect { get }
var isTemporalAntialiasingEnabled: Bool { get set }
var usesReverseZ: Bool { get set }

 

currentViewport は現状のビューポートを取得するものだと想定される。 isTemporalAntialiasingEnabled リアルタイムでアンチエイリアス状態の変更を有効化するか設定するものだろうと思われる。(詳細不明)

また、delegate が weak だったのが unowned(unsafe) に変更された。

 

SCNHitTestResult

SCNHitTestResult で取得できる座標で SCNVector3 や SCNMatrix4 で設定されていたものが simd に変更されたものだと思われる。

var simdLocalCoordinates: simd_float3 { get }
var simdLocalNormal: simd_float3 { get }
var simdModelTransform: simd_float4x4 { get }
var simdWorldCoordinates: simd_float3 { get }
var simdWorldNormal: simd_float3 { get }

 

SCNLight

エリアライト

エリアライトが追加された。

LightType で area が選択可能になり、
areaExtents は有効範囲。
areaType で線と矩形と多分自前で設定できる平面の多角形を選択。
areaPolygonVertices は自前でエリアライトの平面を設定。
doubleSided はエリアライトの平面を両面表示にし、
drawsArea はエリアライトの線と矩形、ポリゴンを描画するか否か。

static let area: SCNLight.LightType { get set }
var areaExtents: simd_float3 { get set }
var areaType: SCNLightAreaType { get set }
var areaPolygonVertices: [NSValue]? { get set }
var doubleSided: Bool { get set }
var drawsArea: Bool { get set }

 

SCNLightAreaType

エリアライトでの形状設定。
線と矩形と多分自前で設定できる平面の多角形。

case line
case polygon
case rectangle

 

リフレクションプローブ

リフレクションプローブが追加された。
ライトプローブは周囲の光を画像に書き込み周りに反映するが、リフレクションプローブは周囲の鏡面反射のような状態を画像に書き込む。

ゲームエンジンなどでは光の反射は現実のようには処理できないため、背景などは反射対象になるが、隣接するジオメトリは反射の対象にはならない。

そのため、リアルタイムレイトレーシングを行う必要があるが、リフレクションプローブを使うことで擬似的に反射させることができる。

probeType でライトプローブかリフレクションプローブを選択し、
probeEnvironment でライトのパラメーター、
probeExtents、probeOffset は有効範囲とオフセット、
probeUpdateType はラディアンスマップを作成するかリアルタイムにするかで、
parallax はラディアンスマップでつくったキューブマップの視差ををどうするか設定するものだと思われる。

var probeType: SCNLightProbeType
var probeEnvironment: SCNMaterialProperty?
var probeExtents: simd_float3
var probeOffset: simd_float3
var probeUpdateType: SCNLightProbeUpdateType
var parallaxCenterOffset: simd_float3
var parallaxCorrectionEnabled: Bool
var parallaxExtentsFactor: simd_float3

 

SCNLightProbeType

ライトプローブでの設定追加。
どちらかが、既存のライトプローブでもう片方がリフレクションプローブ。
多分 radiance がリフレクション。

case irradiance
case radiance

 

SCNLightProbeUpdateType

以前はラディアンスマップを画像として事前に作成させていたが、今回からリアルタイムで計算し直すオプションが増えた模様。

case never
case realtime

 

SCNCamera

HDR でブルーム効果のパラメーターが追加され、多分、ブルーム効果が綺麗になると思われ。
IterationCount 減衰を繰り返す数で、
bloomIterationSpread 減衰繰り返しの際の強さ。

var bloomIterationCount: Int { get set }
var bloomIterationSpread: CGFloat { get set }

 

ポストエフェクトが追加された。
grain は画面の荒さ、
whiteBalance はカラーグレーディングでホワイトバランスの調整。

var grainIntensity: CGFloat { get set }
var grainIsColored: Bool { get set }
var grainScale: CGFloat { get set }
var whiteBalanceTemperature: CGFloat { get set }
var whiteBalanceTint: CGFloat { get set }

 

こちら詳細不明。
ビューポートサイズから投影している画面の座標を取得するのではと思われる。

func projectionTransform(withViewportSize viewportSize: CGSize) -> SCNMatrix4

 

SCNMaterial

車のボディのようなクリアコートのプロパティが追加された。

現状の表現では Meralness や Roughness の数値を上げると表面が完全に反射したり、完全にぼやけてしまう。

多分、表面に透明な塗装をすることで車のボディなどで見る色のついた上から鏡面反射が付加された現実に近い表示がされる。

var clearCoat: SCNMaterialProperty { get }
var clearCoatNormal: SCNMaterialProperty { get }
var clearCoatRoughness: SCNMaterialProperty { get }

 

SCNParticlePropertyController

inputOrigin が weak から unowned(unsafe) に変更。

 

SCNBufferStream

以下に UnsafeRawPointer 変更

func writeBytes(_ bytes: UnsafeRawPointer, count length: Int)
func writeBytes(_ bytes: UnsafeMutableRawPointer, count length: Int)

 

SCNTechnique

MTLLibrary の読み書きが追加された。

var library: MTLLibrary? { get set }

 

SceneKit Constants

多分、使用できる OpenGL のバージョンか何かを調べることができる。

 

var SCN_ENABLE_OPENGL: Int32 { get }

 

SCNLayer

macOS にあった SCNLayer クラスが 10.15 廃止された。

 

以上、見た目の変更に関するものがほとんどとなった。