夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

ShaderGraphでオブジェクト同士の交差点を取得する

本日はShader学習枠です。

今回は水面表現などでよく見かけるほかのオブジェクトと交差している個所が発光するような見た目のシェーダーを実装します。

〇Unityでオブジェクト同士の交差点の取得

Unityであるオブジェクトと別のオブジェクトが接触、交差しているかどうかはDepthTextureを使用することで取得できます。

レンダリング時にUnityでは深度(奥行)情報をもとに一度テクスチャとして保存することができます。

 これをDepthTextureと呼び、今回使用するようにシェーダーやPostprocessingなどで使用して様々な表現を行うことができます。

docs.unity3d.com

〇ShaderGraphでオブジェクト同士の交差の検知

シェーダーでよく使われるテクニックですが、EyeレベルのSceneDepthの値からScreenPositonのα値を引くことでオブジェクトとの交点をとることができます。

これを出力することで、次のように交差点が黒く表示されます。

SceneDepthは深度情報になります。ここからカメラ座標のα値を引いていますが、上記のように黒くなるということはSceneDepthScreen Positionの差が0に近いことを示しています。

 逆に白い部分は数値上は1以上となり、差が大きいことを示しています。

 SceneDepthはカメラから円柱までの距離、Screen PositionはカメラかPlaneの法線の距離をそれぞれピクセルごとに計算しており、Planeと円柱の距離が近くなればなるほどそれぞれが接触しているという判断ができます。

 この値は0以上の値を持ち、色情報として扱う場合0~1の間にクランプしたいためsaturateノードをつなぎます。

 最後にInvertColorを使用して0、1を反転させることで交差点が白く表示されるようになります。

 

以上でオブジェクト同士の交差点を取得できました。

Blenderでベイク時にCircular dependencyエラーが表示しもともとのテクスチャまで破断してしまう問題の対処

本日はBlenderモデリング枠です。

Blenderでのベイク時に発生したトラブルに関して解消していきます。

〇発生した問題

先日一緒に仕事をしているほかのグラフィックエンジニアからテクスチャベイクを依頼され、ベイクを行っていたところベイクがうまくいかないだけではなくもともと割り当てていたテクスチャの情報が書き換えられ、次の画像のように見た目が壊れてしまう問題が発生しました。

本来の見た目
 

この際に次のようなエラーが表示されていました。

Circular dependency for image "(もともとの画像)" from object "(ベイクで作る画像)"

〇問題と解消

今回の問題点としてはShadingウィンドウで画像を使用する際にUVマップを接続していないことがありました。

つまりもともとオブジェクトに指定していたテクスチャのUVが指定されていないことで子のテクスチャもベイク対象となっており、最終的に出力したいテクスチャは子のテクスチャのベイク結果に依存している状態となり、上記のエラーが生じていたものと思われます。

 解消としては簡単でUVマップノードを接続してあげることで解消します。

 簡単なことでしたが普段筆者はUVマップをセットで使っており、今回ほかの人のプロジェクトで行ったため以外に気が付かず時間をかけてしまいました。

Blenderでシーンに雨を降らせるアドオンRain Generatorを使用する

本日はBlender学習枠です。

今回はBlenderで雨を再現するアドオンRain Generatorを導入します。

Rain GeneratorはBlender Marketで9ドルで販売されています。

blendermarket.com

購入後には.blendのファイルとデモシーン、そしてシェーダーが提供されています。

Rain_Generator_Blender_3.2_3.3_V2.blendをダウンロードします。

自身のBlenderプロジェクトを開きアペンドを用いてダウンロードしたBlenderフォルダのコレクションをアペンドします。

Rain Generatorは画像のように構成されており、スペースキーを押すことでアニメーションが実行され雨が降ります。

これらの制御はモディファイアによって行われており、細かく制御することができます。

