UE4でHoloLens2でも使える、昼夜を表す地球儀を作ろう

はじめに

https://crssnky.hatenablog.jp/entry/2021/BMD

↑の子記事となっています。記事の背景を知る場合はこちらから参照ください。

また、昼夜を表せられる地球儀をサクッと作りたい方向けです。
そんなに精密なものではありません。

デモ

このような感じで、昼夜のテクスチャを向きで切り替える地球儀です。

テクスチャ

地球の画像と言えば、やはりNASAのBlueMarbleでしょう。

NASA Visible Earth - Home

この中から、昼の地球と夜の地球を選びます。
夜の地球は一枚しかない(Earth’s City Lights)ので良いのですが、昼の地球(Blue Marble Next Generation)はいろいろな季節のものがあります。お好きなものを選びましょう。

モデル

球体であればなんでもいいです。
僕はBlenderで65280頂点の球体を作りました。それくらいでもHoloLens2は余裕みたいです。

マテリアル

UE4のお時間です。全容はこちら↓
f:id:crssnky:20210710230552p:plain

おそらくこれはBestWayじゃないだろうけども、許してね。

まず下段ここ
f:id:crssnky:20210710231538p:plain ここですが、ラフネスを求めています。
海の部分だけ強く反射してほしい気分だったので、なんか良い感じに求めています。
(理論は無く、本当に"良い感じで"求めました)
そうすると、以下のような感じになります。
f:id:crssnky:20210710231249p:plainf:id:crssnky:20210710231330p:plain

次は上段ここ f:id:crssnky:20210710232749p:plain ここは、外から入力された光の向き(Vec4)と、ローカル座標の内積を取得しています。
マテリアルに当たる光をDirectionalLightにすることで、昼夜の判定を模擬します。
光と内積については、以下ブログの"セルシェーダーと内積"の章を見ると分かりやすいです。

UE4 誰でもわかるセルシェーダー入門 - Let's Enjoy Unreal Engine

最後はここ f:id:crssnky:20210710233912p:plain 内積による昼夜の判定から、ifノードで表示するテクスチャを選択しています。
Emissiveにも入れることでDirectionalLightしか無い宇宙空間でも、光の当たらない方を見せることができます。

Blueprint

コンポーネントはこんな感じです↓
f:id:crssnky:20210710235148p:plain

SceneComponent系は、StaticMeshComponentだけです。作った球体メッシュに作ったマテリアルを貼ってあげましょう。

ActorComponent系は、HoloLens2による入力を受けるためのコンポーネントです。主にTransformを変えるためのものです。説明は割愛。

マテリアルで取得するための光の向きはBlueprintで入れます。
f:id:crssnky:20210711000616p:plain このようなBP関数を作り、ConstructionScriptはもちろん、Tickなどで定期更新してあげましょう。常にTickを呼ぶのはアレなので、僕はHoloLens2がGrabしているだけTickするようにしています。

おわりに

以上です。簡単!環境によっては、画像をDLする時間やマテリアルをビルドする時間の方が手を動かす時間より長いかもしれませんね。
説明は割愛しましたが、HoloLens2のMRTKのコンポーネントを入れることで、自分の手で動かしたり回したりできます。まさに地球儀です。
ここになにか情報を重畳してあげることで、MRでリッチな自分だけの地球儀を作れるようになると思います。