敵の移動を計算する式を考えています
点(0,200) (100,300) (200、50) (400,10)
各点を60フレーム間隔で横切る 速度v の計算式を考えています
今できても直線の移動しかできず、なめらかな曲線で移動させたいです
決められるのは点の座標と、点と点の間のフレーム数、各点の速度だけです
この条件だけで、敵の移動座標を求める方法って何か有名な式があるのでしょうか?
敵の移動計算
Re: 敵の移動計算
http://marupeke296.com/DXG_No34_UnuniformSprine.html
このスプライン曲線というものを利用してみては?
ただ、各点を60フレームで横切るというのは、速度が一定じゃないので奇妙な動きに見えるかもしれませんよ
↓サンプル的なコード
このスプライン曲線というものを利用してみては?
ただ、各点を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); //位置を決める
}
Re: 敵の移動計算
時刻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
となるので、これを使って実装してみる。
うまく動いてそうだけど、滑らかかどうかは微妙かも。
以下、実装コード
時刻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 (4.61 KiB) 閲覧数: 1936 回
最後に編集したユーザー a5ua on 2011年5月10日(火) 18:32 [ 編集 1 回目 ]
Re: 敵の移動計算
>>a5uaさん
解説つきでありがとうございます
しかしながら私のツルツル脳みそでは理解できませんでした orz
>>MNSさん
スプライン曲線ははじめてききました
解説はなんとなくわかるのですが、これも私の脳みそがツルツルなためとりいれれません
効率といえばなかなかかっこよく聞こえますけど
自分のレベルにあった計算式を考えようと思います
私のレベルがそうとう低いということがわかっただけでもいいですので解決としておきます
解説つきでありがとうございます
しかしながら私のツルツル脳みそでは理解できませんでした orz
>>MNSさん
スプライン曲線ははじめてききました
解説はなんとなくわかるのですが、これも私の脳みそがツルツルなためとりいれれません
効率といえばなかなかかっこよく聞こえますけど
自分のレベルにあった計算式を考えようと思います
私のレベルがそうとう低いということがわかっただけでもいいですので解決としておきます