2012年

2月

25日

Collada DOMをVC2010で導入したかっただけ

前回からの続き。Collada DOMにリベンジしてみました。

 

前回失敗した原因はやっぱり私のPCにVC2008のランタイムがなかった為。今回は環境がそろっているVC++2010でCollada DOMの環境を整えてみた。

 

始めにCollada DOM2.2で前回同様開発環境を組んで、以下のコードを実行してみた。

mushroom_durer.daeはCドライブ直下に配置した。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//WglWindow.cpp
#include <dae.h>
#include <dom/domCOLLADA.h>

// Collada初期化
void WglWindow::InitCollada()
{
    try
    {
        // Daeオブジェクト作成
        dae = new DAE();
        daeInt result = dae->load("file:/mushroom_durer.dae");

        // 失敗
        if(result != DAE_OK)
            throw "Colladaの初期化失敗";
    }
    catch(...)
    {
        // Daeオブジェクトを開放
        if(dae != NULL)
        {
            dae->cleanup();
            delete dae;
        }

        dae = NULL;
    }
}

で、また失敗した。ビルドは通っているのだが、dae->loadのところで「DAE_ERROR(-3)」という値を受け取っていた。「Generic error」とのこと。

 

「Colladaライブラリのビルドに失敗したのか?」と思い、再度ライブラリのソリューションをビルドするところから始めた。せっかくなのでCollada DOM2.3.1へアップデートして再導入することにした。

まず、Collada DOM2.3.1とvc++2010を使っている方が少ないらしく情報が少ない。導入するまでに2日かかっってしまった。導入するだけでここまで苦戦したのはUbuntuとAndroidの環境を揃えた時以来だ。

 

Colladaライブラリのソリューションをビルドすると幾つかの問題が発生する。主にCollada DOMに付属してるライブラリが原因らしい。今回は「ColladaDOMディレクトリ\dom\projects\vc10-14\dom.sln」を利用したが、他のvc2010向けライブラリでも同様のことが発生する可能性がある。

 

以下にそれぞれの問題点と設定方法をひとつずつ説明していきます。多少長くなるのでご了承ください。

domTestプロジェクト

何故かソースファイルがない。

domTest自体は起動に必要ではないが、collada dom2.2からtestフォルダをコピーすることで解決する。

libxml2

名前のとおりC言語でxmlを扱うためのライブラリ。

 

ソリューションをビルドするとdaeLIBXMLPlugin.cppで「XML_PARSE_HUGE」の宣言がないと言われる。これはデフォルトのlibxml2のバージョンが古過ぎてparser.hに「XML_PARSE_HUGE」が定義されてない為に発生する。バージョンが2.7以降のlibxml2にすることで解決する。

 

幸い「external-libs」フォルダにlibxml2の他に「libxml2-new」というフォルダがある。こちらには「XML_PARSE_HUGE」が宣言されているので、VCプロジェクトのlibxml2の参照先をlibxml2-newへ変更しておく。

 

それと、libxml2には何故かzlibのヘッダやライブラリが入っている。libxml2-new内には入っていないのでlibxml2フォルダ内からコピーする必要がある。それとlibxml2_a.libも無いのでこれもコピーしておく。

 

最終的にはこんな構造になる。libxml2-new\libにvc8、vc9、v10のライブラリが混ざってたのでそれぞれバージョンごとにフォルダを分けてみた。

 

libxml2-new

|ーinclude

| |ーzlib.h

| |ーzconf.h

| |ーlibxml(フォルダ内のファイルが多いので展開図は省く)

|

|ーlib

    |ーvc8

    | |ーlibxml2-vc80-mt.lib

  | |ーlibxml2-vc80-mt.dll

 |  |ーzlib.lib

 |  |ーlibxml2_a.lib

  |

  |ーvc9

    | |ーlibxml2-vc90-mt.lib

  | |ーlibxml2-vc90-mt.dll

 |  |ーzlib.lib

 |  |ーlibxml2_a.lib

  |

  |ーvc10

    | |ーlibxml2-vc100-mt.lib

  | |ーlibxml2-vc100-mt.dll

 |  |ーzlib.lib

 |  |ーlibxml2_a.lib

 

次にVCプロジェクトのlibxml2の参照先を変更する。

 

C/C++→全般→追加のインクルードディレクトリ

対象プロジェクト:dom、dom-static

「..\..\external-libs\libxml2\include」を「..\..\external-libs\libxml2-new\include」へ変更(Debug、Release共通)

 

●リンカー→全般→追加のライブラリディレクトリ

対象プロジェクト:dom、dom-static

「..\..\external-libs\libxml2\win32\lib」を「..\..\external-libs\libxml2-new\lib\vc10」へ変更(Debug、Release共通)

