見出し画像

森をつくる

この記事は「もなふわすい~とる~む Advent Calendar 2021」の23日担当記事になります。

いつだっただろう。最近3周年を迎えたことでますますかわいさに磨きがかかった巻乃もなかさんが同僚の結目ユイさんをバーチャル空間のどことも知れない森の中に召喚したのは。このエピソードがどのような文脈のものだったのかはすでに失念してしまったのですが、自分の中ではとても印象的で、薄暗い森の中でぽつんと途方に暮れる結目ユイとそれを大木の影からじっとりと覗き見る巻乃もなかが目に浮かんで大変に捗ったことをおぼえています。
そんなわけで、今年のアドベントカレンダーではバーチャル空間の中に森を再現することに挑戦してみたいと思っています。

ぼくはこの分野の素人なので、本記事はほぼ全編先人の知見のまるパクリで構成されていることをおことわりしておきます。さらに、多分に自分のための覚書な側面が否めないので自分の知識が少ないところはやたら分量が多くなっていることもあらかじめおことわりしておきます。
また、本記事の中にはたびたび他の女の名前が出てきますがかわいいのでたぶんオッケーだと思うから読者もそう思えください。

なお、あなたが巻乃もなかさんではなく、かつ、万一巻乃もなかさんをよく知らない場合は目次の上にあるリンクより3周年を迎えた巻乃もなかさんについて学習することができます。その他、なにか問題があればコメントやツイッターのリプ・DMなどでお知らせください。

この記事はアドベントカレンダー掲載後も断続的なアップデートが予定されています

ぼくはなぜ心配するのをやめ森をつくろうと思ったのか

地球のアクティブな生態系は大きく分けて2種類に分かれる。それは陸と海だ。ぼくら人間は陸上動物なので陸に住んでいるのだが、陸上で最も影響力のあるシステムのひとつが森である。生態学の目線で見たとき、陸上生態系はある意味非常に単純なシステムとしてとらえることができる。すなわち陸上高等植物を主要な生産者としてすべての生物がそれにぶら下がっているという構図だ。地球で最もありふれた炭素源である二酸化炭素と同じく最もありふれた水素源である水を原料として太陽光のエネルギーで有機物を生み出す植物という存在は、現在の陸上生態系の構成員が依って立つほぼすべてのリソースの生産を一手に引き受けている。厳密に言えば大気中の窒素や土壌中のリン・硫黄などを生物の中に引き込む微生物の活動もこれに勝るとも劣らない重要性を持っているのだが、それすらも陸上生態系ではその多くが植物の根圏共生体として協働しており、人間や巻乃もなか・結目ユイを含む全ての陸上生物はもれなく陸上高等植物+共生微生物というシステム=一次生産者に寄生して生きている。

森林はそのような植物が形成するシステムとしては格別に大規模なものだ。我が地球においては陸上の3割が森林におおわれているとされている。そこには無数の巨大な植物と微生物たちがひしめき合って、惑星レベルの物質の流れを生み出している。森林はこの星における生の原動力と大いなる循環の最重要な一部なのだ。

ぼくは普段バイオマスの利活用に関する研究をしているのだけど、研究の中で常々思っていることは巻乃もなかのかわいさとこの壮大な物質循環のことだ。例えばぼくの場合は微生物の力で地上で最も豊富にあって人間が食べられない木質バイオマス(木や草の硬い部分)を燃料やマテリアルに変換することをこれまでの主要な研究テーマのひとつとしてきたのだけど、研究のプロポーザルを書いたりするときは地上にはこれこれこれだけの木質バイオマスがあって、これを全部燃料に変換すると全地球人口の何倍の量を賄うことができるみたいなことを書く。でもこれはもちろん欺瞞であって、全バイオマスを特定の目的だけに使うということはありえない。様々な社会活動やそもそもバイオスフィア全体の維持のための物質の循環上にそういった要素技術をのっけていって、最終的にどうなるかというシミュレーションをする必要がある。

