はじめに
この記事では、COLLADAドキュメントをCOLLADA DOMを使って読み込み、OpenGLで描画する方法について解説します。OpenGLでの描画はシンプルなテクスチャマッピングをして、メッシュを描画するだけのものですが、COLLADA DOMを導入してデータを取得することで、3Dモデリングソフトで作ったデータを簡単に利用することができるようになります。
COLLADAとは
COLLADAとは、2004年のSIGGRAPH(シーグラフ、Special Interest Group on Computer Graphics)でSony Computer Entertainment Americaの技術者により開発が始まった、3Dアセットデータのためのファイルフォーマットです。
ゲームなどの3Dグラフィックスを使うアプリケーションでは、モデルデータやテクスチャ、シェーダ、アニメーションなど、さまざまなデータが必要になります。これらのデータを作成するためには複数のソフトウェアを使うことになり、ソフトウェア間でデータの受け渡しをする必要があります。このとき、ソフトウェア固有のファイルフォーマットに変換して受け渡しを続けると、エクスポートによるデータの欠損や、受け渡しできないデータが切り捨てられるなど、さまざまな問題が発生します。そこで、ソフトウェア間でデータの欠損なくスムーズに受け渡しができるような統一形式としてCOLLADAが提案されました。
COLLADAに対応したツールとして、3Dモデリングソフトウェアの3ds MAXやMaya、SoftImage XSIやSketchUp(COLLADA出力は,有料版のProのみです。無料版の方でも出力できるGoogle Earth 4のkmzはCOLLADAをベースにしたファイルです)などの商用ソフトウェアがあり、無償で使えるものとしては、blenderなどがあります。
COLLADAでは従来のモデルデータのファイルのように3Dモデルの形状データやマテリアルデータ、アニメーションデータ以外のデータも保持することが出来ます。例えば、シェーダプログラミングのためのパラメータ(COLLADA FX)や物理エンジンのパラーメータ(COLLADA PhysX)などです。シェーダプログラミングのパラメータは、モデリングソフトやNVIDIAのシェーダオーサリングツールのFX Composer 2.0(この記事執筆時点ではSonyのPS3開発者向けに先行公開)などのソフトウェアが対応しています。物理エンジンのパラメータにはAGEIA PhysXなどが対応しています(SDKにサンプルが付属しており利用方法が紹介されている)。
対象読者
COLLADA DOM自体はCOLLADAドキュメントのパースなどを行うDOMに過ぎず、3Dでの描画にはOpenGLやDirect3DといったグラフィックスAPIが必要になります。今回の記事では、OpenGLを使っています。そのため、OpenGLとGLUTを使ったプログラムへの知識があることが前提になります。
必要な環境
Visual Studio 2005(今回のサンプルではVisual Studio 2005のプロジェクトしか付属しませんが、Visual Studio.NET 2003でも開発は可能です)。
サンプルについて
今回のサンプルでは、COLLADA DOMを使ってCOLLADAドキュメント(拡張子は、*.dae)から頂点座標、法線、テクスチャ座標、テクスチャファイル名の取得を行っています。そして取得したデータを元に、OpenGLで描画します。COLLADAにはアニメーションやシェーダ、物理などのパラメータを埋め込むことができますが、今回は単純にテクスチャマッピングされたモデルの描画までを行います。
準備
COLLADAドキュメントの読み書きをするためのCOLLADA DOMのソースとライブラリは、SourceForge.netで配布されています。
開発環境がVisual Studioであれば、インストーラが用意されているので、セットアップが楽になります。インストーラ版は、ダウンロード画面の「COLLADA 1.4.1 DOM Installers」を選択します。インストーラで配布されているパッケージでは、ライブラリもビルド済みなので、使っているVisual Studioのバージョンにあったものをインストールし、ライブラリやインクルードファイルのパスを通すだけで、開発を始めることができます(インストーラ形式でないものであれば、ライブラリのビルド作業が必要になります)。
今回の記事ではVisual Studio 2005向けのパッケージで話を進めます。
開発環境の用意
COLLADA DOMがインストールできたら、Visual Studioで使うためにライブラリやインクルードファイルのディレクトリパスを通します。以下、パスの一覧です(Visual Studio.NET 2003の場合、若干異なります)。
ライブラリ
- C:\Program Files\COLLADA\COLLADA_DOM\lib-dbg\vc8\1.4
- C:\Program Files\COLLADA\external-libs\libxml2\win32\lib
インクルードファイル
- C:\Program Files\COLLADA\COLLADA_DOM\include
- C:\Program Files\COLLADA\COLLADA_DOM\include\1.4
開発の準備
リンクするライブラリ
今回のサンプルでは下記のライブラリをリンクしています。「libcollada~」で始まるものがCOLLADA DOMのライブラリです。
libcollada_dae_d.lib libcollada_dom_d.lib libcollada_STLDatabase_d.lib libcollada_LIBXMLPlugin_d.lib libcollada_stdErrPlugin_d.lib libxml2_a.lib zlib.lib iconv_a.lib wsock32.lib
libcollada_dae.lib libcollada_dom.lib libcollada_STLDatabase.lib libcollada_LIBXMLPlugin.lib libcollada_stdErrPlugin.lib libxml2_a.lib zlib.lib iconv_a.lib wsock32.lib
WinSockのライブラリをリンクする必要があるのは、COLLADA DOMが通信をサポートしているためです。
ライブラリ以外に必要なVisual Studioの設定とし「文字セット」の設定と「ランタイム ライブラリ」があります。「文字セット」の設定は、「Unicode 文字セットを使用する」にします。「ランタイム ライブラリ」の設定は「マルチスレッド DLL」(Releaseの場合)と「マルチスレッド デバッグ DLL」(Debugの場合)にしておく必要があります。
インクルードファイル
今回のサンプルでは下記のインクルードファイルを使います。コメント「COLLADA DOM関連」以下の2つのインクルードファイルがCOLLADA DOMからのインクルードファイルになります。
#include <windows.h> #include <gl/gl.h> #include <gl/glut.h> #include "TGATexture.h" #include <vector> using namespace std; // COLLADA DOM関連 #include <dae.h> #include <dom/domCOLLADA.h>
「TGATexture.h」はTGA形式の画像をテクスチャとして利用する際の処理を行うクラスを記述したものです。このクラスでは、TGA形式の画像を読み込んで解像度の取得、ピクセルデータの取得などOpenGLのテクスチャ生成の関数に必要な情報を取得します。ソースに関しては、今回のサンプルの本題には関係が無いので割愛します。
// ビューポートのサイズ const unsigned int SCREENX = 640; const unsigned int SCREENY = 480; // グローバル DAE* g_dae = NULL; int g_iGeometryElementCount = 0; // ジオメトリ数 int g_iImageElementCount = 0; // テクスチャ数 vector<CTGATextureHelper*> g_Texture; vector<GLuint> g_TextureObject; // テクスチャ
グローバル変数は上記の通りです。コメント「ビューポート」以下は、OpenGLでのビューポートの解像度になります。
コメント「グローバル」以下にある、「DAE」はCOLLADAドキュメントを読み込むクラスです(DAEはCOLLADAドキュメントの拡張子、*.daeから)。ジオメトリ数とは、ドキュメント内のジオメトリデータの数です。CTGATextureHelper
クラスはTGAファイルの読み込みを行うクラスでOpenGLでテクスチャとして利用するための補助クラスです。