アルゴリズム

ゲーム用のモデリングツールを作る(その3) 角度の制御

ボーンの回転角を制限する機能を持たせたいと思います。

ボーンの回転で思い出すのが、人間の3Dモデルを動かしてあそべるDAZ Studioというソフト。

デッサンの勉強のために欲しかったPoserが高かったので
その替わりにフリーソフトだったDAZ Studioを使ってみたのですが、
モデルのお姉さんの関節がありえない方向に曲がってしまい、
制御しづらいうえになんか怖かったです。

こんなこともあって、モデリングツールにはボーンの角度制限機能が絶対に欲しいと思うのですが、
角度は360度を超えると0に戻ってしまいます。
角度制限といっても単純な大小比較ではすみそうにありません。

とりあえずこんな方法で解決してみました。

#define M_PI       3.14159265358979323846
#define M_2PI      (M_PI*2.0)

 bool ChkInAngle( double radChk, double radMin, double radMax )
 {
    //radChkが範囲内ならtrueを返します。
    //radMin < radMax
    //radMax - radMin < M_2PIが前提です

    //最小値から最大値の相対角度
    double radRelative = radMax - radMin;

    //最小値を0~2πの範囲に収める
    while ( radMin > M_2PI ) {
       radMin -= M_2PI;
    }
    while ( radMin < 0 ) {
       radMin = M_2PI + radMin;
    }
  
    //最大値も修正
    radMax = radMin + radRelative;

    //チェックする角度が最小値を超えるまで2π足し続ける。
    while ( radChk < radMin ) {
       radChk += M_2PI;
    }

    //そのあとで最大値よりも小さければ範囲内であることになる。
    if ( radChk <= radMax ) {
       return true;  
    }
    return false;
 }

ゲームのための弾道計算

ゲームプログラミングで弓とか大砲とかの「まっすぐ飛ばない弾を」表現するのに弾道計算が必要になりました。
弾道計算といってもそんなたいした物でなく重力だけ考慮した単純な放物線軌跡です。

ベクトルを使うと簡単に計算できましたよ。

重力ベクトルを足し続けるだけで軌跡が得られるので、数学的に三角関数で解くよりもずっと軽く、早くできます。
ベクトルは当たり判定にも活用できますね。

米軍がPS3を大量購入したニュースがありましたけど、その理由がベクトル演算が得意だったからと、どこかで読んだ記憶があります。
ベクトルすごい。大活躍。

ところで、弾道計算って軌跡を求めるだけじゃ済まなかったのですよ。

当てないといけないんです。

これが大変でした。
物理の公式思い出しながら脳みふり絞ってプログラミングしてみたらいい感じに動いてます。

よかった。

dandou_app

プログラムはこちらで紹介してます。
http://www.sousakuba.com/Programming/algo_dandoukeisan3.html

発射角の計算には三角関数とかルートとかを使います。
計算効率に疑問が残りますが、もしかして発射角もベクトルで簡単に求まったりするのかな?

敵キャラを誘導したいのだけど

敵キャラを動かしたいのですけど、
わざわざ壁との当たり判定しながら動かすんでしょうか。

合戦を再現したいのでキャラクターは少なくても100人ぐらい欲しいです。
一つずつ当たり判定してたらすごく遅そう。

ゲーム会社で働くプロの手法を知ることは残念ながらできませんけど、
とりあえず壁との当たり判定がいらない移動方法ということでマップに何かレールのような物を敷いてそれに従って動かせばいいのかな?と思ってみたり。

idou
こんなふうに。
でもレールには沢山分岐があります。最短ルートを求めたいです。

こんな場合の計算にはダイクストラ法というアルゴリズムが使えるそうです。
だいくすとらほう、だいくすとらほう・・・。
舌かみそう。
名前なかなか覚えられません。

それはともかく、つくってみた。

algo_dijkstra

・・・おお!!ちゃんと最短ルートがでた。

後で知ったのですが、ダイクストラ法は一回の計算で全ての位置のキャラを目標に向かわせることが可能です。
なんとすごい威力。

ダイクストラ法の解説ページつくってみました

サンプルプログラムもソースもありますよ。

livedoor プロフィール
  • ライブドアブログ