ローマクラブの諮問で作成された「成長の限界」モデルに端を発する人類活動に関する(その多くが悲観的な)大規模数値シミュレーションは、人類の活動がバイオスフィアの物質循環から見て無視できない大きさになっていることを如実に示している。しかし、そういった数値シミュレーション研究の多くは全球レベルの数値モデルを使っているので、各種の問題を解決する目的で実際の要素技術による入出力を外挿するにはあまりにもおおざっぱすぎるという問題点がある。要素技術によるバイオマスの「収奪とリターン」を乗せるにはもっとローカルなシミュレーションが必要であるし、また、数値シミュレーションによってコンピュータが数値モデルと乱数に沿って生成したどことも知れぬ仮想の森ではなく、ひつじの国にあるもなふわ村のバックカントリーをきちんとコンピュータの中に再現したうえで、その森のモデルとシミュレーションを使って未来社会で実装を目指す技術群の評価をすべきである。

実在する森をコンピュータ内に呼び込む手段としてデータ同化という手法がある。この手法は、シミュレーションを複数走らせたうえで、現実の観測データを用いてフィルタリングを行って現実に近いものを選択する。そうしていくと、残ったシミュレーションは現実に非常に近い環境を再現するパラメータセットになっており、未来の予言も非常に当たりやすいことになっていく。こう考えるとデータ同化はなんだかバーチャル魔法使い養成RPGゲームのような技術である。
この技術を使うには現実世界のデータを時系列に沿って得る必要がある。特に森の場合は葉っぱの量が基本的な植物による生産量のデータとして使われるので大切なのだが、上の記事の例でも使われている衛星データは広域のシミュレーションにはいいのだけどローカルになればなるほど森が内包する不均一さのために実際の葉っぱの量から離れていくという問題がある。この問題を解決するためには、地上観測による補正が不可欠なのだけど、近赤外分光を用いた既存の観測方法は手軽ではなくて、もっと手軽な方法が求められている。その一つとして最近フォトグラメトリやLiDAR技術が注目され始めている。そもそもフォトグラメトリは景観の立体再構成技術なので、正しく使えば樹冠(木のはっぱがついている領域)のボリュームを得ることが可能なので、そこから葉っぱの量も近似できるというわけである。
また、フォトグラメトリとは写真やレーザー測距によるデータを用いて周辺の環境を立体再構成する技術でもあるので、現在は単純に距離を測るのに用いているレーザー計測に蛍光分光や反射分光の要素を加えることも可能だと思われる。こういったレーザー分光法はクロロフィルの蛍光をセンスすることで実際の植物の生産量や活動領域を示すことができるし、各種の代謝指標物質や周辺環境のガス組成の変化を計測することも可能だ。そうなるとシミュレーションのデータ同化の項目も増えて、さらに精密なもなふわ村のバックカントリーをコンピュータ内に再現できる。それだけではなく、再構築されて生成されるVRワールドが森そのものでそこに多様なメタデータが付与されるとなれば、再構築されたVR森は、普通の森では人の目に見えないパラメーターをじかに見たり触れたりできる超森ともいえるだろう。なんと素晴らしいフォトグラメトリー!巻乃もなかも友達を放り出すわけだ!!

というわけで、今回はフォトグラメトリーでどこともしれないけど実際にある森をVR空間内に作ってみたいと思う。とはいえ、フォトグラメトリーの分野ではすでに先人が偉大な足跡を多数残している。

多分ぼくがフォトグラメトリーを知ったきっかけになった伝説の四万温泉フォトグラメトリー動画とか

最初に訪れたフォトグラワールド。伝説の銭洗弁天ワールドとか

Clusterデビューの頃に行った伝説のバーチャル芸大とか

最近VRChatに登場して話題をさらった伝説の軍艦島ワールドなどなど、美麗にして壮大、先端技術にしてアートな数々の偉大なる先人の仕事の前には車輪の再発明とも言えないレベルではあるものの、ここまでつらつら書いてきた諸々を踏まえて以下のような目標をとりあえずたててみる。

・点群でワールドを作る(特徴点を将来的に拡張したいから)
・極力撮影に時間をかけず、単一の軽量な機材で完結させる(時系列データをとりたいのでさくっと計測できる必要がある)
・コンシューマー向け機材を用いる(ゆくゆくは市民参加型でデータを広く集めたい)

技術的には伝説の先人たちがすでに成し遂げずみのことなのだけどまあいいでしょう。

