takminの書きっぱなし備忘録 @はてなブログ

主にコンピュータビジョンなど技術について、たまに自分自身のことや思いついたことなど

OpenSceneGraphのインストールとモデル読み込み&表示

OpenSceneGraphというのは、オープンソースのコンピュータ・グラフィックス用ライブラリで、WindowsMacLinux等の各種環境で動作します。OpenGLC++をサポートしています。
OpenSceneGraphのサイトは以下のとおり。
http://www.openscenegraph.org/projects/osg


「シーングラフ」というのはCGの3Dオブジェクト間の関係を木構造で表す概念だそうです。
乱暴に説明すると、例えば道路というノードの下に車というノードがあり、その下にタイヤというノードが関連付けられてるとします。例えば道路の上を車を移動させると、その車の移動に合わせてタイヤも一緒に動きます。また車ノードを削除すればタイヤノードも一緒に削除されますし、車ノードを自転車ノードと置き換えてあげれば、車があった位置に自転車が表示されるようになります。
ここらへんの説明がわかりやすいかと。
http://grace4.solid.ad.jp/~javao/j3dbook/firstbook/text/node19.html
http://www.stackedboxes.org/~lmb/asittbpo-open-scene-graph/chapter-1-the-basics/


僕はCGに関しては初心者ですが、簡単に3次元モデルファイルを読み込んで表示してくれるライブラリはないかと探していたところ見つけました。このOSGは3dc、3ds、flt、geo、iv、ive、lwo、md2、objなどの各種フォーマットをサポートしています。

というわけで、このOSGのインストール手順と、これらのモデルを読み込んで表示するまでの簡単なプログラムを書きたいと思います。

僕が構築した環境は以下のとおり

CMakeのインストール

まずインストールにはCMakeを使うため、以下のサイトからダウンロードし&インストールして下さい。ダウンロードして、解凍して、実行して、指示に従えばあっという間にできると思います。
http://www.cmake.org/

ここではVersion 2.8.3を使用しました。

OpenSceneGraphのダウンロード

OpenSceneGraphはここから取ってこれます。
http://www.openscenegraph.org/projects/osg/wiki/Downloads


ここでは、OpenSceneGraph-2.8.3.zipをダウンロードしました。

次に、このzipファイルを解凍して、フォルダをどこか適当なところにコピーします。
例:C:\OpenSceneGraph-2.8.3

CMakeによるビルド環境構築

CMakeを起動します。
「スタートメニュー」→「すべてのプログラム」→「CMake 2.8」→「CMake(cmake-gui)」

ここでは、
"Where is the source code:"に"C:/OpenSceneGraph-2.8.3"
"Where to build the binaries:"に"C:/OpenSceneGraph-2.8.3/build"(このフォルダは自分で作成)
と指定しました。
次にConfigureボタンを押します。赤いラインがなくなるまで繰り返し押します。
赤いラインがなくなったら、Generateボタンを押します。

OpenSceneGraphのビルド

CMakeによって作成されたソリューションファイルを起動します。この例では、
C:/OpenSceneGraph-2.9.8/build/OpenSceneGraph.sln
を起動します。

これを、そのままコンパイルすると、

3>..\..\..\src\osg\GraphicsContext.cpp(680): error C2039: 'back_inserter' : 'std' のメンバーではありません。

このようなエラーが大量にでるので、ソースに一部修正を加えます。
そこで、
http://forum.openscenegraph.org/viewtopic.php?t=6248
を参考に
osgプロジェクトのHeader Files下
NodeCallBack
の頭と
String.cpp
の頭に
#include
をいれます。


次にこれをデバッグモード、リリースモードそれぞれでコンパイルします。
(これがすごーく時間がかかる。)

開発環境の構築

VC++2010の新規プロジェクトを作成します。ここではWin32コンソールアプリケーションを作成しました。
プロジェクト名を仮に「OSCtest」とします。
ソリューションエクスプローラーの「OSCtest」を右クリックして、「プロパティ」を選択します。


「追加インクルードディレクトリ」にここでは

  • C:\OpenSceneGraph-2.8.3\include
  • C:\OpenSceneGraph-2.8.3\build\include

を追加します。


「追加ライブラリディレクトリ」に
Dubugモード:

  • C:\OpenSceneGraph-2.8.3\build\lib\Debug

Releaseモード:

  • C:\OpenSceneGraph-2.8.3\build\lib\Release

を追記します。


「追加の依存ファイル」に

  • osgd.lib
  • osgViewerd.lib
  • osgGAd.lib
  • osgDBd.lib

を追加します。


次に

  • C:\OpenSceneGraph-2.9.8\build\bin\Debug
  • C:\OpenSceneGraph-2.9.8\build\bin\Release

からdllをmainのソースファイルと同じフォルダか、または"<開発ホーム>\Debug"と"<開発ホーム>\Release"にそれぞれコピーします。


以上で開発の準備が整いました。

3Dモデルの読み込みと表示

どうやってコードを書くかは、このチュートリアルからはじめるのが良さそうです。
http://www.openscenegraph.org/projects/osg/wiki/Support/Tutorials


これを参考に、OBJファイルを表示させるプログラムを作りました。
OBJファイルは、以下のサイトから取ってきました。
http://www.oyonale.com/modeles.php?lang=en&page=53

ソース

#include 
#include 
#include 
#include  
#include 
#include 


int main()
{
	osg::Node* duckNode = NULL;
	osg::Group* root = NULL;
	osgViewer::Viewer viewer;
	osg::Vec3 duckPosit; 
	osg::PositionAttitudeTransform* duckXform;
	
	duckNode = osgDB::readNodeFile("ducky.obj");

	root = new osg::Group();
	duckXform = new osg::PositionAttitudeTransform();

	root->addChild(duckXform);
	duckXform->addChild(duckNode);

	duckPosit.set(5,0,0);
	duckXform->setPosition( duckPosit ); 
	viewer.setCameraManipulator(new osgGA::TrackballManipulator());

	//viewer.setUpViewer(osgProducer::Viewer::STANDARD_SETTINGS);
	viewer.setSceneData( root );
	viewer.realize();

	while( !viewer.done() )
	{
		viewer.frame();
	}
}

結果はこんな感じで表示されます。マウスでグリグリ動かせます。