00001 #ifndef Spr_TUTORIALVC_H 00002 #define Spr_TUTORIALVC_H 00003 00004 /** @page TutorialVC チュートリアル(Visual C++) 00005 00006 @section Content 目次 00007 - @ref Execution 00008 - @ref EditDataFile 00009 -# @ref MakeConvex 00010 -# @ref MakeConcave 00011 -# @ref SetTrianglePole 00012 -# @ref TiltFloor 00013 -# @ref SetSphere 00014 -# @ref SetLight 00015 -# @ref SetPhysics 00016 -# @ref SetCamera 00017 -# @ref BroadenFloor 00018 -# @ref SetVessel 00019 -# @ref AccelSphere 00020 -# @ref SetTexture 00021 -# @ref Adjustment 00022 -# @ref SetPointer 00023 - @ref SPIDAR 00024 - @ref NewProject 00025 00026 @section Execution ビルドして実行してみる 00027 まずは,慣れるために既存のプロジェクト(今回は Springhead/src/Samples/DynaHaptic)を実行してみます. 00028 -# ビルドを行う準備として以下のことを行ってください. 00029 - 環境変数 Springhead に Springhead をインストールしたディレクトリを 00030 指定して下さい.<br> 00031 Windows2000ならば[マイコンピュータ]-[プロパティ]-[詳細]-[環境変数]-[新規]のダイアログに 00032 [変数名] Springhead [変数値] インストールしたディレクトリとしてください. 00033 - DirectX8.1か9.0のSDKをインストールしてください. 00034 -# Springhead/src/Samples/DynaHaptic/DynaHaptic.dsw を Visual C++ で開いてビルドしてください.<br> 00035 ビルドが成功しない方は以下のことを確認してください. 00036 - DirectX SDKのインクルードファイルとライブラリファイルのディレクトリの設定<br> 00037 [ツール]-[オプション]-[ディレクトリ]の「表示するディレクトリ(S)」を「インクルードファイル」に変え, 00038 DirectX SDKのインクルードファイルのディレクトリ(例:"C:\DXSDK\INCLUDE")が設定されているか確認してください.<br> 00039 設定されていなければ設定してください.<br> 00040 また,検索の優先順位を上げるために「↑」のボタンを何度かクリックして, 00041 一番上に来るようにしてください.<br> 00042 ライブラリファイルについてもインクルードファイルと同様にパスの設定を行ってください 00043 (「表示するディレクトリ(S)」を「ライブラリファイル」に変更する). 00044 - アクティブプロジェクトの設定 00045 [ビルド]-[アクティブな構成の設定]の 00046 「プロジェクトの構成]を "Dynahaptic - Win32 MFC Debug (or Release)" 00047 にして下さい. 00048 - <A href=http://sklab-www.pi.titech.ac.jp/~hase/springhead/>Springheadのページ</A>の「今朝のビルド」を見てください. 00049 ここにはその日の午前3時の時点でVSSにアップされているプロジェクトのビルド結果が表示されています. 00050 ここに載っていないプロジェクトのビルドは通らないということになりますので,過去のビルドが成功するバージョンのファイルを取得してきてください. 00051 -# 実行します.<br> 00052 実行したら,[ファイル]-[開く]で<A href=../../Samples/data/>Springhead/src/Samples/data/</A>にあるデータファイル(@ref XFile "Direct3D Xファイル")を適当にロードしてみてください. 00053 実行時の主なキー操作は以下のようになっています. 00054 - ↑:前進 00055 - ↓:後退 00056 - ←:左回転 00057 - →:右回転 00058 - S:上回転 00059 - X:下回転 00060 - Q:左平行移動 00061 - W:右平行移動 00062 - A:上平行移動 00063 - Z:下平行移動 00064 - R:視点リセット 00065 - F:フルスクリーン 00066 - G:画面をフルスクリーンから元に戻す 00067 - C:SPIDARのグリップのキャリブレーション 00068 - スペース:SPIDARに力を返すか返さないかのON-OFF 00069 - T:マルチメディアタイマーの起動 00070 (精度の高い力覚を提示するためには必要.Release版のみ) 00071 00072 @section EditDataFile データファイルを編集する 00073 ボールを転がして箱に入れるという仮想世界の作成を通して, 00074 Xファイルの編集の方法を簡単に見ていきます.<br><br> 00075 - @ref XFile とは? 00076 - 完成例 00077 - rollingBall <A href=../../Samples/data/tutorial/rollingBall.x>Springhead/src/Samples/data/tutorial/rollingBall.x</A> 00078 - golf <A href=../../Samples/data/tutorial/golf.x>Springhead/src/Samples/data/turorial/golf.x</A> 00079 00080 まずは,rollingBall から作っていきます. 00081 00082 @subsection MakeConvex 凸物体を作る 00083 まず,仮想世界に必要なオブジェクトとして, 00084 床,ジャンプ台となる三角柱,ボールをモデリングします. 00085 .x形式で保存することのできるモデリングソフトを使用して作ってください.<br><br> 00086 −作成例− 00087 - <A href=../../Samples/data/tutorial/floor.x>floor.x</A> 00088 - <A href=../../Samples/data/tutorial/trianglePole.x>trianglePole.x</A> 00089 - <A href=../../Samples/data/tutorial/sphere.x>sphere.x</A> 00090 00091 @subsection MakeConcave 凹物体を作る 00092 仮想世界に登場する物体にはさきほど作成したような直方体,球のような凸物体と, 00093 箱のような凹物体があります. 00094 Springheadでは衝突判定に用いているアルゴリズムの性質上, 00095 物体はすべて凸物体でなければなりません. 00096 そこで,箱を作るときには,底と四方の壁の5つの直方体を組み合わせて作成します.<br> 00097 作成例では,親フレーム Vessel の下に 00098 子フレームとして VesselFront,Back,Left,Right,Bottom を配置しています. 00099 各フレームにある FrameTransformMatrix は 00100 アフィン行列を転置した形で記述されており, 00101 親フレームからのローカル変換を表しています. 00102 (VesselFront,Back,left,right はこのローカル変換が異なるだけで, 00103 その下に記述されている Mesh の部分は同じものを使用しています)<br><br> 00104 −作成例− 00105 - <A href=../../Samples/data/tutorial/vessel.x>vessel.x</A> 00106 00107 @subsection SetTrianglePole 床に三角柱を配置する 00108 では実際に世界を作っていきます. 00109 まず,世界の一番の親フレームとして frTop を作成し, 00110 その子フレームに床を,そして床の子フレームとして三角柱を配置します.<br><br> 00111 −作成例− 00112 - <A href=../../Samples/data/tutorial/rollingBall1.x>rollingBall1.x</A> 00113 00114 @subsection TiltFloor 床を傾ける 00115 次は,床を傾けます.<br> 00116 さきほど,三角柱を床の子フレームとしているので, 00117 床フレームの FrameTransformMatrix を編集するだけで, 00118 三角柱ごと傾けることができます.<br><br> 00119 −作成例− 00120 - <A href=../../Samples/data/tutorial/rollingBall2.x>rollingBall2.x</A> 00121 00122 @subsection SetSphere ボールを配置する 00123 ボールを frTop の子フレームとして配置します.<br><br> 00124 −作成例− 00125 - <A href=../../Samples/data/tutorial/rollingBall3.x>rollingBall3.x</A> 00126 00127 @subsection SetLight ライトを追加する 00128 ここまでの状態で実行しても, 00129 暗くてあまり見えないのでライトを追加します. 00130 具体的には,ライトの位置・姿勢を決めるためのフレームと 00131 そのライトの性質を示す Light8 を frTop の下に追加します.<br><br> 00132 −作成例− 00133 - <A href=../../Samples/data/tutorial/rollingBall4.x>rollingBall4.x</A> 00134 00135 @subsection SetPhysics 物理法則を追加する 00136 ではいよいよ仮想世界に物理法則を追加します. 00137 具体的には, 00138 - SolidContainer : 仮想物体の物理的性質 00139 - GravityEngine : 重力の制御 00140 - PenaltyEngine : 衝突判定の制御 00141 00142 を追加することになります.<br> 00143 現在作りたい世界の仕様を, 00144 00145 - ボールが動く. 00146 - 重力がボールにはたらく.床にははたらかない. 00147 - ボールと床の間で衝突が起こり,衝突後ボールは跳ね返るが床は固定. 00148 00149 とすると,SolidContainer および GravityEngine にはボールだけを登録し, 00150 PenaltyEngine には,ボールと床の衝突判定を行い衝突後はボールだけに反力を加えるという記述をします.<br> 00151 なお,PenaltyEngine では, 00152 親フレームとの衝突判定を行うように記述すれば, 00153 再帰的に子フレームとの衝突判定も行うので, 00154 ボールと床との衝突判定を記述しておけば, 00155 床の子フレームである三角柱との衝突判定も自動的に行います.<br><br> 00156 −作成例− 00157 - <A href=../../Samples/data/tutorial/rollingBall5.x>rollingBall5.x</A> 00158 00159 @subsection SetCamera カメラを追加 00160 このままでは画面に映る範囲が狭いので, 00161 少しひいた(ズームアウトした)位置に視点を動かします.<br> 00162 視点の位置を設定するためには,frTop の下に Camera を追加します. 00163 Camera がない場合はデフォルトのカメラ位置になります. 00164 (デフォルトのカメラ設定については <A href=../../src/Graphics/GRCamera.cpp>Springhead/src/Graphics/GRCamera.cpp</A> の GRCameraData::InitData() を参照) 00165 これまではカメラの設定をしていなかったので, 00166 デフォルトのカメラ位置になっていたということになります.<br> 00167 カメラの位置の設定には,保存の機能を使うと便利です. 00168 保存を行うと,そのときのカメラの設定をXファイルに書き出してくれます. 00169 よって,<br> 00170 00171 実行 → キー操作により任意の視点位置に移動 → “名前を変えて”保存 00172 → 保存したXファイルのカメラ設定を元のファイルにコピー 00173 00174 という手順で行うと楽です. 00175 保存する際,ボールの位置など仮想世界の状態も一緒に保存してしまうので, 00176 別の名前で保存する必要があります.<br><br> 00177 −作成例− 00178 - <A href=../../Samples/data/tutorial/rollingBall6.x>rollingBall6.x</A> 00179 00180 @subsection BroadenFloor 床を広くしてボールを移動 00181 次は,床を広くして,ボールももっと上から転がるように変更します. 00182 床を広くするためには物体の頂点座標を管理している Mesh を変更します. 00183 ボールの位置の変更は FrameTransformMatrix の平行移動成分を変更して行います.<br><br> 00184 −作成例− 00185 - <A href=../../Samples/data/tutorial/rollingBall7.x>rollingBall7.x</A> 00186 00187 @subsection SetVessel 箱を配置 00188 ボールをキャッチする箱を配置します.<br> 00189 @ref MakeConcave で作成した箱フレームを追加し, 00190 ボールとの衝突判定を行うように Penalty も追加します.<br><br> 00191 −作成例− 00192 - <A href=../../Samples/data/tutorial/rollingBall8.x>rollingBall8.x</A> 00193 00194 @subsection AccelSphere ボールの初期速度を大きくする 00195 箱にボールが入らなかったので,ボールがもっと遠くへ飛んでいくように, 00196 Solid を編集して初期速度を大きくします.<br><br> 00197 −作成例− 00198 - <A href=../../Samples/data/tutorial/rollingBall9.x>rollingBall9.x</A> 00199 00200 @subsection SetTexture 背景をつけ,テクスチャを貼る. 00201 箱にボールが入るところまでできたので,少し見た目を向上させるために, 00202 背景を付け,テクスチャも貼ります.<br> 00203 背景は,世界の後方に大きな平面オブジェクトを置いて作ることにします. 00204 テクスチャは,Material の中の TextureFilename で指定します.<br><br> 00205 −作成例− 00206 - <A href=../../Samples/data/tutorial/rollingBall.x>rollingBall.x</A> 00207 00208 これでひとまず rollingBall は完成です. 00209 00210 @subsection Adjustment 各オブジェクト位置の変更 00211 つづいて rollingBall を改良して golf を作っていきます.<br> 00212 まずは,世界をgolf用に変更します.<br><br> 00213 −作成例− 00214 - <A href=../../Samples/data/tutorial/golf1.x>golf1.x</A> 00215 00216 行った作業は以下の通りです. 00217 - 床の変更 00218 - 傾きを水平にした 00219 - カップを作るために床を4分割した(そのうちの一つには傾斜をつけた) 00220 - ジャンプ台を低くした 00221 - 球の初期位置,初期速度の変更 00222 - 箱の位置の変更 00223 00224 @subsection SetPointer 力覚ポインタを作る 00225 SPIDARのグリップ部分に対応するポインタを作ります. 00226 まずは,ポインタのフレームを作成します. 00227 そして,ポインタの物理(Solid,Penalty)を追加します. 00228 データファイル側の作業は以上で終わりです.<br><br> 00229 −作成例− 00230 - <A href=../../Samples/data/tutorial/golf.x>golf.x</A> 00231 00232 あとはSPIDARの設定等,プログラムを編集する作業になります. 00233 SPIDARの設定については @ref SPIDAR を参照. 00234 00235 @section SPIDAR SPIDAR 00236 もうしばらくおまちください.... 00237 00238 @section NewProject 新しくプロジェクトを作る 00239 自分用に新しくプロジェクトを作ります.<br> 00240 プログラムに変更を加えていく場合は, 00241 新しいプロジェクトを作ることをお勧めします.<br> 00242 今回は,簡単な方法ということで既存のプロジェクト(Springhead/src/Samples/DynaHaptic)を 00243 コピーして名前だけ変更するという方法を取ることにします. 00244 -# VSSから $/Project/Springhead/src/Samples/DynaHaptic 以下を取得する. 00245 -# DynaHapticフォルダをコピーし, 00246 適当なところ(Samplesの下でいいと思います)に貼り付ける. 00247 -# 貼り付けたフォルダ内のすべてのファイルの読み取り専用のチェックをはずし, 00248 ファイル名及び各ファイルの中に登場する "DynaHaptic" を 00249 すべて新しいプロジェクト名に置換する.<br> 00250 .dsp, dsw, rc, sccファイルなんかもテキストエディタで開いて置換してください. -# ビルドして実行する. 00251 ビルドがうまくいかない方は,名前がすべて変更されているか, 00252 または@ref Executionのビルドのところを確認してください. 00253 00254 00255 */ 00256 00257 #endif