2016-08-10 4 views
0

私は現在、ゲームで2Dベクトルベースの動きを作成しようとしています。私は数学を理解する助けが必要です。各ティックでは、ジョイスティック上のx軸とy軸に基づいて基本方向ベクトルを作成しています。軸の値は-1から1までのかなり正常です。しかし、問題は大きさを計算することです。方向の私の通常の動きが1の大きさで帽子をかぶっている場合、この新しいベクトルを作成すると、大きさは通常1より大きくなります。ゲームの場合、これはすべての方向に同じように歩きたいから問題になります速度。2Dベクトルの動きと大きさの不一致

私の解決策の1つは、大きさを1にクリップすることです。これは簡単ですが、実際にこの問題を正しい方法で解決するためのショートカットをとっているような気がします。私はこの間違いに近づき、斜めに沿ってより速い動きを可能にしていますか?あなたが一定の速度をしたい場合は、可変速度をしたいしかし、問題は、ジョイスティックが対角線でよりスピードを可能にすることを確かにある場合のおかげ

+0

なぜショートカットですか?ベクトルを正規化するだけです。 – Vallentin

答えて

1

は、あなただけのベクトル

double dx = read_x(); 
double dy = read_y(); 
double L = sqrt(dx*dx + dy*dy); 
dx /= L; dy =/ L; 

を正規化する必要があります。

長さを1にクランプする(すなわち、if (L > 1)の後ろの正規化区分を保護する)ことはおそらく問題ありませんが、実験的なことだけはわかります。

もう1つの選択肢は、延長された長さで長さをスケーリングすることによって方向の長さを正規化することであり、その結果、制限位置のジョイスティックが単位長さであり、だけではなく、クランプの方向:コードで

enter image description here

double dx = read_x(); 
double dy = read_y(); 
double L = sqrt(dx*dx + dy*dy); 

if (L > 0) { 
    double angle = atan2(dy, dx); 
    double kx = fabs(cos(angle)); 
    double ky = fabs(sin(angle)); 
    double k = std::max(kx, ky); 
    kx /= k; ky /= k; 
    double ext = sqrt(kx*kx + ky*ky); 
    dx /= ext; dy /= ext; 
} 

あなたはアクションhereでこれらの式を見ることができます。

実際にゲームでテストするだけで答えが得られますが、邪魔な気持ちからはクランプだけがうまくいくと言えます。

+0

ベクトルを正規化しても1の内側の範囲は考慮されません。私が1より大きい大きさで正規化すると、その問題は修正されますが、1未満の値はどうなりますか?私はどんなチルト値でも一定の移動速度にしたくありません。 – Alexandertyler

+0

実際には、大きさ> 1を超える正規化はそれを修正する必要があります。問題は、「円」内の範囲が間違っているということではなく、2つのベクトルの対角範囲が必要以上に長くなる可能性があるということではありません – Alexandertyler

関連する問題