矢のような弓なりの計算式について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
レク

矢のような弓なりの計算式について

#1

投稿記事 by レク » 9年前

矢を発射するような処理を書いているのですが、
仕様上、使いやすそうな計算式を作るので迷っております。

通常、弓なりの動きをしたい場合、以下のように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: 矢のような弓なりの計算式について

#2

投稿記事 by softya(ソフト屋) » 9年前

普通に重力加速度で計算すれば良いかと思います。

初期のspeedx,speedy はパワーと角度からベクトル計算します
毎フレームはspeedy = speedy + gravityだけです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 13年前
住所: 北海道札幌市
連絡を取る:

Re: 矢のような弓なりの計算式について

#3

投稿記事 by Dixq (管理人) » 9年前

物理は習っていますか?
習っているなら

斜方投射
http://www2.ipcku.kansai-u.ac.jp/~t0400 ... motion.pdf
http://w3e.kanazawa-it.ac.jp/e-scimath/ ... 19_c11.pdf

で方程式を解けば良いかと思います。

レク

Re: 矢のような弓なりの計算式について

#4

投稿記事 by レク » 9年前

お礼が遅くなってしまいすみません!
回答ありがとうございます。

物理なのですが、高校の時習ったはずなのですが、式とか全く覚えてなくて(汗)
お陰様でそれっぽい処理を書くことができました!

しかし、新しい問題が出てきてしまいまして・・・。

着地した時に開始地点からの距離を求めることができたのですが、
この距離から発射に必要な角度を求めることはできないのでしょうか。
(パワーは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;
        
    }

アバター
usao
記事: 1889
登録日時: 11年前

Re: 矢のような弓なりの計算式について

#5

投稿記事 by usao » 9年前

>この距離から発射に必要な角度を求めることはできないのでしょうか

No.3で示された先に 到達距離と投射角度(と初速)の関係式 があるのに
それを訊く理由は何なのでしょう?

解析解ではなく,
差分近似による処理結果としての到達距離 を相手にしたいとかいう話なのでしょうか?
(両者にどれほどの差が出るのかわかりませんが)

Aozora0630
記事: 85
登録日時: 9年前
住所: 日本
連絡を取る:

Re: 矢のような弓なりの計算式について

#6

投稿記事 by Aozora0630 » 9年前

前のスレを無視るけど、実際に試してないけど私の考えだけは投稿する。
(あ、投稿してから問題変わってるのに気がついた。参考になれば・・・)

水平からの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);
あとは三角関数をググっておしまい。

閉鎖

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