Apple Engine

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

Xcode 11 での SceneKit の変更点 その6 - マテリアルの追加機能

マテリアルにクリアコートが追加された。

車のボディ、プラモデルの塗装やネイルなどで使用される通常の塗装の上に透明な塗料を塗ることで塗装の光沢が変わる見た目を表す。

光沢を足すため暗いマテリアルのカラーだったり、クリアコートの Intensity の数値を上げるとわかりやすくなる。

マテリアルプロパティはクリアコート、クリアコートのノーマル、クリアコートのラフネス。

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

 

クリアコート (ClearCoat)

マテリアルにクリアコート用のテクスチャを適応させると、通常のラフネスとは反対にテクスチャの明るい部分が明るい色で加算される。

f:id:x67x6fx74x6f:20191005044422p:plain
元のマテリアル

f:id:x67x6fx74x6f:20191005044459p:plain
通常の Roughness

f:id:x67x6fx74x6f:20191005044604p:plain
ClearCoart

 

ちなみに、以下のクリアコートノーマル、クリアコートラフネスはこのパラメーターの Intensity が 0 だと反応せずと適応されない。

 

クリアコートノーマル (ClearCoat Normal)

法線の画像をからクリアコートの凹凸による光沢を設定する。
通常のノーマルイメージより全体的に明るくなる。

f:id:x67x6fx74x6f:20191005044741p:plain
通常の Normal テクスチャ

f:id:x67x6fx74x6f:20191005044909p:plain
ClearCoat の Normal テクスチャ

 

クリアコートラフネス (ClearCoat Roughn es)

クリアコートの表面の荒さを設定する。
テクスチャ画像で暗い部分はクリアコートの塗装がかかっていない様な状態を指しているのだろうとは思われる。

f:id:x67x6fx74x6f:20191005045010p:plain

 

今回で Xcode 11 での SceneKit の変更はおしまい。
ざっと書いてみたが面白い機能が増えたとは思う。

書き忘れがあったので追加。
次回はマテリアルの新しいライティングモデルについて。

Xcode 11 での SceneKit の変更点 その5 - カメラの機能追加

カメラで3つの機能が追加された。
Scene Editor で3つ目の機能を使用し操作すると現状では Xcode が 100% クラッシュするので注意。

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

 

Bloom の追加機能

Scene Editor 上でカメラの Bloom に Iteration と Spread のパラメーターが追加された。
コード的には bloomIterationCount と bloomIterationSpread。

Iteration は範囲の繰り返し回数だと思われて柔らかに光が広がる。
Spread はその範囲で強さが上がり光が飽和していく光が飽和していく。

1枚目は通常の Bloom、2枚目はそれに Iteration を増やし、3枚目はさらに Spread を増やしたもの。

f:id:x67x6fx74x6f:20191003220631p:plain f:id:x67x6fx74x6f:20191003220701p:plainf:id:x67x6fx74x6f:20191003220716p:plain    

ちなみに Scene Editor でカメラの HDR オンにするか、コードで wantsHDR を true にしないと効果は出ない。

 

カラーグレーディング(カラーコレクション)でホワイトバランス調整機能が追加

Scene Editor 上でカメラの Color Grading に Temperature と Tint が追加された。
ホワイトバランスの色温度と色合いで、共に -5 から +5 の値で変化する。
コードでは whiteBalanceTemperature と whiteBalanceTint。

最初の画像はそのままで、
それ以降、Temperature や Tint 設定値を入れてみたもの。

f:id:x67x6fx74x6f:20191003220934p:plainf:id:x67x6fx74x6f:20191003220945p:plainf:id:x67x6fx74x6f:20191003220959p:plainf:id:x67x6fx74x6f:20191003221011p:plainf:id:x67x6fx74x6f:20191003221023p:plainf:id:x67x6fx74x6f:20191003221038p:plainf:id:x67x6fx74x6f:20191003221048p:plain  

Grain

f:id:x67x6fx74x6f:20191003222802p:plain

