敵の移動計算

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
dic
記事: 657
登録日時: 13年前
住所: 宮崎県
連絡を取る:

敵の移動計算

#1

投稿記事 by dic » 13年前

敵の移動を計算する式を考えています

点(0,200) (100,300) (200、50) (400,10)
各点を60フレーム間隔で横切る 速度v の計算式を考えています

今できても直線の移動しかできず、なめらかな曲線で移動させたいです
決められるのは点の座標と、点と点の間のフレーム数、各点の速度だけです
この条件だけで、敵の移動座標を求める方法って何か有名な式があるのでしょうか?

アバター
MNS
記事: 35
登録日時: 13年前

Re: 敵の移動計算

#2

投稿記事 by MNS » 13年前

http://marupeke296.com/DXG_No34_UnuniformSprine.html
このスプライン曲線というものを利用してみては?

ただ、各点を60フレームで横切るというのは、速度が一定じゃないので奇妙な動きに見えるかもしれませんよ
↓サンプル的なコード

コード:

class Ball
{
	vec m_pos;
	double t;
public:
	Ball():t(0.0),m_pos(100,100){}
	void update();
	void render();
};

vec spline(vec p1, vec p2, vec v1, vec v2, double t)
{
	vec pos;
	double d1 = 2*t*t*t - 3*t*t + 1;
	double d2 = -2*t*t*t + 3*t*t;
	double d3 = t*t*t - 2*t*t + t;
	double d4 = t*t*t - t*t;
	pos = p1*d1+p2*d2+v1*d3+v2*d4;
	return pos;
}

const int max = 4;
static vec targets[max] = {vec(0,299),vec(100,300),vec(200,50),vec(400,10)};
void Ball::update()
{
	const double K = 100.0;//曲線具合
	static vec p_v = getNormal(targets[1]-targets[0])*K; //以前の速度を記録
	static int count = 0; //現在参照しているターゲット
	t+=1.0/60.0; //60フレームで動く
	int next = (count+1)%max; //次のターゲット
	int nextnext = (count+2)%max; //次の次
	vec v = getNormal(targets[nextnext]-targets[count])*K; //速度を決める
	m_pos = spline(targets[count], targets[next], p_v, v, t); //位置を決める
}

アバター
a5ua
記事: 199
登録日時: 13年前

Re: 敵の移動計算

#3

投稿記事 by a5ua » 13年前

時刻t = 0において、位置x = x0かつ速度v0、
時刻t = Tにおいて、位置x = x1かつ速度v1とし、
加速度を、A * t + Bと仮定して方程式を立ててみる。

d2x/dt2 = A * t + B
x'(0) = v0
x'(T) = v1
x(0) = x0
x(T) = x1

これより、A、Bを定めると、

A = (6 * (v1 + v0) * T - 12 * (x1 - x0)) / T3
B = (6 * (x1 - x0) - 2 * (v1 + 2 * v0) * T) / T2

時刻tにおける位置xはA、Bを使って、
x = (1/6) * A * t3 + (1/2) * B * t2 + v0 * t + x0
となるので、これを使って実装してみる。

うまく動いてそうだけど、滑らかかどうかは微妙かも。

以下、実装コード
► スポイラーを表示
添付ファイル
ss.png
ss.png (4.61 KiB) 閲覧数: 1936 回
最後に編集したユーザー a5ua on 2011年5月10日(火) 18:32 [ 編集 1 回目 ]

dic
記事: 657
登録日時: 13年前
住所: 宮崎県
連絡を取る:

Re: 敵の移動計算

#4

投稿記事 by dic » 13年前

>>a5uaさん
解説つきでありがとうございます
しかしながら私のツルツル脳みそでは理解できませんでした orz

>>MNSさん
スプライン曲線ははじめてききました
解説はなんとなくわかるのですが、これも私の脳みそがツルツルなためとりいれれません


効率といえばなかなかかっこよく聞こえますけど
自分のレベルにあった計算式を考えようと思います
私のレベルがそうとう低いということがわかっただけでもいいですので解決としておきます

閉鎖

“C言語何でも質問掲示板” へ戻る