これで「XML_PARSE_HUGE」に関するエラーが出なくなる。

boost

C++の先駆的な開発者のコミュニティ、及びそのコミュニティによって公開されているオープンソースライブラリ(wikipedia参照)。私はスマートポインタのライブラリという程度でしか知らなかったが、他にも様々な分野の機能がある強力なライブラリらしい。

 

ソリューションをビルドすると「Unknown compiler version - please run the configure tests and report the results」という警告が出る。

 

調べてみるとibxml2同様、デフォルトのboostライブラリ(1.35)は古過ぎてMSVC 10.0のを認識しないらしい。ただコチラの場合、「external-libs」に新しいバージョンのboostが無いので自前で用意する必要がある。

 

最新版のboostをダウンロードする。.zipか.7zどちらかのWindows版を選択。

http://www.boost.org/

 

※私はboost1.48.0を利用しましたが、この記事を書いた前日に最新版1.49.0がリリースされたようです。

ダウンロードした圧縮ファイルを解凍して任意の場所に設置。私は「external-libs」フォルダ内に設置しました。

 

次にboostのビルド。今回必要なライブラリは「system」と「filesystem」なのでこの二つだけをビルドする。

 

Visual Studio コマンド プロンプト (2010)を起動。カレントディレクトリを「boost_1_48_0」へ移して以下のコマンドを実行。

 

bootstrap.bat

bjam.exe --with-system --with-filesystem

 

他のboostライブラリも一緒にビルドしたい方は以下のサイトを参考にしてみてください。

Visutal Studio で Boost C++ Libraries をビルドする

 

※注意

bjam.exeに何もオプションを指定しないと全てのライブラリをビルドしようとする。恐ろしく時間が掛かるので必要なものだけを指定するのが良い。

 

正常にビルドが完了すると「boost1_48_0\stage\lib」に以下の↓

libboost_filesystem-vc100-mt-gd-1_48.lib

libboost_system-vc100-mt-gd-1_48.lib

libboost_filesystem-vc100-mt-1_48.lib

libboost_system-vc100-mt-1_48.lib

 

4つのライブラリが出来ます。

次にVCプロジェクトのboostの参照先を変更する。

 

●C/C++→全般→追加のインクルードディレクトリ

対象プロジェクト:dom、domTest

「..\..\external-libs\boost」を「..\..\external-libs\boost_1_48_0」へ変更(Debug、Release共通)

 

●リンカー→全般→追加のライブラリディレクトリ

対象プロジェクト:dom、dom-static、domTest

「..\..\external-libs\boost\lib\vc10」を「..\..\external-libs\boost_1_48_0\stage\lib」へ変更(Debug、Release共通)

 

●リンカー→入力→追加の依存ファイル

対象プロジェクト:dom、domTest

・Debugの場合

「libboost_filesystem-d.lib」を「libboost_filesystem-vc100-mt-gd-1_48.lib」へ変更

「libboost_system-d.lib」を「libboost_system-vc100-mt-gd-1_48.lib」へ変更

 

・Releaseの場合

「libboost_filesystem.lib」を「libboost_filesystem-vc100-mt-1_48.lib」へ変更

「libboost_system.lib」を「libboost_system-vc100-mt-1_48.lib」へ変更

 

最後にdomTest.cpp。90~96行目を参照。

90
91
92
93
94
95
96
string lookupTestFile(const string& fileName) {
    return (dataPath() / fileName).native_file_string();
}

string getTmpFile(const string& fileName) {
    return (tmpPath() / fileName).native_file_string();
}

この状態でビルドすると「native_file_stringという関数が無い」と言われるので、関数名を「string」へ変更する。

90
91
92
93
94
95
96
string lookupTestFile(const string& fileName) {
    return (dataPath() / fileName).string();
}

string getTmpFile(const string& fileName) {
    return (tmpPath() / fileName).string();
}

これで「Unknown compiler version - please run the configure tests and report the results」の警告が出なくなる。

PCRE

Perl5 互換の正規表現をC言語で実装したライブラリ(wikipedia参照)。


Debugでビルドすると「バッグ情報がないものとしてオブジェクトにリンクします。」という警告が大量に出現する。これはPCREライブラリの.pdbファイルが無いために発生するらしい。

 

 以下のサイトではPCREのCMakeファイルからVCプロジェクトを作成し、プロジェクトをビルドすることで.pdbファイルを作成している。ここは無視してもかまわないのだが、デバッグ情報の出力を考えると実装しておいたほうがいいのだろうか?

pcre を Visual Studio 2010 でビルドする

ここまでの設定が終わったらライブラリプロジェクトをDebug・Release共にビルドする。何事も無ければライブラリ側の設定は終了である。