ARKit 使用時に室内など暗い場合、表や背面カメラでノイズが載ってしまうため、カメラ映像から推定したノイズを仮想オブジェクトに載せ違和感を減らす処理。

プレビューでシーンのカメラを選択して、その Grain の intensity を触ると 100% Xcode がクラッシュするので注意。

 

次回はマテリアルの追加機能について。

Xcode 11 での SceneKit の変更点 その4 - スクリーンスペースリフレクション

f:id:x67x6fx74x6f:20191002222729p:plain

 

スクリーンスペースリフレクション (Screen-Space Reflection) とは

前回のリフレクションプローブと異なりカメラから反射を推定する。
そのため正確な反射にならない場合が多いが、それっぽい感じの表現をすることができる。
リフレクションプローブはライトだが、 スクリーンスペースリフレクションはシーンで設定するのであまり考えることが少ない。

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

 

以下の画像は通常のものとスクリーンスペースリフレクションのパラメーターを付加したもの。

f:id:x67x6fx74x6f:20191002222808p:plain f:id:x67x6fx74x6f:20191002222836p:plain

 

これまでの SceneKit で使用されなかったわけではなく、似た様なものを指すなら SCNFloor だろう。
平面というのが約束されているため、SCNFloor の場合、カメラから反射した位置にもう1つのカメラを置き、この結果を SCNFloor にマテリアルに足している。

 

注意点

スクリーンスペースリフレクションはシーンに設定される。
そのためのリフレクションプローブがかかっていると異なる反射が両方とも適応されるので注意。

 

次回はカメラの機能追加について。

Xcode 11 での SceneKit の変更点 その3 - リフレクションプローブ

f:id:x67x6fx74x6f:20191001221713p:plain

 

リフレクションプローブ(Reflection Probe)とは?

ライトプローブ同様に周囲の光(色)をキューブマップとして焼き込み、周りの反射するマテリアルに適応する。設定方法はライトプローブと変わらない。
ARKit の environmentTexturing プロパティ、AREnvironmentProbeAnchor で生成される環境マップの表面反射と同様。

ただし、ARKit はカメラ画像から推論して周囲の画像を生成しているが、リフレクションプローブはカメラからちゃんと画像を生成する。

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

 

リフレクションプローブが反射するため物体を捉えるエリアとそれを使用した反射を適応できる範囲を設定することができ、
そしてリフレクションプローブが生成する環境マップの適応を位置をオフセットとしてずらすことができる。

以下の画像の白い球体の枠が反射する物体の範囲。
赤い立方体は反射の影響を受ける物体の範囲。
背景は白い範囲外でも影響を受け、赤い立方体から外れるとリフレクションプローブの影響を受けなくなる。

f:id:x67x6fx74x6f:20191001222059p:plain

 

また、ライトプローブの様に Manual で開発者側が計算してテクスチャを生成するのだが、リフレクションプローブはリアルタイム (Scene Editor では Live) で周囲の情報を取得することができる。

Scene Editor で Manual に設定した場合、ライトプローブと同様に Compute ボタンを押してテクスチャを生成する必要がある。

f:id:x67x6fx74x6f:20191001221858p:plain
Manual 設定。わかりづらいがパーティクルが反映されている。

 

注意点

リアルタイムのリフレクションプローブはそれなりに処理が重いので注意。

 

バグ? 仕様?

リアルタイムのリフレクションプローブでパーティクルが反映されない。
Beta の初期や iOS シミュレータでは反映されるためバグな気がしないでもない。
一応、Feedback にバグリポート済み。

 

次回はスクリーンスペースリフレクションについて。

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 へバグリポート済み。

 

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

Xcode 11 での SceneKit の変更点 その1 - 概要と Scene Editor

リリース版が出たので詳細を書いていこうと思う。
コードのプロパティやメソッドは過去記事参照。

  • Scene Editor の変更
  • エリアライトの追加
  • リフレクションプローブの追加
  • シーン全体のスクリーンスペースリフレクションの追加
  • カメラの Bloom のプロパティとホワイトバランスの追加
  • マテリアルでクリアコートのプロパティが追加

 

Scene Editor

プレビュー下に Default lighting が追加

f:id:x67x6fx74x6f:20190930230415p:plain

Xcode のアプリメニュー Editor > Rendaring Option > Enable default lighting で設定していたものが、Scene Editor 上でできる様になった。

Default lighting はシーン上にライトがない場合これを設定すると、シーンにアンビエントライトが追加される。
また、Xcode 11 から Default lighting のライトの適応され方が変更された。

(上の画像が OFF / 下の画像が ON)

f:id:x67x6fx74x6f:20190930230503p:plain f:id:x67x6fx74x6f:20190930230536p:plain

 

プレビュー用の機能なので実際ビルドした際はみためが異なる場合があるので注意。

 

ライブラリ

Library のモーダル (Command + Shift + L) から、ドラッグ&ドロップできる項目で「Area light」「Reflection Probe」が追加された。

f:id:x67x6fx74x6f:20191001223219p:plain

 

Gabo (Directional Light / Spot Light のみ)

f:id:x67x6fx74x6f:20190930230904p:plain

Scene Editor 上でライトの Gabo が設定できる様になった。
基本的には過去記事でコード上で書いた状態と同じ。
Gabo については過去記事から抜粋。

ライブや舞台等で、ライトの前に光の当てたい部分を削ったプレートを置いて照明を照らすことで、壁面に絵や文字を投影することができ、そのプレートや効果を指すとのこと。

SCNLight の shadowMode を modulated にしないと適応されないため、Scene Editor 上でも「Modulated」にしないと Disable 状態で画像を設定できない。

また、現状ドロップリストから画像が選択できないため、ドラッグ&ドロップで設定する。

 

Custom Shader / Shader Modifiers のプロパティ表示の変更

f:id:x67x6fx74x6f:20190930231005p:plain

NSTableView の表示だったが、「+」ボタンを押して項目が追加される様になった。
設定できるものは以前と同様に、Float, Float4, Color, Texture となっている。

 

バグ: Scene Editor の左側 Scene Graph View

Library のモーダル (Command + Shift + L) から、ドラッグ&ドロップで Scene Graph View ドラッグした際にドロップできない場合がある。
ちなみに Xcode のバグで SpriteKit でも同様に起きる。
Feedback にバグリポートを出したがリアクションなし。

 

次回、エリアライトについて

SIM フリーの iPhone XS を売りに行ったら SoftBank さんのネットワーク利用制限が ▲ だった

f:id:x67x6fx74x6f:20190929164619p:plain

面白いことがあったので書き留めておく。
今回、端末買取の際の登場人物では誰一人悪くないところがすごい。

結論としては今回の SIM Free iPhone XS に関しては SoftBank さんのネットワーク利用制限を解除できなかった。
(正確にいうと方法がわからなかった)

ちなみに自分は宗教上の理由で SoftBank さんの回線を現在は持っていない。

 

2019年9月25日

2018年10月28日 Apple 新宿にて iPhone XS 256GB スペースグレイを購入し、iPhone 11 Pro を発売日に購入したため、夕方 iPhone XS を 近所の IOSYS さんに買い取ってもらいに行く。

査定時に事件が発生し、SIM フリーの端末なのに SoftBank さんのネットワーク利用制限が ▲ になっているとのこと。
通常、6万強で買取できるが、ネットワーク利用制限がかかっているので5万円くらい。
買取価格はどうでも良く、どうしてそうなっているの知りたかったので買取をやめ、Apple 新宿に向かう。

Apple 新宿でスタッフさんをひっ捕まえてことを話したら、その様な状況になることないとのこと。

ということで、新宿の Softbank に向かい、端末を調べてもらうと当たり前だが Softbank では契約されていないと判断された。

原因が全くわからないので、じゃんぱらさんで査定していただき状況は同じ状態。

