どうも Monacaソムリエです。
私は10年以上、3DCGやVR/ARのシステム開発に
携わっていますが、よく聞かれることがあります。
・3Dシステムの開発ってどうするするの?
・そのシステムをどうやって検証(評価)してるの?
一言で答えるのは非常に難しいのですが、傍から見ると
遊んでいるようにしか見えないことがありますw。
でも、ちゃんと理由はあるんですよ。
一見遊んでいるようにも見えるこの業務、
実は目に見えない細かいところで開発者は四苦八苦しているのです。。。
(もちろんビジュアルがメインなので、魅力的な開発現場であることは間違いないです)
今回はそのあたりを解説していきましょう!!
う~ん。改めて言われるとどう説明したら良いものか。。。
以前のブログ「AR/VRを始める前の3Dの基本的な事~3つの壁に挑もう!!~」
(https://www.valtes-mt.co.jp/vmt-tech-blog/20190927)
で説明した通り、開発言語はほぼ「C/C++」です。
ほら、これを言ったとたん多くの人が後ずさりしますw。
20年ぐらい昔はWindowsシステムがメインで、
主に私はMicrosoft Visual Studio C++(以下VC++)、
Borland C++ Builder(C++ Builder)を使っていました。
もちろんUnix/Linuxもやってましたので、
開発環境はCUIを使ってのBCCコンパイラでした。
なぜ、C/C++がメインなのか?
それは仕方ないです、主流となっているGraphics APIの
OpenGLとDirectXがC++専用のAPIだったからです。
しかし、現在は時代も進化し、UnityやUnreal Engineでも
比較的簡単にモバイルやハイエンドなシステムが開発できるようになりましたが、
やはりC/C++の知識は必要ですね。(UnityはC#です)
Graphics APIもOpenGLとDirectXだけでなく、MetalやVulkanなど
マルチプラットフォームに対応できるエンジンが出てきましたが
やはり、それらはC/C++で呼び出すことが基本になっています。
後必要なのは、数学の知識です。
高校の教科書を見直してくださいねw。
簡単に言うと以下の知識を使います。
・3軸座標(X、Y、Z軸)
・三角関数(Sin、Cos、Tan)
・行列計算(4x4)
・円、球の方程式
・ベクトル計算(法線、内積、外積)
これは思い出してもらわないと、絶対に作れません。
勉強している当時は何の役に立つの?って思いましたが、
こういう仕事にすごく役立ちます。
高校の授業でそう教えてもらったら、もっと勉強する気が湧いてきたかも?
ざっとまとめますと。。
C/C++、C#の知識と数学の知識を用いて
それに適した開発環境(VC++、Unity、Unreal Engine)で
3Dシステム開発を勤しんでいます。
作った3Dシステムをどうやって評価しているか?
なのですが、これは答えは簡単!!
目視です!!
ひたすら目視です。
それで終わってしまったら面白くないので、
解説していきますね。
3Dデータが正しく表示されているか?です。
目視で確認する内容としては下記になります。
・形状が正しく表示されているか?
・モデルの親子関係が正しく表示されているか?
・色は正しく出ているか?
・テクスチャは正しく貼られているか?
・法線の向き(ポリゴンが反転してないか?)はあっているか?
・ポリゴンが重なってないか?
これは何を確認しているか?というと
各種3DCGツールで作成された3Dデータをインポートするのですが、
それが正しく反映されているか?です。
作られたツールやデータの仕様によっては非常に「クセがすごい」ので、
そのあたりが包括されているかの確認です。
これは特徴を理解しておかないと調整に非常に時間がかかります。
これはシステム要件によりますが、ここではよりリアルに
表示させる要件としましょう。
いわゆる、フォトリアル(写実的)になっているか?です。
・光源の再現性(直接光、関節光、影表示)
・アンビエントオクルージョン
・グローバルイルミネーション
要するに、光が当たったときの表現が物理計算上正しく表現されているか?です。
光が照らされて、それが反射して、そこに影ができて。。。
まぁこれを目視で全部やるのは難しいですが、これはある程度経験や
人の印象によって評価が分かれてしまいます。
もう一つは素材感、いわゆる質感です。
代表的なものは、金属、布や綿、ガラス、木材です。
これは非常に見た目を左右する項目ですね。
簡単に書いてますが、実はここにすごい労力と根気がいるのです。
アンビエントオクルージョンとかグローバルイルミネーションとかが
質感、写実的な表現に非常に重要なところなのですが、
このあたりは話すと長くなるので、それはまた別の機会にしましょう
要は単純にスカスカ早く・スムーズに動くか?です。
せっかく3Dが表示されても、何も操作できない。
PC、スマホが固まったら意味ないですよね?
ただ、大原則として、「パフォーマンスと画質」はトレードオフの関係にあります。
画質をあげればパフォーマンスが下がる
パフォーマンをあげれば画質が下がる
もちろん工夫をすれば、両方上げれますが基本的には
画質をあげる場合はハードウェア性能を上げた方がよいでしょう。
では、パフォーマンス低下の原因は何でしょうか?
・ポリゴンが多い
単純にデータ数が多ければ多いほど、パフォーマンスは下がります。
・マテリアル、テクスチャ情報が多い
例えば、同じ色、同じテクスチャを使えばいいのに、別データとして扱って
しまうと、メモリ消費量がえらいことになってしまいます。
・光源が多い、影が多い
実は光源と影のリアルタイム計算が一番パフォーマンスに影響が出ます。
ここをうまく処理しないと実用には耐えれなくなりますね。
あと、パフォーマンスを図るうえで重要な指標があります。
それはFPS(Frames Per Second)です。
※ゲームジャンルのFPS(First Person Shooting)じゃないですよw。
要するにフレームレートのことで、1秒間のコマ数です。
これは昔のアニメと同じと考えてください。
1秒間に表示する画像の枚数が多ければ多いほど、それをアニメーションすると
スムーズに動いているように見えますよね?
それと同じで、1秒間に何回描画が更新されるか?になります。
リアルタイム3Dとして、スムーズで滑らかに見れるFPSは
30~60FPSですね。もちろんそれ以上に越したことはありません。
しかし、画質を求める場合はなかなかそうはいきません。
どうしても、処理が重くなるところが出てきてしまいます。
何とか3Dを操作して、リアルタイムに反応できるFPSの限界は
私の経験上10~12FPSぐらいです。
10未満になると、リアルタイム3Dとしてはアウトですね。
あと、あまりハードウェア性能限界までやると、CPUやGPUが
熱暴走してしまいます。
スマホもホッカイロみたいになってやけどしてしまうぐらい
熱くなるので、皆さん画質を追い求めるときは気を付けてくださいね。
とにかく、3Dシステムを作るときはこの
「パフォーマンスと画質」のトレードオフの関係とどう付き合うか?
にほとんどの時間が費やされます。
3Dでない、Webシステムやスマホアプリと比較すると
品質の観点から言うと、意外と非機能要件が厳しい開発になってしまいます。
もちろんハードウェア性能は昔に比べれば格段に良くなりましたが、
求める画質も格段に上がったので、今も昔もこの苦労は絶えないかなと。。。
3Dって意外と苦労も多いのはわかったけれど、面白いと思ったあなた
ぜひ、VMTでチャレンジしてみませんか?
VMTではそんな仲間を募集しています!!
当社で開発している3D・VR・ARアプリケーションの開発エンジニアを募集中です。
詳しい求人内容はバルテスグループ採用サイトをご覧ください。
画像をクリックいただきますと詳しい求人内容をご覧いただけます。
是非フォローや「いいね!」をお願いいたします!
公式アカウントはこちら