矢を発射するような処理を書いているのですが、
仕様上、使いやすそうな計算式を作るので迷っております。
通常、弓なりの動きをしたい場合、以下のようにdxは一定でdyが加減速すればよいかと思います。
dx = 5;
dy -= 3;
if( dy<-5 ) dy = -1;
px += dx;
py += dy;
今回、角度(ディグリー角)とパワーがあるのですが、
それを上手く組み合わせて加減速させることが出来ません。
角度 -180.0f〜180.0f
パワー 0~100
角度は発射方向のパラメータとなります。
このパラメータを使ってpx,pyを変動させるような方法ってないでしょうか。
矢のような弓なりの計算式について
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: 矢のような弓なりの計算式について
普通に重力加速度で計算すれば良いかと思います。
初期のspeedx,speedy はパワーと角度からベクトル計算します
毎フレームはspeedy = speedy + gravityだけです。
初期のspeedx,speedy はパワーと角度からベクトル計算します
毎フレームはspeedy = speedy + gravityだけです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- Dixq (管理人)
- 管理人
- 記事: 1661
- 登録日時: 13年前
- 住所: 北海道札幌市
- 連絡を取る:
Re: 矢のような弓なりの計算式について
物理は習っていますか?
習っているなら
斜方投射
http://www2.ipcku.kansai-u.ac.jp/~t0400 ... motion.pdf
http://w3e.kanazawa-it.ac.jp/e-scimath/ ... 19_c11.pdf
で方程式を解けば良いかと思います。
習っているなら
斜方投射
http://www2.ipcku.kansai-u.ac.jp/~t0400 ... motion.pdf
http://w3e.kanazawa-it.ac.jp/e-scimath/ ... 19_c11.pdf
で方程式を解けば良いかと思います。
Re: 矢のような弓なりの計算式について
お礼が遅くなってしまいすみません!
回答ありがとうございます。
物理なのですが、高校の時習ったはずなのですが、式とか全く覚えてなくて(汗)
お陰様でそれっぽい処理を書くことができました!
しかし、新しい問題が出てきてしまいまして・・・。
着地した時に開始地点からの距離を求めることができたのですが、
この距離から発射に必要な角度を求めることはできないのでしょうか。
(パワーは100固定と仮定)
// スタートからの距離
printf( "length => %f", this->Player.Px-20 );
質問ばかりですみません・・・。
こういった式の組み立て方がイマイチまだ理解できてなくて。
回答ありがとうございます。
物理なのですが、高校の時習ったはずなのですが、式とか全く覚えてなくて(汗)
お陰様でそれっぽい処理を書くことができました!
しかし、新しい問題が出てきてしまいまして・・・。
着地した時に開始地点からの距離を求めることができたのですが、
この距離から発射に必要な角度を求めることはできないのでしょうか。
(パワーは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: 矢のような弓なりの計算式について
>この距離から発射に必要な角度を求めることはできないのでしょうか
No.3で示された先に 到達距離と投射角度(と初速)の関係式 があるのに
それを訊く理由は何なのでしょう?
解析解ではなく,
差分近似による処理結果としての到達距離 を相手にしたいとかいう話なのでしょうか?
(両者にどれほどの差が出るのかわかりませんが)
No.3で示された先に 到達距離と投射角度(と初速)の関係式 があるのに
それを訊く理由は何なのでしょう?
解析解ではなく,
差分近似による処理結果としての到達距離 を相手にしたいとかいう話なのでしょうか?
(両者にどれほどの差が出るのかわかりませんが)
-
- 記事: 85
- 登録日時: 9年前
- 住所: 日本
- 連絡を取る:
Re: 矢のような弓なりの計算式について
前のスレを無視るけど、実際に試してないけど私の考えだけは投稿する。
(あ、投稿してから問題変わってるのに気がついた。参考になれば・・・)
水平からのy座標の補正の変数に(仮にvy)最初の下向きの補正値を入れる。
例えば、上にいかせたいなら-10を入れる。
y座標にvyをプラスする。
x座標を進める。
vyに少しずつ数値を足していく。(つまり徐々にy座標が下に行くって事)
とても分かりにくい説明だね。
サンプル
何でテキストボックスでタブ押したらフォーカス移動するんだよ
追加
角度の求め方だけど、上のコードを反対に実行してシミュレートすればいいと思うよ。 あとは三角関数をググっておしまい。
(あ、投稿してから問題変わってるのに気がついた。参考になれば・・・)
水平からの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);
}
追加
角度の求め方だけど、上のコードを反対に実行してシミュレートすればいいと思うよ。 あとは三角関数をググっておしまい。