デフォルトのスカイボックスでは非常に雨粒がわかりづらいですが、スカイボックスを指定することで

 オブジェクトを雨の対象にするためにはRain GeneratorモディファイアのRain Targetのコレクションの中に対象のオブジェクトを入れます。

これだけで水しぶきが発生するようになります。

レンダリングすると次のようになります。

〇デモシーン

カノン砲のデモシーンが提供されています。

こちらではCyclesが使用されています。

こちらでは水しぶきの再現など非常にクオリティが高いです。

本日は以上です

使いこなすにはもう少し時間が必要そうですが比較的安価でクオリティの高いアドオンでした。

Stable diffusionを導入する その② 学習モデルの用意

本日は昨日に引き続きStable Diffusionを導入していきます。

昨日は公式のリポジトリからCloneしてPythonの環境構築までを行いました。

redhologerbera.hatenablog.com

本日は学習モデルを用意して実行までを行います。

〇学習モデルの用意

Huggingfaceを使用して学習モデルを用意します。

①サイトへアクセスをします。

huggingface.co

②初めて使用する場合はsign-upを行う必要があります。

③次のリンクからStable diffusionの学習モデルを入手します。

huggingface.co

入手するモデルはFiles and versionsにあります。

この中のsd-v1-4.ckpt を使用していきます。

Downloadボタンを押しダウンロードを行います。

⑤ダウンロードしたモデルデータを昨日構築したStable Diffusionのmodels\ldm\stable-diffusion-v1に配置します。

⑥ダウンロードしたモデルのckptファイルの名前をmodel.ckptへと変えます。

⑦Pytonのコマンドを実行します。

python scripts/txt2img.py --prompt "a photograph of an astronaut riding a horse" --plms 

処理が始まります。

処理が完了するとEnjoy.のメッセージが表示されます。

⑧処理が完了するとoutputフォルダに生成された画像が格納されます。

乗馬する宇宙飛行士の画像が作成されました。

今回は実行するコマンドにpython scripts/txt2img.py --promptの後にa photograph of an astronaut riding a horse(乗馬する宇宙飛行士)とつけていたので正しく画像が生成されたことがわかります。

以上でStable diffusionを動かすことに成功しました。

ここからは実行するメッセージを変えることで任意の画像を作成できます。

〇An angel descending from the sky(舞い降りる天使)

〇Sukiyaki(すき焼き)

〇A person cutting vegetables with a lightsaber(ライトセーバーで野菜を切る人)

以上で自由自裁にStable Diffusionで画像生成ができるようになりました。

本日は以上です。

Stable diffusionを導入する その①

本日はAI学習枠です。

Stable diffusionをローカルのPCに導入していきます。

〇Stable diffusionとは?

stable diffusionは22年8月にオープンソースで公開されたテキストベースの画像生成AIです。

イギリスのStability AIによって公開され日本でもここ数か月で話題になったAI画像作成ブームの火付け役となりました。

筆者も同様のアプローチのOpneAI DALL・E2を以前触っていました。

redhologerbera.hatenablog.com

〇Stable Diffusionを導入する

Stable Diffusionをローカル環境で使用するためにはマシンスペックがある程度必要になるようですが、筆者の環境では要件をクリアしていたので今回はローカル環境に導入していきます。

Stable Diffusionは以下のリポジトリで公開されています。

github.com

〇環境要件

Stable diffusionをローカル環境で実行するためにはNVIDIA製の10GB以上のVRAMを搭載したGPUが必要になるようです。

 筆者のGPUはRTX-3080のためぎりぎり10GBのため今回挑戦します。

 また導入するためにはPython環境とAnacondaの環境が必要です。

①リポジトリをCloneします。

 git clone https://github.com/CompVis/stable-diffusion.git

②次にAnacondaで作業を行います。  cdコマンドでクローンしたディレクトリに入り、次のコマンドを実行し環境を構築します。

conda env create -f environment.yaml

ここではStable diffusionに使用するための依存環境がまとめてダウンロードされます。