今回はこの記事の内容を参考にしてどことも知れぬ点群森を作っていきたいと思う。そのためにはまずPython, ffmpegそしてフォトグラメトリソフトであるReality Captureをインストールする必要がある。デバイスはWindows10のPCだ。

ソフトウエアのインストール

Pythonのインストール
使ったことほぼ無いけどたぶんだいたいなんでもPythonでできる!というわけでまずはPythonをインストールしていく。Pythonの公式サイト(https://www.python.org/)でDownloadタブにカーソルを合わせると最新版のダウンロードボタンが出現するのでクリック。

画像4

ダウンロードしたファイルを開くとインストーラーが出てくるのでインストールする。このとき、インストーラーウインドウの一番下にある「Add Python <version_number> to PATH」にチェックをつけておく。
インストール完了後コマンドプロンプトで「python」と入力してPythonの環境に入れればOK。Pythonの環境からは「quit()」で抜けられる。

画像5

ffmpegインストール
動画をいろいろとアレするソフトとして昔から使い続けられているffmpeg。参考にした記事ではこれを使って360°動画からスチル画像を切り出す。OpenCVでもいけるような気もするけど勉強するのがめんどくさいのでここはまるっとパクっていくスタイルをとっていこう。まず、ffmpeg公式 web site(https://ffmpeg.org)から「windows builds by BybN」へ飛ぶ。

たくさんあってよくわからないけど、いろいろなサイトをぐぐって斜め見した感じでは「...win64-lgpl-shared.zip」を勧めている例が多いのでこれをダウンロード。

ffmpegのダウンロード

ダウンロードしたzipファイルをユーザーフォルダに移動して右クリックから「すべて展開」。展開されたフォルダ内のbinのパスを取得する(エクスプローラー上でbinフォルダーをクリックしてアドレスバーからコピー)。
パスを通すために、Windowsの詳細設定へ、取得したこのbinのパスを書き込む。
「設定」からシステム>詳細情報(左)>システムの詳細設定(右)>詳細設定(タブ)>環境変数(ボタン)>ユーザー環境変数内のPathを選択>編集(ボタン)>新規(ボタン)で現れる入力欄に上でコピーしたbinのパスを入れてOK。

ffmpegのパスを通す

コマンドプロンプトに「ffmpeg -version」と入力してffmpegの情報がずらっと出てくればOK。

画像2

コマンドプロンプトを使う
Pythonやffmpegはコマンドプロンプトで操作する。なんかとてもコンピューターっぽいやつだ。Macのコンソールのつもりで動かすと全然うまくいかなかったのだが(当然)WindowsのコマンドプロンプトはUnix系とは全く違うということを失念していた。まずドライブが違うとパスという概念が通用しないのでチェンジディレクトリでドライブを乗り換えることができない。なんとなく学生時代に使っていたMS-DOSを思い出すような気がしないでもない。
とにかく巨大なファイルや多量の画像を使用することになるので、操作するべきファイルは外付けHDD=Eドライブに置く。なので、コマンドプロンプト上でまず「E:」と入力して普段使っているCドライブからドライブを乗り換える。その後ファイルの入っているフォルダに「cd」コマンドで降りて行く(unix系のcdと同じ)。ちなみにファイルリストの表示は「dir」(unix系のls)だ。その後はUnix系と使い方は同じだ。今回はこの節の最初に示した記事内のPythonスクリプトを使用するので、「python script_name.py」とか入力すればいいはず。

Reality Captureのインストール
Reality Captureはおそらく最もフォトグラメトリ界で使われているソフトウエアではないかと思う。写真の他にLiDARのデータや衛星データの導入も可能らしいので、今後色々拡張していくことを考えるととりあえずこのソフトになれておきたい。他にはMeshroomというオープンソースのソフトがあり、カスタマイズしたデータを使ったりする場合はこっちの方がいいかもしれない。ただ、とりあえずまず点群を得ようと思ったら、Reality Captureが明らかに性能が良い。

ダウンロード

Reality Captureのサイトに行くととりあえずダウンロードせよと主張してくるので何も考えずにダウンロードして普通にインストーラーでソフトをインストールする。

画像10

言語はソフトを開いて、WORKFLOWタブの右端にあるSettingを押すと出てくるメニューの中の、上の場所で日本語に変えられる。

日本語


そのあとにウェブサイトに戻ってPricingのページに行く

PPIライセンス

このソフトの特徴は「Pay-Par-Input (PPI) ライセンス」というライセンスで、非常に高額な買い切りを選択することなく、プリペイドで購入しておいたクレジットから出力ごとにお支払いをすることができるという点だ。つまり、点群なりモデルなりを出力しなければお金はかからない。逆に、出力するならお金がかかるという仕組みだ。とりあえず始めるこの段階で数十万円払ってソフトを買いきるまでもなくそこそこお安い値段で試せるのはありがたい。ちなみにPPIでもソフトのフルスペックを使うことができる。

購入時の注意

Meshroomもそうなのだが、このソフトは処理にCUDAを使う関係上NVidiaのGPUを使う必要がある。実は最初にあつらえたPCはAMDのGPUを乗せていたので、フォトグラメトリをやりたくてRTX 2070 Superに乗り換えた。選定理由はもちろんもなながこのGPUを使っていたからだ。ぼくたちGPUおそろいだね /// ///。

支払方法

お支払いはクレカ・PayPal・銀行振り込み。注文というのは買い切り用だと思われる。買切る場合は代理店から購入するとケース集などがもらえたりすることもあるらしい。
とりあえずライセンスを購入すれば準備は完了だ。とりあえず山に行こう。

森を撮る

今回は静岡県の沼津にほど近い須津(すど)川休養林に行ってきた。大棚の滝という滝が近くにあって、夏はBBQでにぎわったりするそうだ。撮影に行った日はだれもいなかったけど紅葉が非常にきれいだった。
撮影はInsta 360 one X2で行う。高精細なフォトグラメトリを行う場合はセンサーサイズが大きくて画素数爆盛りのデジタル一眼にゆがみの少ない広角レンズ(ウルトラ高額なやつ)をつけて撮る場合が多いようだが、将来的に林班単位でショートサイクルで点群を採集したいという目的があるので、ここは全天周ムービーからの切り出しで行く。おそらく入手可能なコンシューマー機では5.7k, 30fpsのInsta 360 one X2は最も良い機械だと思う。これをセット売りで同時購入した「見えない自撮り棒」の先に付けてまだ太陽が稜線から顔を出していない林道をそろりそろりと歩く。今回は林道の車止めから須津川休養林キャンプ場までの短い区間を採録した。地面を入力するための絵に自分が写り込まないように、可能な限り身を縮めて頭の真上に自撮り棒を掲げて撮影する様はなんらかの変態のようであるが、すがすがしい朝の谷間には幸いぼくしかいない。

撮影は一筆書きで行うのが良いとされているようなので、一本道の林道を行きに一本、帰りに一本で二本の動画を撮って撤収した。
帰りがけ、撮影時に遥か頭上に見えた橋へあがってみたら、様々な色に紅葉した木々の樹冠の形や範囲がよくわかって大変に面白かった。そして何よりきれい。
ちなみに、この橋にはバンジージャンプの台があったので、巻乃もなかは是非そのうち挑戦してみてほしい。

動画からの静止画切り出し

Insta 360 one X2からのファイルの吸出しは、PC用のソフトウエアを起動した状態でカメラをUSBでPCに接続すると自動でカメラを検出して「動画を読み込みますか?」みたいなことを聞かれるのでそのまま読み込めばよい。この辺はTHETAとまったく同じである。カメラはPCから見てUSBメモリとして認識されているので、そこから手動でファイルをドラッグドロップでも行けると思うのだが、ファイルが2つあって(たぶん表と裏のカメラ?)よくわからなかったので、とりあえずソフトに言われるままに全部読み込んでしまうのがいいと思う。
書き出しの条件はこんな感じ

かきだし

書き出しには割と時間がかかる。書き出しと書いたら牡蠣出汁と出ておなかが減った。

エクスポート

書きだされた動画はそのままダブルクリックすると360°動画として再生される(マウスでぐりぐりすると視点が変わる)。フォーマットとしては正距離円筒形式で書きだされているので、このファイルから参考記事のpythonスクリプトを一部改造して様々な角度の静止画を取り出す。
まずは取り出す視点だが、これは前後左右と斜め前45度左右斜め後ろ45度左右を基本として、水平方向、斜め45度上向き、斜め45度下向きを切り出すことにする。ただし、下向きは自分が写り込むので切り出した写真を見てうまい角度に調節する。真上はなぜか天頂がゆがんでいるので、真下は必ず自分が写り込んでいるので出力しない。自分が写り込んでいる画像を再構成に使わないのはぼくがきもちわるいおじさんだからではなく、再構築対象に含まれない圧倒的ノイズだからである。
というわけで・・・

# 視点リスト(yaw,pitch,roll)
transforms = (
# ( 0, 90,0),#真上:歪んでいるので
# ( 0,-90,0),#真下:自分が写り込んでいるので
( -90, 0,0),#真右
( 0, 0,0),#真正面
( 90, 0,0),#真左
( 180, 0,0),#真後
(-135, 0,0),#右斜め後ろ
( -45, 0,0),#右斜め前
( 45, 0,0),#左斜め前
( 135, 0,0),#左斜め前
(-90, 45,0),#右・斜め上
(-0, 45,0),#正面・斜め上
(90, 45,0),#左・斜め上
(180, 45,0),#後ろ・斜め上
(-135, 45,0),#右斜め後ろ斜め上
( -45, 45,0),#右斜め前斜め上
( 45, 45,0),#左斜め前斜め上
( 135, 45,0),#左斜め前斜め上
(-90, -30,0),#右・斜め下
(-0, -30,0),#正面・斜め下
(90, -30,0),#左・斜め下
(180, -30,0),#後ろ・斜め下
(-135,-30,0),#右斜め後ろ斜め下
( -45,-30,0),#右斜め前斜め下
( 45,-20,0),#左斜め前斜め下:どうしても後ろ側は自分が写り込む
( 135,-20,0),#左斜め後ろ斜め下:どうしても後ろ側は自分が写り込む
)

・・・と変更する。
このほかに

# v360ライブラリのオプション
(略)
# 'w=480', #元のTheata用
# 'h=480', #元のTheata用
'w=1440', #Instaの5.7kに合わせて画素数を拡大
'h=1440', #Instaの5.7kに合わせて画素数を拡大

・・・という感じで、画素数を変更した。また、fpsを1から5に変更。

そうしたらいよいよ切り出しだ。これはpythonのスクリプト内に入出力を書き込んでコマンドプロンプトで実行するのみである。

おんど

処理はわりと厳しめである。なんとなくうちのPCは熱処理がうまくできていない感じが若干する。

画像15

1440 x 1440と、HD画質(?)なので切り出し画像もそれなりにきれいではある。

Reality Captureで点群の生成

Reality Captureを起動したらアライメントタブを選択し、設定ボタンを押す。細かい設定が現れるので先人のお知恵を拝借して以下の設定をする。

・画像ごとの最大特徴点数:160000
・ジオリファレンスにカメラの事前情報を使用:いいえ
・アライメント後に再構築する領域を増加:はい
・コンポーネントの強制再マッチング:はい
・事前選択機能:80000
また、ワークフロータブの設定ボタンより
・Exifによるグループ校正:いいえ

これらを設定したらワークフロータブよりフォルダボタンを押してpython scriptで切り出した画像が入っているフォルダを指定してからアラインメントタブに移行してアラインメントボタンを押す。

画像16

かなり不安になるけど、そのまま待つ。

待つ・・・。

待つ・・・・・・。

何の成果も得られませんでした!

というわけで、フェイルに次ぐフェイル、切り出しのfpsを10とか極端に多くしても非常に断片化したモデル、コンポーネントのマージをしようにもメモリがランニングアウトしてPCが止まるなど、おそらくというか確実にこれは撮影がうまくいっていない模様。HDRを設定していなかったので明暗の加減でうまくつながらないのかもしれない。

そんなこともあろうかと

日付に注目してもらいたい。実はこれより以前にテストドライブとしてもともと持っていたTHETA Vを使って等々力渓谷で撮影を行っていたのだ。等々力渓谷は東急大井町線の等々力駅の近くにある東京23区内唯一の渓谷とされる場所だ。ふつうのどぶ川(最近はかなりきれいになってはいるが夏はやはり匂う)である谷沢川流域に森が残った区間で、元カノさんと住処を探していた時に行ったのをおぼえていたものだ。ちなみに近くの自由が丘にはニコニコ超会議のおしゃべりイベントにA2Pファーストオールスターズ(沖縄に行っていた結目ユイを除く)が出演した時にお茶っ葉を差し入れしたルピシアの本店があり、割と通っていた。ルピシアのフレーバーティーはいいぞう!

で、実はこの時も森の外から差し込む光による明暗の差のために再構築はあまり満足のいくものではなかったのだけど、一応なんとなくみられるモデルはできていた。画像の切り出しに使用した条件は以下の通り

# 視点リスト(yaw,pitch,roll)
transforms = (
( 0, 90,0),#真上
( -90, 0,0),#真右
( 0, 0,0),#真正面
( 90, 0,0),#真左
( 180, 0,0),#真後
(-135, 30,0),#右斜め後ろ斜め上
( -45, 30,0),#右斜め前斜め上
( 45, 30,0),#左斜め前斜め上
( 135, 30,0),#左斜め前斜め上
(-135,-0,0),#右斜め後ろ斜め下じゃない
( -45,-0,0),#右斜め前斜め下じゃない
( 45,-30,0),#左斜め前斜め下
( 135,-30,0),#左斜め後ろ斜め下
)

# 画像切り出しのフレームレート
fps = 5

# v360ライブラリのオプション
v360_options = ':'.join([
'input=e', # Equirectangular projection.
'output=rectilinear', # Regular video.
'h_fov=90',
'v_fov=90',
# 'w=480',
# 'h=480',
'w=960',
'h=960',
# 'interp=gauss',
f'yaw={transform[0]}',
f'pitch={transform[1]}',
f'roll={transform[2]}'
])

人の映り込みが多かったため下方向90度の視点をごっそり抜いている。Insta360 ONE X2と違って天頂の歪みはないので天頂の画像は含めている(Insta ONE X2の方も実はffmpegで動画の一部を切り出すと天頂の歪みはなくなる)。あと、THETA Vの解像度が4Kであるため、fov90°で切り抜いた静止画の解像度が960 x 960 pixelになっている。引用したツイートで分かるように、この解像度になるといにしえのデジカメで撮った画像のようになんとなくぼんやりした画像になっている。
Reality Captureの条件は上と同じ。fps5とかいう きがくるった ような頻度で切り出した17745画像を用いたセッションの結果97のコンポーネントが得られ、そのうちのひとつ、4839画像が使われたコンポーネント45でモデルが生成されていた。

とどろきもでる

ちなみにここではアラインメントだけではなくReality Captureで想定されている全工程を行っている。ワークフロータブから「開始」のボタンを押すと全工程が一気にできる。アラインメントを先に行った場合は、ワークフロータブの2.プロセスにあるボタンを順に押していけばいい。
ちなみにReality Captureのメイン画面の右上にある小さな四角い文字にカーソルを合わせるとドロップメニューが出てくるのでその中から「ヘルプ」を選択するとトピックごとの解説を読むことができる。中でも「クイックスタート」は作業をしながら基礎的な流れを追えるようになっているので便利である。なお、このドロップメニューで「con」を選ぶと計算内容のモニタもできる。メイン画面は複数に分割できるので好きな作業環境を作れるのはなかなかいい感じだ(分割のメニューはReality Captureのウインドウの一番左上にある)。

ヘルプ

さて、モデルを見てみると所々抜けがあるものの、駅前から階段を下りて行ってすぐの赤い橋が上を通る場所から、トレイルが谷沢川を渡る開けた場所の手前くらいまでが再構築されている。この区間は道の両側が急斜面になっている谷地で、樹冠も閉じ気味の鬱蒼とした場所だ。静岡のものもそうだったが、どうも開けた場所に出るととたんに再構築がうまくいかなくなるようである。森の中と開けた場所の間の光環境差が激しすぎるのかもしれない。考えてみると先人の作例は割と光の条件がコンスタントなようにも思える。多分ずっと林冠が閉じた林内なら大丈夫なように思うけど、ディスターバンスの入った森の広域フォトグラメトリーは割と難しいのかもしれない。ちなみに言い訳だが、一応どちらの撮影でも太陽光が直接谷間に差し込まない時間帯を狙って撮影している。

出力してVRChatへ持って行く

モデルができたら点群を出力する。ワークフロータブのエクスポートボタンを押して手順に従っていけばいい。PPIのクレジットは事前にEpic Gamesのアカウントで購入しておくとスムーズだ。点群のフォーマットはいろいろあるが、Dense Mesh Model and Textureにある「XYZ Point Cloud」で出力した。多分LAS Point Cloudでもカラー情報が維持されるはずだ。

エクスポート2

途中確認やらなんやらがあって、お支払いをするとファイルが得られる。一度お支払いをすると画像を追加して再モデリングしない限り、何度でもどんなフォーマットででも出力できるようになる。

この後のプロセスは以下の記事を参考に・・・というか完全にまるパクリしてすすめた。

記事内の「点群を編集する」から先を忠実になぞっていく。もうほんとに寸分たがわずパラメーターまで完全一致でやっていく。ただし、いくつかの注意点があったのでそれだけリスト化しておこう。

・Cloud Compareでのプロセスで、記事内引用記事の「点の数と中心位置」にある「点群の中心位置」の座標を控えておく

・「点群をテクスチャに書き込む」のGoogle Colaboratoryのコードで、インストラクションには明示されていない修正をいくつかする。
  - column_namesの「"ignore",」を消去(xyzファイル由来だから)
  - center_posの数字を上で控えた「点群の中心位置」の座標にする

・Unityでの作業手順は以下の通り
  1.記事にあるシェーダーをインポートする
  2.Assets/PointCloudShader/Materialにcol0とpos0をインポート
  3.col0とpos0を選択しインスペクタで記事の通りに設定
  4.Assets/PointCloudShader/Prefabsの中のPointCloud.prefabを選択
  5.インスペクタでマテリアルに3のcol0とpos0を選択
  6.Assets/PointCloudShader/Prefabsをヒエラルキに入れる

・UnityはVRChat対応版の古いのでも新しいのでもできる

この後、VRChatのWorld用SDKをインポートして、Planeを出して道の位置に合わせて配置して透明にして、スポーン地点を配置して、なんかそれっぽいSkyboxに替えて出来上がり!

パブリックリンクはないけどVRChatのアカウントがあれば上から行けると思うので行ってみてもらえたらうれしいかも。
その後、clusterにもアップしました。clusterはデバイスが何でも入れると思うのでぜひ行ってみてください!

HMDかぶって中に入ってみると、なんかそれなりにきれい。これならいきなり巻乃もなかにどことも知れぬ等々力渓谷の森の中に放り出された結目ユイもうっとりだね!

まとめと展望

いかがだっただろうか?

今回は森をVR空間に作ってみた。ぼくの用途だと最終的にはCLIによるコマンドラインで自動化したいんだけど、その前におそらく撮影条件を詰めないと誰でも簡単にというわけにはいかなそう。なにより計算量が半端じゃないのでゆくゆくはどこのご家庭にもあるLinuxの計算サーバでもできるように丸ごとPythonのライブラリで出来るようにする必要もあるかもしれない。

おそらくレーザー蛍光分光スキャンのデータを入れていこうとなったら、点群ファイルのフォーマットも新たに開発しなおしになるし、そもそもVR空間の点群にどうやってそういうデータを入れて表現するのかという問題も難しいながらも夢のある話だ。レーザースキャンで直接得られるもの以外のメタデータと点群のリンクというのも最終的には必要になってくるだろう。そういうことを考えると、ゆくゆくはUnityやUEなどのゲームエンジンの機能をフルに使ってインタラクティブな森を作っていくというのもおもしろい未来かもしれない。

だがしかし、今はまもなくクリスマス。なんとなく雪が積もった感じに見えなくもないどことも知れなぬVR等々力渓谷の森の中で、静かに巻乃もなかと人類の未来と結目ユイの途方に暮れた顔に想いを致すのもまた一興なのではないだろうか。

そう、このどことも知れぬリアルなバックカントリー、もなふわ森のなかでね!

画像20

####### アドベントカレンダー記事ここまで #######

この下に随時アップデートを追加する予定です




この記事が気に入ったらサポートをしてみませんか?