11
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
20
21
22
23
24
25
26
27
28
29
30
   

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ホーミングつくってみる

久々にゲームっぽい話題!!

東方霊夢のホーミングアミュレットみたいなあれ

ただの敵機狙いでなく徐々に曲がっていく感じ

ホーミング


こんな感じに敵がいて行きたい角度があって進路方向があって
更に1fで曲がれる最大値が決まっていたとします。

勿論1fの最大値まで行っていれば進行方向を行きたい方向に向ければいいわけです。

ではそうでなくてある程度曲げて次のフレームに狙いを定めるのは持ち越しの場合は?というお話。

まず、行きたい方向のベクトルをe↑=(dx,dy)とおきます。(図では黒)
これの角度をθeとおきます。

進行方向の角度をθvとすると、(図では赤)

更に最大で曲げられる角度をθmax(>0)とおくと
|θe-θv|<θmaxなら進行速度の方向をθeにすればいいわけ。

ここからが問題、



これに対して
右へ曲がったときの角度はθr=θv-θmax
同様に左はθl=θv+θmax

この二つの角度のうちよりθeに近い方に曲がればいいわけです。

その方法は、それぞれの方向ベクトルとe↑の内積とれば一発!!

a↑・b↑=|a||b|cosθ

で、a↑にe↑を代入して|b|が不変であれば
|a|も固定されているので

a↑・b↑∝cosθ

です。

またcosθは[0,2π]まで単調減少ですから

θが小さい方がa↑・b↑の値は大きくなります。

なので、

r↑=(cos(θr),sin(θr))
l↑=(cos(θl),sin(θl))

をそれぞれb↑に代入して大きくなった方が行きたい方向に近い=向けるべき向き
に成ります。

当たり前ですが|r↑|=|l↑|=1ですよ。

ちなみにこれは対象なので変数ひっくり返してもOK
なんでyが下向きの関係で下記コードは確か実際逆向きに行ったと思う
勿論実害無し

以下
作ってるSTGのコード改変適当擬似コード

//現在の角度算出 は狙う場所,X,Yは現在位置
//SpeedX,SpeedYに代入すればOKなように作ってあるので代入
//HomingSpeedは移動速度(double const 宣言)
//MaxHomingAngleはθmax
double dx=Enemy.X - X,dy=Enemy.Y-Y;
double tangle = Math.Atan2(dy,dx);//θe

double dangle = tangle - Angle;//Angleは進行方向の角度θv
//完全に相手に向けることが可能
if (Math.Abs(dangle) < MaxHomingAngle) {
SpeedX = HomingSpeed * Math.Cos(tangle);
SpeedY = HomingSpeed * Math.Sin(tangle);

}
else
{

//右に傾けるときの進行方向ベクトル
double rx = Math.Cos(Angle - MaxHomingAngle), ry = Math.Sin(Angle - MaxHomingAngle);
//左に傾けるときの進行方向ベクトル
double lx = Math.Cos(Angle + MaxHomingAngle), ly = Math.Sin(Angle + MaxHomingAngle);

//右へ傾けたときの内積
double rc = rx * dx + ry * dy;
double lc = lx * dx + ly * dy;



//内積が大きい⇔角度が0に近い
if (rc > lc)
{
SpeedX = rx * HomingSpeed;
SpeedY = ry * HomingSpeed;
}
else
{
SpeedX = lx * HomingSpeed;
SpeedY = ly * HomingSpeed;
}
スポンサーサイト

検索フォーム

RSSリンクの表示

リンク

リンクというか個人的によく使うアルゴリズムの解説サイト… C#でなかったりする

ブロとも申請フォーム

この人とブロともになる

QRコード

QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。