コマンド一つで行えるものの非常に処理に時間がかかりました。

③次にCondaを起動します。

conda activate ldm

正常に実行された場合シェルの端がBaseからldmへと変わります。

④models/ldm内にstable-diffusion-v1という名前のフォルダを作成します。

後はここに画像のモデルデータを入れてコマンドを実行することでStable diffusionを実行できますが、今回まだモデルデータを作成していなかったため次回モデルデータを作成してコマンドを実行していきます。

MRGT最新状況 XRMTG2022年9月で登壇しました。 

本日はイベント登壇枠です。

先日月一で行われているXRMTGに参加をして登壇をしました。

redhologerbera.hatenablog.com

『MRGT最新状況』というテーマでMixedRealityGrapihcsToolsに関してシェアをしてきましたのでこちらでまとめていきます。

〇MRGT最新状況

〇MRGTとは?

MRGTことMRTK GraphicsToolsはMicrosoftによって開発、提供されているオープンソースのHoloLensをはじめとするxRデバイス向け開発ツールであるMixedRealityToolkit(MRTK)の最新世代であるMRTK3で提供されるパッケージの一つです。

MRKT3ではインプット回り、UI周りなど機能ごとにここに分かれて提供されるようになっています。

MRGTはグラフィック周りの機能に集中して提供されています。

現在v0.4.0が最新版になりプレビューとして提供されているMRTK3の中で唯一プレビューとしてではなく正式にリリースされているパッケージになります。

 MRGTに関しては以前に完全に理解するという記事を書いていますのでこちらを確認ください。

redhologerbera.hatenablog.com

MRGTでは主にグラフィックにかかわるシェーダーエディタツール便利ツールの3種が提供されています。

 ここでエディタツールとはUnityエディタ内でのみ機能し主に開発者が開発をよりスムーズに行うために使用する機能を指します。

 また、便利ツールとはシェーダーなどと組み合わせて様々な表現ができる機能を指します。

 MRGTはオープンソースで開発されており、筆者自身も開発に参加しています。

 このためv0.4.0以降の最新の機能を筆者自身が作っていたり、ほかの人が開発しているのを見ていたりするので今回まだリリースされていない最新機能をシェアしました。

〇ライトモードの強化

 MRGTのコアとなるGrpahicsTools /Standardシェーダーは多機能なシェーダーで、一つのシェーダーでLit/Unlitを再現できます。

 最新のバージョンでは従来DirectionalLightを使うかのチェックボックスだった場所がLitなのか、UnLitなのかのプルダウンメニューに代わります。

また、新しい機能としてDistantライトが追加され、コンポーネントベースで遠方からの光を再現できるようになりました。

〇発光マップ

 発光マップは筆者が開発にかかわった機能です。

 発光用のテクスチャを割り当てることでひかりかたをよりカスタマイズできます。

 筆者の用途としては発光マップを使用することで、より低負荷でリアルなモデルのライティングを実現する方法として使用しています。

 

〇拡大鏡

 次のバージョンからはアクセシビリティの考えから拡大鏡機能が利用できるようになります。

 これはロービジョンの人々がVRをより身近なものとするツール SeeingVRというMicrosoft researchの考え方に基づいて開発がされています。

www.microsoft.com

〇スクリーンショット撮影機能のショートカットキー

 こちらも筆者が追加した機能です。

 MRGTにはUnityのカメラに基づいて最大4倍の解像度でスクリーンショットを撮影できます。

 今回ショートカットキーを使用してスクリーンショットが撮影できるようになりました。

 次のアップデートがいつになると決まっているわけではありませんが今回紹介したような機能が導入されることでよりMRGTの魅力が上がると考えています。

XRMTG 2022 9月に参加しました。

本日はイベント参加枠です。

〇XRMTGとは?

osaka-driven-dev.connpass.com

XRミーティングは大阪のコミュニティである大阪駆動開発を中心に全国のxRコミュニティがオンライン上で集まって行われる月一のイベントです。

