SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

COLLADA DOMを使った3Dモデルデータの読み込み

OpenGLでCOLLADAドキュメントを利用する


  • X ポスト
  • このエントリーをはてなブックマークに追加

ダウンロード バイナリファイル (1.5 MB)
ダウンロード ソースコード (1.5 MB)

今回の記事では、XMLベースの3Dアセットデータ(3Dモデル、テクスチャ、シェーダ、物理パラメータなど)のためのファイルフォーマットである、「COLLADA」のデータ読み込みと、そのデータを使ったOpenGLでの描画を解説します。

  • X ポスト
  • このエントリーをはてなブックマークに追加

はじめに

 この記事では、COLLADAドキュメントをCOLLADA DOMを使って読み込み、OpenGLで描画する方法について解説します。OpenGLでの描画はシンプルなテクスチャマッピングをして、メッシュを描画するだけのものですが、COLLADA DOMを導入してデータを取得することで、3Dモデリングソフトで作ったデータを簡単に利用することができるようになります。

サンプルソースで作成した3Dモデル
サンプルソースで作成した3Dモデル

COLLADAとは

 COLLADAとは、2004年のSIGGRAPH(シーグラフ、Special Interest Group on Computer Graphics)でSony Computer Entertainment Americaの技術者により開発が始まった、3Dアセットデータのためのファイルフォーマットです。

 ゲームなどの3Dグラフィックスを使うアプリケーションでは、モデルデータやテクスチャ、シェーダ、アニメーションなど、さまざまなデータが必要になります。これらのデータを作成するためには複数のソフトウェアを使うことになり、ソフトウェア間でデータの受け渡しをする必要があります。このとき、ソフトウェア固有のファイルフォーマットに変換して受け渡しを続けると、エクスポートによるデータの欠損や、受け渡しできないデータが切り捨てられるなど、さまざまな問題が発生します。そこで、ソフトウェア間でデータの欠損なくスムーズに受け渡しができるような統一形式としてCOLLADAが提案されました。

 COLLADAに対応したツールとして、3Dモデリングソフトウェアの3ds MAXMayaSoftImage XSISketchUp(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のライブラリです。

リンクするライブラリ(Debugビルド向け)
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
リンクするライブラリ(Releaseビルド向け)
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でテクスチャとして利用するための補助クラスです。

次のページ
関数の作成 その1

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

高橋 誠史(タカハシ マサフミ)

僻地の大学院生です。GPUプログラミングとそのニュースを集めたサイトShader.jpを開いています。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/843 2007/01/22 09:53

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング