ComputerGraphics作成ライブラリ

ComputerGraphics作成ライブラリ

執筆:准教授 神原利彦

投稿日:令和5年1月4日

近年のComputerGraphics(以下CGと略)業界における表現技術の進歩は著しく、Unreal Engine(図1左)やUnity(図1右)といった最新のゲームエンジンを使えば、美麗な3次元CGが簡単に描けるような時代となっている。そんな時代にあっても、筆者は細々とマイナーなCGライブラリを使って研究している。ライブラリとはプログラミングの補助ツールのようなものであり、学生のプログラミング教育の教材として使用されている。単に美麗さを追求する気がないだけと言ってしまえばそれまでだが、無料で使える上に使い勝手が気に入ったせいもあり、筆者は長年使い続けている。今回は、そのマイナーなCGライブラリを2つ紹介する。

図1:Unreal EngineとUnityのロゴマーク

1つ目は、Coin-3Dと呼ばれるライブラリである。そもそも、筆者は最初からこのCoin-3Dを使っていたわけではない。最初に使っていたCGライブラリは、米SGI製のワークステーションコンピュータO2(図2)の上で動作するOpenInventorというものであった。これはSGIが倒産した現在でも生き残っており、TGSという会社が保守・販売をしているのだが、商用ライブラリで高価なため、大学教員ごときが買えるものではない。TGSはSGIの過去の遺産を生かし技術を引き継いで正式なライセンスとしているから高価なのも当然と言えよう。SGIの全盛期には、映画「ジュラシックパーク」のCGがすべてSGIのワークステーションコンピュータで創られたというほどSGIのCG技術はハードウェアとソフトウェアの両面で優れていた。だが、栄枯盛衰が激しい業界なので、やがてハードウェアはnVIDIAやATIに追い抜かれ、ソフトウェアもOpenInventorをオープンソース化しようとして失敗するとかの凋落が続き、最後は倒産してしまった。

図2:SGI製ワークステーションコンピュータO2(オーツー)

では、Coin-3Dとは一体何か?実は、OpenInventorのクローン・ライブラリなのだ。TGSとは別の作り手がゼロから書き起こしたコードで創られており、内部の計算構造などはOpenInventorとは全く異なる作り方をしているくせに、関数名はOpenInventorと全く同一の名前でほぼ同一の機能として使えるライブラリなのだ。つまり、やってることはTGSのOpenInventorと同じなのに無料で使える上にライセンス的にも合法ということになる。元々がIRIXというUNIXプラットフォームで動いていたせいもあり、現在でもWindows/Mac/Linuxのどのプラットフォームでも使えるというのが嬉しい。尤もCoin-3D単体では使えず、LinuxやMacであればSoQtが、WindowsであればSoWinが補助的に必要になってくるが、そのあたりの詳細は長くなるので割愛する。何にせよ、OpenInventorを使っていた時代のC++プログラムがCoin-3Dを使えば、全く問題なく動作しCGが表示されるのだ。このCoin-3Dは研究だけでなく、プログラミング教育にも役立てている。マイナーな存在と書いたが、実はFreeCADと呼ばれるCADソフトのプラグインとしてCoin-3Dが使われているらしい。興味のある人は、Inventor Mentorという書籍(図3)を参考にプログラムを書いてみるといい。全ページ英語だが、日本人でもすぐわかるぐらい簡単な表現しか使ってない上に図が多くてわかりやすいので、すぐCGが創れる。

図3:OpenInventorの教科書
 「Inventor Mentor」

筆者が紹介するもう1つは、Drawstuffと呼ばれるCGライブラリである。OpenDynamicsEngineと呼ばれる物理エンジンに付属している簡易なCGライブラリで、とにかく軽い。Unreal EngineやUnityがやたら重くて、いくら美麗なCGであってもカクカクした動きでは話にならんという一方で、Drawstuffは、美麗さは無いがサクサク動いてくれるという点が優れている。OpenDynamicsEngineを使う場合だけでなく、別のシミュレーションの3次元的な可視化の研究にも使っている。尤も、あまりにも原色的なので、CGというよりは子供のお絵描き…と言われることもあるぐらいだ。確かに美麗さはないと言って良いだろう。

さて、Coin-3DとDrawstuffのうち、どちらのCGライブラリも細かい仕様がかなり異なる。そのため、どちらかの仕様のつもりでプログラムを書いていたら、実はもう片方の仕様だったなんてことも起きる。Windows動かしてるのに、Macのキー操作してしまった…と同じような感覚である。例えば、表示座標系の仕様が異なっている。Coin-3Dは、水平x軸、垂直y軸、奥行z軸なのに対し、Drawstuffは、水平y軸、垂直z軸、奥行x軸なのだ。そのあたりの2つの仕様の違いを理解し、同じような動きをするように考えてプログラムを書くというのも実に面白い。仕様が違うなら、頭を使って、違うのに合わせてプログラムを書き変えればいいだけのことだ。特にCG描画のプログラムってのは、表示させてみれば、どこがおかしいかは一目瞭然なので、表示された結果をじっくりと観察すればエラーや不具合などがわかるはずである。例えば、同じウサギ像のポリゴン・データを使って、CGを作成した例を図4に示す。左がCoin-3Dで、右がDrawstuffによるものである。同じデータなのに、美麗さに差があることが図からもわかる。ポリゴン1つとっても、Coin-3Dは3頂点以外にも平面の法線ベクトルを指定しなければならない。どちらが表でどちらが裏かを指定するためである。その一方で、Drawstuffは3頂点の記述順番で裏/表を判別しているので法線ベクトルを計算する必要は無い。

図4:ウサギ像のCG表示例(左:Coin-3D、右:Drawstuff)

CGプログラミングに限った話ではないが、目に見える形で不具合やエラーがわかるというのが、プログラミング上達に欠かせない要素である。人間は目に見えないと気が付かないから、目に見えない不具合やエラーが放置されたプログラムが次々に問題となっている現状がある。だからこそ、今後もこれらのライブラリを自身の研究発展や学生の教育促進に役立てたいと願う。