主にやってみたネタ、困っているネタ、作ったネタ、イベント告知などxRに関することであればどんなことでも共有できるイベントになっています。

 最近は仕事などが忙しくなかなか参加できておらず久々の参加になります。

〇今月のHoloニュース 山地さん

 関西のHoloRanger山地さんです。山地さんからは毎回会の冒頭にこの月のXRにかかわるニュースをシェアしていただけます。

〇ANAでHoloLens 2を使用したツアー開始

残念ながら申し込みの締め切りは終わってしまったようですがANAによる体験会があったようです。

www.anahd.co.jp

〇鳥取でHoloLens 2を使用した展示

水木しげる記念館でHoloLensを使用することで「妖怪めがね」としてアトラクションを楽しめる展示があるようです。

www.moguravr.com

HoloLensと妖怪は非常に相性が良いので筆者も体験してみたいです。

〇Magic Leap 2の早期アクセスが届き始める

HoloLens同様にMixedRealityを体験できるMagic Leap 2の早期アクセス版の到着が始まったようです。

 筆者の所属している会社でも注文はしているので到着が楽しみです。

〇MRTK3 MRTKXR Rigと Bounds Control 宮浦さん

今回はMRTK3の機能の中からXR Rigの機能の紹介がありました。

 山地さんの紹介にあったMagic Leap 2のアーリーアクセスの体験会で開発を行った際にMagic Leap 2を使用してMRTKを触ったそうです。

現時点でMagicLeap2はOpenXRに対応していないため動かない箇所はあったらしいですが、動かす経緯でMRTK3をより深堀されたそうです。

 MRTK3のセッティングを終えるとコアのプレファブとしてMRTK XR Rigを使用します。

カメラやコントローラー、ハンドトラッキングなど各デバイスの入出力系のコンポーネントがすべてまとまっています。

操作系のコンポーネントはMRTK Right(orLeft)Hand Controllerでコンポーネントとしてまとめられており、各ジェスチャーの制御を行っています。

NearInteractionModeDetectorは指先の制御と手全体の制御のモードを切り替え誤動作を抑える役割があるそうです。

またカメラプレファブの階層の外にMRTK Interaction Managerのオブジェクトがあり、現在の状況に応じて複数のInteractorに優先度をつけ、誤動作などを抑える役割があるそうです。

またおまけとしてBounds Control=つかみなど の調査も行ったようですが実装方法は従来のMRTKv2と同様になっているようです。

〇Geospatial APIで夏の札幌を雪国に変えてみた きっぽじさん

GeoSpatialAPIをテーマにしたハッカソンが開催されたそうで、テーマが都心部の野外でその場所の魅力を引き出すコンテンツというものであったそうで、きっぽじさんは雪国札幌をテーマにしたコンテンツを開発したそうです。

最初PLATEAUとシェーダーによって雪を積もらせるということを計画したものの精度の問題で没になったようです。

次に「扉」のアイデアに扉の中に雪国があるというアプローチを行ったようです。

 扉はシェーダーを開発して、扉の中のみ雪国になるように設定されたようです。

 雪の表現を再現するためにPostProcessVolumeを使用して色調を調整されています。

結果SONYによる賞を受賞されたそうです。すごい

〇Meta Quest 2でUSBシリアル通信してみた Hiro_hanさん

 MetaQuest 2にラズベリーパイを接続して温度湿度センサーや照度センサーを接続してUnityでデータを取得できたそうです。

 

筆者も加速度センサーをMetaQuestに接続したことはありますが、追加でセンサーを追加する場合は非常に難しかった記憶があります。

 またハードウェアという点から筆者としては手を出しにくいアプローチでしたが、できたという内容だけでも非常に魅力的でした。

qiita.com

今回は途中で抜けてしまったので以上ですが筆者を含め7名が登壇しました。

筆者の発表は後日記事にします