まだ時間的にヨドバシ Akiba の SoftBank ショップが営業していたので来店。
ありがたいことに長い間調べていただいたが、商品の管理としては、自分の XS はソフトバンクのものだが、回線の契約がされていないとのこと。

IMEI で紐づいているネットワーク利用制限に関しては SoftBank さんの回線契約がないと変更できないないとのこと。
ちなみに docomo は可能。

SoftBank ショップの判断としては、Apple さんが商品登録の際に SIM Free の端末ではなく SoftBank 管理商品として登録してしまったのではないかという結論。
うちでは処理できないので Apple さんに問い合わせてくれとのこと。

順番待ちも含め所要時間、約 1.5 時間。
26日から出かける予定があったので、いったんお預け。

 

2019年9月26日

サポートアプリからこの旨のメールを投げる。

 

2019年9月27日

返信が来るがこちらでサポートできないので、他に送ってくれという内容。
どこに問い合わせたら良いかわからんので「購買/購入」という項目を選んだが、どうやら iTunes Store とかデジタルストア向けらしい。やられた。

書いたメールの内容を忘れたので、Apple 表参道でのジーニアスでの対応を28日に予約。

静岡まで行っており、そのまま新幹線で博多まで行こうとしたが気になったのでキャンセル。

 

2019年9月28日

無駄だとはわかっていたが、Apple 表参道で対応していただくが状況変わらず。
以下の診断を受ける。

f:id:x67x6fx74x6f:20190929164405p:plain

とりあえず、この現象のエスカレーションを上げてくれていることを願う。

 

2019年9月29日

こちらも無駄だと思うが、直営店である東京駅の SoftBank に行ってみたが対応できないと言われた。

八方塞がりとなったため、近所の IOSYS さんにまた買い取ってもらいに行く。
(説明ミスったので2回並んだ)

内容を説明すると商品的にはジャンクということになり買取価格は2万となった。
状況を説明すると減額になるのね。驚き。

面倒なのでそのまま売る。

もし初日の状態買い取られていたら、ネットワーク利用制限が変えられないものが結構なお値段で販売されてたわけだし、既に同じ状況のものが買い取られて売られているのかもしれない。
(状況を説明しなければわからんので)

 

気になっている点

アプリ開発的に IMEI や端末のシリアルは取れないので、購入後変更された可能性は低い。
(プライベート API なら取得可能だがアプリの審査に通らない)

となると、SoftBank ショップで言われた様に原因は購入前にある可能性が高い。

で、これが本当だと気になる点が2つある。

  • 最終的に SoftBank の管理在庫の帳尻が合わなくなる可能性
  • Apple のスタッフが在庫を入れ替えた可能性

 

管理在庫の帳尻が合わなくなるのは調整できるとは思うが、やはり1つなくなったことになるので最終的に問題が起きる。
もう1点は Apple のスタッフが、ただのヒューマンエラーか故意はわからないが、商品の入れ替えを行うことができたということになる。

悪意をもって説明すると、自分のケースの逆で SoftBank を契約している人に対して SIM Free の在庫を売ることが可能になる。
もし可能かつ意図的にやっているなら、IMEI なんて普通調べないから、売却するまでわからず悪質である。

 

回避する方法

Apple Store の裏側から商品が出され、外見ではわからないし、使用していてもわからないので、正直回避しようがない。

なので、返品できる期間内に IMEI 番号を調べてひっかかる様なら返品するしか方法がない。

 

まとめ

SIM 関連の煩わしさを回避するため付加した支払いをしているのに逆に面倒になる始末。
IIJ から回線を docomo に切り替えようかと思っているのでもうキャリアで買った方が良いかもしれない。

あと、Apple 新宿は怖すぎるので、2度と買い物できない。

 

P.S.

今回、Apple、SoftBank を巡回する際に、SoftBank の回線契約をしたことがないと言ったが、iPhone 4 までは SoftBank の契約をしていたことを思い出した。
お詫びして訂正。