Unity/Unreal EngineでXRを作る上で、押さえておきたい「3Dデータの構造」と取り扱い方
アーカイブ動画
言語・計算・データ構造──3D開発に立ちはだかる3つの壁と打開策
バルテス・モバイルテクノロジー株式会社
開発部 マネージャー 山下大輔氏
ソフトウェアテスト専門企業であるバルテスの100%出資子会社として、2012年に設立したバルテス・モバイルテクノロジー(以下、VMT)。バルデスが培ってきたソフトウェア品質向上のノウハウを活用し、3DなどXR関連のシステム、モバイル向けアプリケーションの開発、サイバーセキュリティサービスなどを手がける。
ソフトウェア開発ベンチャーで、エンジニアとしてのキャリアをスタートした山下大輔氏。PLやPM、部門長といったマネジメントや経営も担うようになると、平行して3Dスマホアプリの開発などのXR案件にも従事していく。
VMTにジョインしてからは、同社におけるXRビジネスの成長に寄与。現在は3D技術を広めるための講師活動にも従事する。資格も多数有しており、HTML5アプリ開発プラットフォームMonacaでは、数十万人のユーザーから数名しか選ばれないというMonacaソムリエに、2年連続で選出されている。
建物の内外観を3DCGパースで表現したり、ゲームでVRを体験できたりなど、3Dが身近になったこともあり、「3D開発に携わってみたいと興味を持っている人が増える傾向にある」と、山下氏は言う。
一方で開発には、「プログラミングの壁」「計算の壁」「データ構造の壁」という3つの壁があり、多くの人が二の足を踏んでいるという。それぞれについて説明が行われた。
1.プログラミングの壁
まずは、プログラミングの壁である。3D開発で使われるプログラム言語は、グラフィックスAPIと呼ばれるソフトウェアインターフェースであり、メジャーなグラフィックスAPIとしては、OpenGL/OpenGLES、DirectX、Metal、Vulkan、WebGLが挙げられる。
山下氏は、各APIの使用言語や対象OS、メリット・デメリットなどを自身の経験も踏まえて解説した。(以下、スライド参照)
例えばMetalは、ハードウェアの高いパフォーマンスを引き出すことができるという特徴を持っており、「iPhoneのゲームが優れているのは、Metalが使われているから」と山下氏は語る。一方でAppleが開発者であることから、対象がMacOSとiOSに限定されていることや、学習コストも少なくないなどのデメリットも挙げた。使用言語がJavaScriptであり、Webブラウザで動かすことができるWebGL以外は難易度が高く、苦手だと感じるエンジニアが少なくない。C++が使用言語であるため、学習コストがかかることが壁となる。山下氏は、次のように解決策を話した。
「UnityやUnreal Engineといったゲームエンジンを使えば、いま紹介した低レイヤーのレンダリング処理をすべて実行してくれます。我々はビルド環境により、グラフィックスAPIのプロパティを変更するだけです」(山下氏)
2.計算の壁
続いては、2つ目「計算の壁」だ。3Dプログラミングを行うには、複雑な数学的な計算と、C++で実装する必要がある。
だが、改めて数学を学び直すにはコストが高い。山下氏いわく、ライブラリを活用することや、インターネット検索で解決策を探すことがお勧めだという。
「苦手な計算を苦手な言語でする必要はありません」(山下氏)
3.データ構造の壁
続いては、「データ構造の壁」だ。3Dグラフィックスのデータ構造においては、シーングラフの理解や作成が必要となる。
シーングラフとは、3Dオブジェクトを構成する情報を階層的に保持するデータ構造であり、レンダリングはこのシーングラフの構造に基づいた手法で使用される。イメージとしては、以下スライドのようなツリー構造で表現される。
データ構造を理解すると、3Dオブジェクトを効率的に扱えるようになり、3Dデータのインポーターの作成やデータソースの操作も理解できると、山下氏は強調する。さらには次のように、自身の歩みからその重要性を説いた。
「私自身、データ構造についてはかなり勉強しました。データにおける互換性や、支障が発生しやすいデータとツールの関係性、逆に親和性などについても、身をもって体験してきました。その経験が大変役立っています」(山下氏)
未経験から3D開発をスケールさせた育成スキームとは
続いては、山下氏以外に3D開発の経験者ゼロだった状態から、プロジェクトのスケールまで導いた事例をベースに、3D開発におけるポイントが紹介された。
VMTが3D開発に携わることになったきっかけは、山下氏の前職の顧客からのARアプリ作成依頼だった。だが当時、VMTで3D知識を有しているのは山下氏のみであった。顧客に正直に話したが、「お願いします」と言われ、やるしかない状況となった。そこで山下氏は3D開発が担えそうな、入社1年目の若手社員をアサインする。
ポイントとなったのは、以下3つの要素を持っていたからだという。
- 計算ができそう
- 粘り強い
- 探究心がある
山下氏はその若手メンバーに、3D開発で必須となる「バウンディングボックス」について、まずは理解を深めてもらうべく教えを説いていった。
バウンディングボックスとは、3D形状が入る最小の領域(箱)であり、すべての頂点リストから、それぞれの座標(X,Y,Z)の最小値と最大値を計算することで算出される。
その後、依頼されたARアプリは見事完成し、納品に至る。すると次に、現在作っている3DのレンダリングエンジンをUnityへ移植してほしいという新たな依頼が舞い込む。3D開発の経験を持つ山下氏だが、当時Unityはもちろんゲームエンジンの開発実績はなかった。
しかし先と同じくそのことを伝えると、再び今回も「お願いします」と懇願される。その時の心境を山下氏は次のように吐露した。
「お客様からお願いしますと言われたら、やるしかありませんよね。そこで、ゲームエンジンについて調べるところから開始しました」(山下氏)
ここからがまさに本セッションのテーマにつながっていくが、調べていくと以下のような特徴が分かり、3Dデータ構造を理解する必要性に行き着く。
- ゲームエンジンは言わばオーサリングツール
- ランタイムで3Dデータを読み込む設計ではない
- インポーターを自作するしかない
3Dデータ構造の理解において必要なシーングラフはさまざまな階層から構成されており、最上位に位置するroot階層が親階層となる。
親階層であるroot階層の下には、回転、位置、スケールといったオフセットの情報が入っており、Node階層と呼ばれる。このNode階層は下層に同じくNode階層を複数つけることができ、ツリー構造を構築していく。
Node階層の下、前出のシーングラフで示していたGeometry階層では、オフセット情報に加え、形状に関するポリゴンメッシュ情報、色やテクスチャーなどのマテリアリ情報などが入っている。
そしてさらに最下層のPrimitive階層では、形状の最小単位、具体的には円、四角形、球といった情報が含まれている。
light階層はスポットライト、太陽、シーリングライト、スポットライトなど各種光源の情報が入っており、山下氏は次のように注意点を話した。
「照明の形状をモデリングしただけでは、光源の情報がないため光りません。光の情報はあくまで別、light階層を使って盛り込む必要があります」(山下氏)
マテリアル情報はシーングラフの階層とは独立しており、かつ、テーブル構造となっている。また、マテリアル情報は極力使い回すことで、パフォーマンスを落とさないことが重要だと捕捉した。
頂点情報もマテリアル情報と同じく独立したテーブル構造となっており、具体的には以下スライドのような(X,Y,Z)の頂点座標が配列で管理されている。
山下氏はあくまでイメージだと前置きした上で、頭、首、胴体、腕や指といった形状の3Dオブジェクトを事例に、シーングラフの作成フローも紹介した。
シーングラフで重要だという親子関係についても解説した。位置、回転、スケールといったオフセット情報を4×4の行列に変換することで、親マトリクスと子マトリクスの関係を保つことが可能になる。
そしてこの関係性が保てていないと、親階層で肩が回転しているにも関わらず、子階層である腕や手が動かないなどの状態になってしまう。
ポリゴンメッシュの作成に関する注意点は、法線ベクトルを大きさ1の単位ベクトルにすることだ。単位ベクトルでないと光が当たった際に反射が大きくなり、色も分からないような状態になってしまうからである。
これまで説明してきたように、データ構造の壁を乗り越えるためには、2つ目の計算の壁を乗り越える必要があることは明白だ。シーングラフ(データ構造)の概念は多くの3Dデータフォーマットやゲームエンジン、3DCGツールなどで使われている。山下氏は次のようなメッセージを視聴者に投げかけた。
「3Dデータとゲームエンジンのデータ構造のやり取りができれば、ほぼ無敵状態となります。最後は根気強く、本気で頑張るしかありません」(山下氏)
山下氏は、データ構造を理解したことで実現できた事例を、Unity、Unreal Engineそれぞれについて紹介した。
>
データ構造を理解したことで、UnityからUnreal Engineへのエンジニア移行がスムーズに行うことができた。汎用的なアプリケーションを作れるようになったことで、提案の幅が広がり、案件の受注にも繋がったという。そして次のように語り、セッションを締めた。
「経験がない人でも3D開発者に成長できたこと、ロードマップも含めた基盤が整ったこと。成長した人が他の人に教えることができる環境が整ったこと。その結果、私一人が一生懸命がんばる必要がなくなったことが、一番大きな成果だと考えています」(山下氏)
【Q&A】参加者からの質問に登壇者が回答
セッション後は、山下氏と同じ開発部に所属し、UnityをベースとしたVR/ARなどのアプリの開発・保守を担当する41h0(シホ)氏がVRアバターで登場。山下氏と2人で、イベントを聴講した参加者からの質問に回答した。いくつか抜粋して紹介する。
バルテス・モバイルテクノロジー株式会社
開発部 41h0(シホ)氏
Q.OpenGLとGLUTの関係性は?
山下:GLUT は「OpenGL Utility Toolkit」の略語です。OpenGLは低レベルのレイヤーですが、GLUTは高レベルのため、OpenGLよりも事細かな実装を容易に行うことが可能です。
Q.最近のゲームで使われる言語は?
41h0:一般的にUnityではC#、Unreal EngineではC++が使われます。一方で、大手ゲーム会社はオリジナルのゲームを使っているケースもあると思います。
山下:ゲーム会社によるプラットフォームが異なっており、Unityで開発している会社もあれば、Unreal Engineで独自のゲームエンジニアの場合もあります。例えば、DirectXであればC++が使われています。
Q.処理高速化の手法について
41h0:まず、VR酔いの原因となるfpsに気をつけましょう。
山下:マテリアリ情報はできるだけ使い回してほしいですね。メモリを大きく使ってしまうからです。同じくテクスチャーの解像度もあまり大きくすると、メモリを食ってしまいパフォーマンスが低下するので、注意が必要です。
Unityであれば、SRP Batcherや、距離に応じて鮮明度を制御するLevel of Detail(LOD)などの手法を使うことで、高層化が実現できます。
41h0:Unityであれば、レンダリングエンジンをURP (Unity Universal Render Pipeline)に選ぶと、調整しやすいと思います。
山下:目に見えていない描画の処理にも注意が必要です。データ構造を間違えてカリングしてしまうと、見えてほしいモデルまで消えてしまうからです。
Q.ブラウザゲームでは、JavaScriptのWebGLが使われているのか
41h0:Unityのゲームを投稿するルームに参加していると、最近はUnityでもブラウザではWebGLを使っている印象があります。
山下:Webでゲームを作るのであれば、メジャーなところではPlayCanvas、three.js、Babylon.jsなどの開発が進んでいるのでお勧めします。
Q.unityを使っているが、C#が苦手なのでアセットですべて済ませたい
41h0:動きを細かく区切って検索することをお勧めします。格闘ゲームを開発する場合、例えば、パンチを出す、パンチを出す手の動き、相手にぶつかる、相手にダメージを与えるというように、動作を区切ってタスク化して検索すると結構出てくると思います。
Q.ChatGPTを利用したXRの開発事例を知りたい
41h0:他社の事例ですが、HIKKY社がVket CloudでChatGPTを使って、AIアバターを発表していました。ChatGPTを使い、脱出ゲームを作った方もいます。ユーザーの会話に対応できるため、NPC(ノン・プレイヤ・キャラクタ)的なものを生成したり、メタバース上でNPCを使って盛況に見せたりする使い方もあります。
山下:開発工程で使えるかどうかは、現状はまだ微妙というのが正直なところです。例えば、シェーダーのプログラミングを書いてはくれるでしょうが、本当に正しいのかどうか、検証する必要があるからです。
Q.UnityとUnreal Engine5、どちらがお勧めか
山下:モバイル開発であればUnity、ハイエンドなゲームやデジタルツイン、建築などの大規模データ処理や高画質処理が必要であれば、Unreal Engineがお勧めです。
41h0:例えば、これまでC#を使ってきた方であれば、Unityの方がいいかもしれません。逆に、C++に慣れている人であれば、Unreal Engineの方がいいかもしれない。使っている際の楽しさも含め、ユーザーにより異なるのではないでしょうか。
Q.データ構造を抑えることでの3D開発の効率や、パフォーマンスへの影響は?
山下:3Dデータのインポーターを作ることで、ゲームエンジンにどのように展開したらいいのかを覚えるようになります。さらに中身や構造を理解することで、カスタマイズなども容易になります。
41h0:簡略化や分かりやすさにつながるため、他人に教えやすくなりますね。エンジニアの開発コストも抑えられるのではないでしょうか。
Q.3Dを学習する上でのお勧めの資料や勉強法は?
山下:glTF(GL Transmission Format)など、公開されている3Dフォーマットの仕様書が一番参考になります。情報がすべて詰まっているからです。仕様書の情報を読み込むことで、3Dデータのできあがりを理解することもできます。より深く知りたい場合は、インターネット上の情報などで勉強するのもお勧めですね。
Q.5.2が発表されたUnreal Engine、アップデートに伴う下位バージョンとの互換性は?
41h0:基本的にエクスペリメントなものは使っておらず、C++も特に触れていないので、安全だという印象です。ただ、何が起こるか分からないリスクがあることも事実です。安定版のバージョンがアップデートされるまで待つ方が安心だとは思います。
山下:影響がゼロということはないと思います。随時試したり調べたりしながら、進めていくしかないのではないでしょうか。
Q.難易度が高かったAR・VRの開発事例は?
41h0:UnityのViewerを作った際、高画質にこだわり、VR機能もつけたため、軽量化する作業が、かなり辛かった記憶があります。他には、ゲーミング用のGPUを積んでいないけれど、美しくかつVR機能もつけてほしいという要望もなかなか難しかったですね。