ページ 1 / 1
矢のような弓なりの計算式について
Posted: 2015年4月28日(火) 16:11
by レク
矢を発射するような処理を書いているのですが、
仕様上、使いやすそうな計算式を作るので迷っております。
通常、弓なりの動きをしたい場合、以下のようにdxは一定でdyが加減速すればよいかと思います。
dx = 5;
dy -= 3;
if( dy<-5 ) dy = -1;
px += dx;
py += dy;
今回、角度(ディグリー角)とパワーがあるのですが、
それを上手く組み合わせて加減速させることが出来ません。
角度 -180.0f〜180.0f
パワー 0~100
角度は発射方向のパラメータとなります。
このパラメータを使ってpx,pyを変動させるような方法ってないでしょうか。
Re: 矢のような弓なりの計算式について
Posted: 2015年4月28日(火) 21:03
by softya(ソフト屋)
普通に重力加速度で計算すれば良いかと思います。
初期のspeedx,speedy はパワーと角度からベクトル計算します
毎フレームはspeedy = speedy + gravityだけです。
Re: 矢のような弓なりの計算式について
Posted: 2015年4月28日(火) 22:26
by Dixq (管理人)
Re: 矢のような弓なりの計算式について
Posted: 2015年4月30日(木) 02:18
by レク
お礼が遅くなってしまいすみません!
回答ありがとうございます。
物理なのですが、高校の時習ったはずなのですが、式とか全く覚えてなくて(汗)
お陰様でそれっぽい処理を書くことができました!
しかし、新しい問題が出てきてしまいまして・・・。
着地した時に開始地点からの距離を求めることができたのですが、
この距離から発射に必要な角度を求めることはできないのでしょうか。
(パワーは100固定と仮定)
// スタートからの距離
printf( "length => %f", this->Player.Px-20 );
質問ばかりですみません・・・。
こういった式の組み立て方がイマイチまだ理解できてなくて。
コード:
#define LENGTH_MAX 360 // パワー調整用
#define PRAM_POWER 0.15f
#define PRAM_GRAVITY 0.15f
#define PRAM_DY_MAX 9.8f
// trg
if( Mouse.trgFlag ){
this->PosStart.x = Mouse.Pos.x;
this->PosStart.y = Mouse.Pos.y;
}
// flag, pul
if( Mouse.Flag || Mouse.pulFlag ){
this->PosEnd.x = Mouse.Pos.x;
this->PosEnd.y = Mouse.Pos.y;
}
// 何かしらに触っていれば
if( Mouse.trgFlag || Mouse.Flag || Mouse.pulFlag ){
// 2点間の距離
this->Diff = pow( (this->PosEnd.x-this->PosStart.x)*(this->PosEnd.x-this->PosStart.x) +
(this->PosEnd.y-this->PosStart.y)*(this->PosEnd.y-this->PosStart.y), 0.5 );
// 力
this->Power = this->Diff / LENGTH_MAX * 100;
if( this->Power <= 0 ) this->Power = 0;
if( this->Power >= 100.0f ) this->Power = 100.0f;
//this->Angle = atan2( this->PosStart.y-this->PosEnd.y, this->PosStart.x-this->PosEnd.x );
//this->Angle = atan2( this->PosEnd.y-this->PosStart.y, this->PosEnd.x-this->PosStart.x);
this->Angle = atan2( this->PosStart.y-this->PosEnd.y, this->PosStart.x-this->PosEnd.x);
//this->Angle = this->Angle * 180.0f / M_PI;
}
// 離した時に座標計算
if( Mouse.trgFlag ){
this->Player.Px = 20;
this->Player.Py = 320;
this->Player.Dx = 0;
this->Player.Dy = 0;
}
if( Mouse.pulFlag ){
if( this->Player.Dx == 0 && this->Player.Dy == 0 ){
float pow = this->Power * PRAM_POWER;
this->Player.Dx = cos( this->Angle ) * pow;
this->Player.Dy = sin( this->Angle ) * pow;
}
printf( "%f %f", this->Player.Dx, this->Player.Dy );
}
// プレイヤーの移動
this->Player.Px += this->Player.Dx;
this->Player.Py += this->Player.Dy;
if( this->Player.Dx != 0 || this->Player.Dy != 0 ){
this->Player.Dy += PRAM_GRAVITY;
if( this->Player.Dy >= PRAM_DY_MAX ) this->Player.Dy = PRAM_DY_MAX;
}
if( this->Player.Py >= 320 ){
// 着地したとき
if( this->Player.Dx != 0 || this->Player.Dy != 0 ){
printf( "length => %f", this->Player.Px-20 );
}
this->Player.Py = 320;
this->Player.Dx = 0;
this->Player.Dy = 0;
}
Re: 矢のような弓なりの計算式について
Posted: 2015年4月30日(木) 09:55
by usao
>この距離から発射に必要な角度を求めることはできないのでしょうか
No.3で示された先に 到達距離と投射角度(と初速)の関係式 があるのに
それを訊く理由は何なのでしょう?
解析解ではなく,
差分近似による処理結果としての到達距離 を相手にしたいとかいう話なのでしょうか?
(両者にどれほどの差が出るのかわかりませんが)
Re: 矢のような弓なりの計算式について
Posted: 2015年5月06日(水) 17:10
by Aozora0630
前のスレを無視るけど、実際に試してないけど私の考えだけは投稿する。
(あ、投稿してから問題変わってるのに気がついた。参考になれば・・・)
水平からのy座標の補正の変数に(仮にvy)最初の下向きの補正値を入れる。
例えば、上にいかせたいなら-10を入れる。
y座標にvyをプラスする。
x座標を進める。
vyに少しずつ数値を足していく。(つまり徐々にy座標が下に行くって事)
とても分かりにくい説明だね。
サンプル
コード:
int x = 0,y = 0,vy = -10;
for(int i=0;i<20;i++){
y += vy;
x += 1;
vy += 1;
printf("弓の座標はx : %i,y : %i"x,y);
}
何でテキストボックスでタブ押したらフォーカス移動するんだよ
追加
角度の求め方だけど、上のコードを反対に実行してシミュレートすればいいと思うよ。
コード:
int x = 20,y = 0,vy = 10;
for(int i=0;i<20;i++){
y -= vy;
x -= 1;
vy -= 1;
}
printf("vy = %i",vy);
あとは三角関数をググっておしまい。