UE4でHoloLens2でも使える、昼夜を表す地球儀を作ろう
はじめに
https://crssnky.hatenablog.jp/entry/2021/BMD
↑の子記事となっています。記事の背景を知る場合はこちらから参照ください。
また、昼夜を表せられる地球儀をサクッと作りたい方向けです。
そんなに精密なものではありません。
デモ
ブログ用 pic.twitter.com/ewRHfa7gwF
— croMisaP (@croMisa) July 10, 2021
このような感じで、昼夜のテクスチャを向きで切り替える地球儀です。
テクスチャ
地球の画像と言えば、やはりNASAのBlueMarbleでしょう。
この中から、昼の地球と夜の地球を選びます。
夜の地球は一枚しかない(Earth’s City Lights)ので良いのですが、昼の地球(Blue Marble Next Generation)はいろいろな季節のものがあります。お好きなものを選びましょう。
モデル
球体であればなんでもいいです。
僕はBlenderで65280頂点の球体を作りました。それくらいでもHoloLens2は余裕みたいです。
マテリアル
UE4のお時間です。全容はこちら↓
おそらくこれはBestWayじゃないだろうけども、許してね。
まず下段ここ
ここですが、ラフネスを求めています。
海の部分だけ強く反射してほしい気分だったので、なんか良い感じに求めています。
(理論は無く、本当に"良い感じで"求めました)
そうすると、以下のような感じになります。
次は上段ここ
ここは、外から入力された光の向き(Vec4)と、ローカル座標の内積を取得しています。
マテリアルに当たる光をDirectionalLightにすることで、昼夜の判定を模擬します。
光と内積については、以下ブログの"セルシェーダーと内積"の章を見ると分かりやすいです。
UE4 誰でもわかるセルシェーダー入門 - Let's Enjoy Unreal Engine
最後はここ
内積による昼夜の判定から、ifノードで表示するテクスチャを選択しています。
Emissiveにも入れることでDirectionalLightしか無い宇宙空間でも、光の当たらない方を見せることができます。
Blueprint
コンポーネントはこんな感じです↓
SceneComponent系は、StaticMeshComponentだけです。作った球体メッシュに作ったマテリアルを貼ってあげましょう。
ActorComponent系は、HoloLens2による入力を受けるためのコンポーネントです。主にTransformを変えるためのものです。説明は割愛。
マテリアルで取得するための光の向きはBlueprintで入れます。
このようなBP関数を作り、ConstructionScriptはもちろん、Tickなどで定期更新してあげましょう。常にTickを呼ぶのはアレなので、僕はHoloLens2がGrabしているだけTickするようにしています。
おわりに
以上です。簡単!環境によっては、画像をDLする時間やマテリアルをビルドする時間の方が手を動かす時間より長いかもしれませんね。
説明は割愛しましたが、HoloLens2のMRTKのコンポーネントを入れることで、自分の手で動かしたり回したりできます。まさに地球儀です。
ここになにか情報を重畳してあげることで、MRでリッチな自分だけの地球儀を作れるようになると思います。