プロジェクト設定(呼び出し側)

今度はCollada DOMを利用するプロジェクトの設定。

参照するラリブラリがDebugとReleaseで違うので注意。

 

●C++→全般→追加のインクルードディレクトリ

・Debug、Release共通

Collada DOMディレクトリ\dom\include

Collada DOMディレクトリ\dom\include\1.4

Collada DOMディレクトリ\dom\external-libs\boost_1_48_0

Collada DOMディレクトリ\dom\external-libs\libxml2-new

 

●リンカー→全般→追加のライブラリディレクトリ

・Debug、Release共通

Collada DOMディレクトリ\dom\external-libs\boost_1_48_0\stage\lib

Collada DOMディレクトリ\dom\external-libs\libxml2-new\lib\vc10

Collada DOMディレクトリ\dom\external-libs\pcre\lib\vc10

Collada DOMディレクトリ\dom\external-libs\minizip\win32\lib

Collada DOMディレクトリ\dom\external-libs\tinyxml\lib\vc10


 ・Debug

Collada DOMディレクトリ\dom\build\vc10-1.4-d

 

 ・Release

Collada DOMディレクトリ\dom\build\vc10-1.4


●リンカー→入力→追加の依存ファイル

 ・Debug

libcollada14dom22-d.lib
libcollada14dom22-sd.lib
libxml2_a.lib
zlib.lib
pcred.lib
pcrecppd.lib
minizip-d.lib
tinyxml.lib
libboost_filesystem-vc100-mt-gd-1_48.lib
libboost_system-vc100-mt-gd-1_48.lib

 

・Release

libcollada14dom22.lib
libcollada14dom22-s.lib
libxml2_a.lib
zlib.lib
pcre.lib
pcrecpp.lib
minizip.lib
tinyxml.lib
libboost_filesystem-vc100-mt-1_48.lib
libboost_system-vc100-mt-1_48.lib

 

最後にCollada Domライブラリの.dlを以下のように各場所へ配置。

実行ファイル(.exe)がある場所です。

 

「Collada Domディレクトリ\dom\build\vc10-1.4-d\libcollada14dom22-d.dll」をDebugフォルダにコピー

 

「Collada Domディレクトリ\dom\build\vc10-1.4\libcollada14dom22.dll」をReleaseフォルダにコピー

 

これで全ての設定が完了です。

その他

●警告「warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存してください。」

とにかくたくさん出る。Collada DOMライブラリの全てのソースファイルでこの警告が発生する。Debug、Release共に「C/C++→詳細設定→指定の警告を無効にする」に「4819」と打つことでこの警告を無視できる。Collada DOMライブラリのプロジェクトでも同様の警告が出るので設定しておいたほうがいい。

 

●警告「LINK : warning LNK4098: defaultlib "msvcrtd.lib" は他のライブラリの使用と競合しています; /NODEFAULTLIB:library を使用してください」

これはDebugで発生する。libxml2 と zlib のリンクがあると警告が出る。これも「リンカー→入力→特定の既定のライブラリの無視」で設定することで無視できる。

 

●文字セット

前回「Unicode 文字セットを使用する」に設定すると書いたが、「マルチ バイト文字セットを使用する」に設定していても問題なく動く。COLLADA DOMを使った3Dモデルデータの読み込みの「開発の準備」に「Unicode 文字セットを使用する」とあるのだが、設定する理由が書かれていないのでよくわからない。

モデルの情報を画面に表示するプログラムを組んでみました。読み込んだモデルは"COLLADA DOMを使った3Dモデルデータの読み込み"のキノコ。

 

こんな感じになりました。

triangles要素が一つでインデックス数が6660個なのでポリゴン数は2220枚。

polygonsとpolylist要素は0個。

頂点ソースが9996個、法線ソースが9996個、UVソースが9390個、それぞれfloat_arrayの個数なので頂点数は3332個。

 

前回みたいに他のモデルで動かなければ意味が無いので、再びCollada変換したうさうさモデルも読み込んで見ました。

 

ちゃんと読み込めているようです。

 

メモリリーク等も起きてないようで正常に終了します。ここまで長かったですが、ようやく実装することが出来ました。

 

あと一回Collada DOMについてやりたいと思っています。次はモデルの表示までやる予定です。

 

●参考にさせていただいたサイト・記事

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

COLLADA dom 2.2 セットアップ

COLLADA dom 2.2 を boost 1.46でビルド

Boost C++ Libraries 1.45.0 ビルドのメモ

Boostインストールメモ(Visual Studio 2010)Add Star

COLLADA DOM 2.31 Build Issues

Twitterのつぶやき:XML_PARSE_HUGEが無いと言われたら~

 

本当に助かりました。皆様ありがとうございます。