Mercurial > hg > Papers > 2009 > koba-thesis
changeset 9:9d563ce738ab
fix
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 25 Feb 2009 18:48:14 +0900 |
parents | ae3f30989dac |
children | b8cfcefb7e56 |
files | A-5-4-055722/A-5-4-055722.tex |
diffstat | 1 files changed, 84 insertions(+), 26 deletions(-) [+] |
line wrap: on
line diff
--- a/A-5-4-055722/A-5-4-055722.tex Wed Feb 25 18:21:14 2009 +0900 +++ b/A-5-4-055722/A-5-4-055722.tex Wed Feb 25 18:48:14 2009 +0900 @@ -26,14 +26,29 @@ \thispagestyle{fancy} \section{研究背景・目的} -当研究室では学生実験において、PlayStation3を用いた並列的なゲームプログラムの作成を行っている。そこで使用されるのが当研究室で開発したCeriumレンダリングエンジンである。Ceriumを用いたゲームプログラムの例題としてPlayStation2で動作していた超弾帝(スーパーダンディ)というゲームの移植を行った。\\ -その際、オブジェクトの描画が正常に行われない、衝突判定の位置ずれが生じる等の不具合が発生した。超弾帝には約100種類に及ぶオブジェクトが存在し、今後も同様な不具合を修正していくとすると、学生実験の進行に大きな支障をきたす事となる。\\ -本研究ではCeriumの中でもSceneGraphに着目し、SceneGraph単位でのテストを行うことで、、オブジェクトごとの振る舞いや描画をチェックする。これにより、ゲームのデバッグを容易にし、今後の学生実験におけるゲームの移植や改良、作成を円滑にすることができる。 + +当研究室では学生実験において、PlayStation3を用いた並列的な +ゲームプログラムの作成を行っている。そこで使用されるのが当 +研究室で開発したCeriumレンダリングエンジンである。Ceriumを +用いたゲームプログラムの例題としてPlayStation2で動作してい +た超弾帝(スーパーダンディ)というゲームの移植を行った。 + +その際、オブジェクトの描画が正常に行われない、衝突判定の位 +置ずれが生じる等の不具合が発生した。超弾帝には約100種類に及 +ぶオブジェクトが存在し、今後も同様な不具合を修正していく必 +要があると考えられる。 + +本研究ではCeriumの中でもSceneGraphに着目し、SceneGraph単位 +でのテストを行うことで、、オブジェクトごとの振る舞いや描画 +をチェックする。これにより、ゲームのデバッグを容易にし、今 +後の学生実験におけるゲームの移植や改良、作成を円滑にするこ +とができる。 \section{SceneGraphによるゲームフレームワーク} - \subsection{SceneGraphの特徴} - ゲームの中の一つの場面(Scene)を構成するオブジェクトやその振る舞い、ゲームのルールの集合をSceneGraphとする。SceneGraphのノードは親子関係を持つTreeで構成される。 -(図\ref{fig:sglist}) + +ゲームの中の一つの場面(Scene)を構成するオブジェクトやその振 +る舞い、ゲームのルールの集合をSceneGraphとする。SceneGraph +のノードは親子関係を持つTreeで構成される。(図\ref{fig:sglist}) \begin{figure}[htbp] \includegraphics[width=8.5cm]{pic/SceneGraph.eps} @@ -41,14 +56,27 @@ \label{fig:sglist} \end{figure} - 親子関係とは、親オブジェクトの回転や並行移動等の行列計算による頂点座標の変更が子オブジェクトにも反映する関係の事である。これは子に対してスタックに積まれた親の変更行列を掛ける事で実現できる。 +親子関係とは、親オブジェクトの回転や並行移動等の行列計算に +よる頂点座標の変更が子オブジェクトにも反映する関係の事であ +る。これは子に対してスタックに積まれた親の変更行列を掛ける +事で実現できる。 + + +ゲーム内で使用するオブジェクトはBlenderというオープンソース +の3次元コンピュータグラフィックスソフトウェアで作成する。作 +成したオブジェクトモデルはpythonスクリプトによりxmlファイル +に変換され、それを元にSceneGraphが生成される。 - \subsection{SceneGraphを用いたゲームプログラム} - ゲーム内で使用するオブジェクトはBlenderというオープンソースの3次元コンピュータグラフィックスソフトウェアで作成する。作成したオブジェクトモデルはpythonスクリプトによりxmlファイルに変換され、それを元にSceneGraphが生成される。 - 生成したSceneGraphはset\_move\_collisionという関数によってmoveやcollisionが実装される。 +生成したSceneGraphの各ノードには、オブジェクトの動きを決める +\verb+move+ という関数と、オブジェクトの相互作用を決める +\verb+collision+という関数を入れる変数がある。この変数は、 +\verb+set_move_collision+という関数によって変更される。 - \subsubsection{move} - オブジェクトの動作や状態遷移を記述する。各オブジェクトは複数のmove関数を持っており、set\_move\_collision関数によって状態遷移する。簡単なプログラム例を以下に示す。 +\subsection{move} +以下の例では、\verb+boss1_move_right+は、ボス1を右に +\verb+node->stack_xyz[0]+だけ移動させる。スクリーン +適当な位置にくると、\verb+move+をボス1を左に移動される関数 +\verb+boss1_move_left+に設定する。 {\scriptsize \begin{verbatim} @@ -70,14 +98,26 @@ \end{verbatim} } -オブジェクトはboss1\_move\_leftによって左に移動する。しかし、そのままだといずれ画面外に消えてしまう。そこでboss1\_move\_left関数中で条件分岐を立て、画面外ぎりぎりの座標になったらset\_move\_collisionでmove\_rightに切り替え、右移動に切り替える。しかし、このままでもいずれ画面外に消えてしまう為、再びset\_move\_collisionに切り替える。これを繰り返す事により、オブジェクトが常に画面内に描画されている状態を保つ事が出来る。 +この\verb+move+では、ボス1が常に画面内に描画されている必要がある。 +これはテストすべき条件の一つとなる。 + +\subsection{collision} - \subsubsection{collision} - オブジェクトの衝突判定を記述する。オブジェクト同士が触れた時に行う動作を決定する。例えばシューティングゲームなら弾丸が敵や自機に当たった時にダメージを受ける、ゲームオーバーになる、などの判定を行う。こちらも条件分岐により、set\_move\_collisionで状態遷移する。 +この変数は、オブジェクトの衝突判定する関数を入れる。 +例えばシューティングゲームなら自機と敵、または、弾 +を引数に持ち、 +当たった時のダメージや、ゲームオーバーの判定を行なう。 +判定にしたがって、 +\verb+set_move_collision+により新しい\verb+move,collsion+ +を設定する。これは、State Pattern と呼ばれるパターンである。 \section{CppUnitを用いたSceneGraphのテスト} - \subsection{CppUnitとは} - CppUnitはxUnitの一つであり、C++の単体テストを自動化するframe workである。 CppUnitの特徴は、テストケースを増やす事が容易であり、1つの事象に対して様々なテストケースを同時にテストする事が出来る。また、羅列したテストケースは一括で実行、結果の表示ができる。(図\ref{fig:cpptest}) + +CppUnitは、C++の単体テストを自動化するframe +workである。 CppUnitの特徴は、テストケースを増やす事が容易 +であり、1つの事象に対して様々なテストケースを同時にテストす +る事が出来る。また、羅列したテストケースは一括で実行、結果 +の表示ができる。(図\ref{fig:cpptest}) \begin{figure}[htbp] \includegraphics[width=8.5cm]{pic/test_state.eps} @@ -85,11 +125,22 @@ \label{fig:cpptest} \end{figure} - \subsection{ゲームプログラムのテスト} - 3つのSceneGraphを持つオブジェクトのテストを行った。このオブジェクトは本体の他に左右にパーツを1つずつ持つ。 - 本体をTreeのrootとして左右のパーツがその子供になっている。\\ - ここで、各オブジェクトのSceneGraphはその親や子、兄弟に対するアドレスを保持している。従って、パーツオブジェクトのテストを行いたい場合は、そのオブジェクトのRootである本体から辿れば、パーツオブジェクトの各パラメータを参照する事が出来る。\\ - そこで、Rootのアドレスを取得するgetSGP()という関数を作成した。getSGP()関数によって取得してきたRootのアドレスを使って、各オブジェクトの座標を取得し、その初期化が正しいか、状態遷移において正しい値を保持いるかテストした。 +\subsection{ゲームプログラムのテスト} + +3つのSceneGraphを持つオブジェクトのテストを行った。このオブ +ジェクトは本体の他に左右にパーツを1つずつ持つ。本体をTreeの +rootとして左右のパーツがその子供になっている。 + +ここで、各オブジェクトのSceneGraphはその親や子、兄弟に対す +るアドレスを保持している。従って、パーツオブジェクトのテス +トを行いたい場合は、そのオブジェクトのRootである本体から辿 +れば、パーツオブジェクトの各パラメータを参照する事が出来る。 + +そこで、Rootのアドレスを取得するgetSGP()という関数を作成し +た。getSGP()関数によって取得してきたRootのアドレスを使って、 +各オブジェクトの座標を取得し、その初期化が正しいか、状態遷 +移において正しい値を保持いるかテストした。 + \newpage {\scriptsize \begin{verbatim} @@ -120,10 +171,17 @@ \end{verbatim} } -テストの結果、全てのオブジェクトが正常に初期化されているのが確認出来た。しかし、move,collision中の各オブジェクトの座標は確認出来なかった。これはテストを走らせた時点で全てのテストケースを同時にテストしている為、全てのテストケースにおいて初期化がなされた時点での座標の情報しか参照できない為である。 +このテストの結果、全てのオブジェクトの位置の初期値が正しいことは +確認できた。 + +Cerium でも.... -\section{評価} -CppUnitによるテストはオブジェクトの座標などの初期値はテスト出来るが、move,collisionによって変化した値をテストするのには不向きである。よってCppUnitはmove,collisionの各関数を抜き出して状態遷移をするかどうかの条件分岐に対して適用するのが適当である。 +\section{今後の課題} + +しかし、\verb+move,collision+中の各オブジェクトの座 +標は確認出来なかった。ので、これをやります.... + + \thispagestyle{fancy} \begin{thebibliography}{9} @@ -135,4 +193,4 @@ \bibitem{3}伊藤 喜一:CppUnit入門, (http://www.ogis-ri.co.jp/otc/hiroba/technical/CppUnit/) \end{thebibliography} -\end{document} \ No newline at end of file +\end{document}