講義でC言語を教えているのですが,最近のリアルなゲームに慣れた学生にはテキストベースのプログラムではあまりモチベーションが上がらないようです.そこで,昨年に引き続き,ODEを使いC言語を初めて学ぶための連載「ODEで学ぶC言語2」を始めます.昨年この方法で学生に教え,反応がまずまずでした.一部分かりづらいところがあったので,今年はさらなるわかりやすさを目指していきたいと思います.
なお,講義では別の教科書で一通りC言語を教えたので,プログラミング能力を高めるための演習ベースになり,C言語に対する細かい説明はあまりしません.プログラミングの楽しい演習だと思ってください.
今回は何もなかった仮想空間に物体を表示させてみましょう.ODEではいろいろな形状がサポートされています.ここではその中でも使い方が最も簡単な球を表示させます.
/* step1 球の表示 */ #include "dm1.h" double R[12]; // 回転行列(姿勢)の値を入れる配列 double p[3] = {0.0, 0.0, 1.0}; // 位置(x,y,z)[m] double r = 0.2; // 半径 [m] void simLoop(int pause) /*** シミュレーションループ ***/ { dsDrawSphere(p,R,r); // 球の描画 } int main() /*** main関数 ***/ { dmLoop(800, 600, simLoop); // シミュレーションループ(ウインドウの横,縦) return 0; }
物体を3次元空間上に表示させるためには,物体の位置と姿勢を決める必要があります.ODEでは姿勢を回転行列とよばれる行列で表しています.その行列の要素を格納するのが配列R[12]です.なお,位置は要素数3個のdouble型の配列p[3]に格納しています.なお,R[12]には謎のヘッダファイルdm1.hの中で単位行列が設定されています.
位置のx座標(手前方向)を表す変数pの1番目の要素p[0]には0.0[m],y座標(右方向), z座標(高さ方向)を表すp[1], p[2]には0.0[m], 1.0[m]が設定されています.座標系は右手系です。ODEでは単位系はSI単位系を考えます.長さはm,質量はkg,力はNとなります.
ソースコードのなかほどにあるsimLoop関数にシミュレーションでやりたいことを書きます.ここでは,球を表示したいのでdsDrawSphere関数を使って,位置p,姿勢R, 半径rの球を描画しています.なお、このソースコードだけではわかりませんが、simLoop関数はdmLoop関数の中で毎回呼び出されています。
今回はこれで終わりです.また,また簡単でしたね.
- ホームワーク1
- step1-100604をダウンロードし,実行してください.
- 手順
- ode-0.11.1がインストールされていなかったらこの説明に従いインストールする.
- ダウンロードしたファイルをc:\ode-0.11.1\myprogの中に保存する.
- そこで解凍する.c:\ode-0.11.1\myprog\step1というフォルダが作られます.
- c:\ode-0.11.1\myprog\step1\step1.cbpをダブルクリックしてcodeblocksを起動しビルド・実行する.ダブルクリックするファイルの拡張子はcbpです.間違ってcppをダブルクリックしないように!
- 球の位置と大きさを変更してみましょう.
- 直方体を表示させてください.次の関数を使います.
- void dsDrawBox(const double p[3], const double R[12], const double sides[3])
- 上は関数のプロトタイプ宣言の形式なので,呼び出すときはconst doubleなどの型名を入れてはいけません.引数が配列の場合は,サンプルプログラムのように配列名だけを入れてください.
- 1, 2番目の引数はdsDrawSphereのときと同じです.3番目の引数は直方体のx,y,z方向のサイズ[m]が入っている要素数3個の配列です.位置を表す配列pと同じように初期化すれば大丈夫です.なお, doubleの前にあるconstは値を変えてはいけないという意味です。円柱を表示させてください
- 円柱を表示させましょう.
- void dsDrawCylinder(const double p[3], const double R[12], float l, float r );
- ここで,lは長さ,rは半径です.
- カプセルを表示させてください.
- void dsDrawCapsule(const double p[3], const double R[12], float l, float r );
コメント