ゲーム物理学でピタゴラスの定理を使用するのはなぜですか?


38

私は最近、ピタゴラスの定理を物理計算で多く使用していることを学びましたが、私は本当に意味が分からないのではないかと心配しています。

これは、オブジェクトが水平面内の定数よりも速く移動しないようにするための本のMAXIMUM_VELOCITYです。

MAXIMUM_VELOCITY = <any number>;
SQUARED_MAXIMUM_VELOCITY = MAXIMUM_VELOCITY * MAXIMUM_VELOCITY; 

function animate(){
    var squared_horizontal_velocity = (x_velocity * x_velocity) + (z_velocity * z_velocity);

    if( squared_horizontal_velocity <= SQUARED_MAXIMUM_VELOCITY ){

        scalar = squared_horizontal_velocity / SQUARED_MAXIMUM_VELOCITY;

        x_velocity = x_velocity / scalar;
        z_velocity = x_velocity / scalar;
    }
}

これをいくつかの数字で試してみましょう。

オブジェクトがxで5ユニット、zで5ユニットを移動しようとしています。合計で5ユニットしか移動できないはずです!

MAXIMUM_VELOCITY = 5;
SQUARED_MAXIMUM_VELOCITY = 5 * 5;
SQUARED_MAXIMUM_VELOCITY = 25;

function animate(){
    var x_velocity = 5;
    var z_velocity = 5;

    var squared_horizontal_velocity = (x_velocity * x_velocity) + (z_velocity * z_velocity);
    var squared_horizontal_velocity = 5 * 5 + 5 * 5;
    var squared_horizontal_velocity = 25 + 25;
    var squared_horizontal_velocity = 50;

//  if( squared_horizontal_velocity <= SQUARED_MAXIMUM_VELOCITY ){
    if( 50 <= 25 ){
        scalar = squared_horizontal_velocity / SQUARED_MAXIMUM_VELOCITY;
        scalar = 50 / 25;
        scalar = 2.0;

        x_velocity = x_velocity / scalar;
        x_velocity = 5 / 2.0;
        x_velocity = 2.5;

        z_velocity = z_velocity / scalar;
        z_velocity = 5 / 2.0;
        z_velocity = 2.5;

        // new_horizontal_velocity = x_velocity + z_velocity
        // new_horizontal_velocity = 2.5 + 2.5
        // new_horizontal_velocity = 5
    }
}

これでうまくいきましたが、ピタゴラスなしでも同じことができます。

MAXIMUM_VELOCITY = 5;

function animate(){
    var x_velocity = 5;
    var z_velocity = 5;

    var horizontal_velocity = x_velocity + z_velocity;
    var horizontal_velocity = 5 + 5;
    var horizontal_velocity = 10;

//  if( horizontal_velocity >= MAXIMUM_VELOCITY ){
    if( 10 >= 5 ){
        scalar = horizontal_velocity / MAXIMUM_VELOCITY;
        scalar = 10 / 5;
        scalar = 2.0;

        x_velocity = x_velocity / scalar;
        x_velocity = 5 / 2.0;
        x_velocity = 2.5;

        z_velocity = z_velocity / scalar;
        z_velocity = 5 / 2.0;
        z_velocity = 2.5;

        // new_horizontal_velocity = x_velocity + z_velocity
        // new_horizontal_velocity = 2.5 + 2.5
        // new_horizontal_velocity = 5
    }
}

ピタゴラスなしでそれを行う利点:

  1. 少ない線
  2. これらの行内で、何が起こっているかを読みやすくします
  3. ...また、乗算が少ないため、計算にかかる時間が短くなります

コンピューターと人間はピタゴラスの定理なしでより良い取引を得るように思えます!しかし、ピタゴラスの定理を多くの評判の良い場所で見たので間違いだと思うので、数学の初心者にピタゴラスの定理を使用することの利点を誰かに説明してほしい。

これは単位ベクトルと関係がありますか?私にとって単位ベクトルとは、ベクトルを正規化し、分数に変換することです。これを行うには、ベクトルをより大きな定数で除算します。何が定数なのかわかりません。グラフの合計サイズは?とにかく、それは分数なので、単位ベクトルは基本的に、-1から1までのx軸、-1から1までのz軸、およびyの3Dグリッド内に収まるグラフです-axisは-1から1まで実行されます。それは文字通り、単位ベクトルについて知っているすべてです...あまりありません:Pそして、それらの有用性がわかりません。

また、上記の例では単位ベクトルを実際に作成していません。このようなスカラーを決定する必要があります:

// a mathematical work-around of my own invention. There may be a cleverer way to do this! I've also made up my own terms such as 'divisive_scalar' so don't bother googling
var divisive_scalar = (squared_horizontal_velocity / SQUARED_MAXIMUM_VELOCITY);
var divisive_scalar = ( 50 / 25 );
var divisive_scalar = 2;

var multiplicative_scalar = (divisive_scalar / (2*divisive_scalar));
var multiplicative_scalar = (2 / (2*2));
var multiplicative_scalar = (2 / 4);
var multiplicative_scalar = 0.5;

x_velocity = x_velocity * multiplicative_scalar
x_velocity = 5 * 0.5
x_velocity = 2.5

繰り返しますが、なぜこれが優れているのかわかりませんが、multiplicative_scalarはunit_vectorであるため、より多くの「unit-vector-y」ですか?ご覧のとおり、「unit-vector-y」などの単語を使用しているので、数学の達人ではありません。また、単位ベクトルはピタゴラスの定理とは何の関係もないかもしれないので、間違ったツリーをbarえている場合はこのすべてを無視してください。

私は非常に視覚的な人物です(3Dモデラーであり、業界のコンセプトアーティストです!)。私は図とグラフが本当に役立つと思います。


2
実際、書かれているアルゴリズムはどちらも速度を正しく制限していません。ベクトルは、(2.5, 2.5)約3.54の大きさは、ありません。5.持つ
bcrist

1
sqrt(2.5*2.5 + 2.5*2.5)
bcrist

1
哲学者は2500年前に亡くなり、彼の名前を冠した定理は、彼が生まれる前に他の文明の千年紀に理解されていました。それは、ニュークリア潜水艦でアインシュタインを使用していると言うのに少し似ていますが、確かに面白い考えです(すべての潜水艦には乗組員にアインシュタインがいます)。アインシュタインの場合、彼は物理学の多くの理論で有名であるため、質量エネルギーの等価性は、その名前の一部のみを使用して導出される理論に名前を付けることができます。人。
アンドンM.コールマン

3
あなたの立場の問題は、「ピタゴラスがなくても同じことができる」という主張です。しかし、マンハッタンの距離はユークリッド距離と同じではないため、リンゴとオレンジを比較しています。あなたはX / Y対からのユークリッド距離が必要な場合は、持っている数学を行うこと。
ジェリーB

3
関連:「物理学で数学を使用する理由」と「ゲームで数学を使用する理由」
vaxquis

回答:


104

あなたのピタゴラスのないコードは、私たちが通常考えるように長さを計算しません。

通常、3Dゲームでは、世界をユークリッド空間としてモデル化し、ユークリッド距離メトリックピタゴラスの定理とも呼ばれます)を使用して、コンポーネントvxおよびvyを持つベクトルvの全長を計算します。

EuclideanLength(v) = sqrt(v.x * v.x + v.y * v.y)

(上記のサンプルコードでは、この平方根が欠落していることに注意してください。これが、2つのアプローチが同じ答えを与えるように見える理由です。それについては後ほど...)

説明したコードでは、マンハッタン距離メトリックを使用しています

ManhattanLength(v) = abs(v.x) + abs(v.y)

(絶対値を含めなかったので、負の数値に対して予期しない動作をする可能性があります)

これらの2つの距離関数は、vxまたはvyがゼロのときに一致し、1つの軸に沿ってのみ移動していることがわかります。斜めに移動するとき、彼らはどのように比較しますか?

vx = vy = 1としましょう。このベクトルはどれくらいの長さです(同様に、それが記述する速度はどれくらい速いのでしょうか)。

Euclidean                              Manhattan

sqrt(v.x*v.x + v.y * v.y)              abs(v.x) + abs(v.y)
sqrt(1 * 1 + 1 * 1)                    abs(1) + abs(1)
sqrt(2)                                1 + 1
1.414...                               2

これらのメトリックは、実際には対角線で一致しないことがわかります。

各メトリックが原点から1の距離にあることを示す点のセットをグラフにプロットしましょう。

距離メトリック

よく知られているユークリッドメトリックは赤丸です。これは、x ^ 2 + y ^ 2 = 1であるようなすべての点x、yのセットです。回転対称であることがわかり、それが私たちがそれを好む理由です。それは、距離が変化しないという考えをきちんと表しています。方向。

マンハッタンメトリックはブルーダイヤモンドです。直観的な距離の考え方にはあまり合いませんが、それで悪くなるわけではありません。4つの基本的な方向に個別のステップで移動する多くのタイルベースのゲームでは、マンハッタンメトリックはポイント間の正しい距離を示します(「そこに着くまでにどれだけの移動が必要ですか?」)

最後に、私は楽しみのためにチェビシェフのメトリックを投げました-それは緑の正方形です:

ChebyshevLength(v) = max(abs(v.x), abs(v.y))

また、対角線上を移動できるタイルベースのゲームにも適しています。チェスの王はチェビシェフの指標に従って動きます。

典型的なピタゴラススタイルのコードと上記で提供した例の違いが明らかになることを願っています。


11

ピタゴラスがなければ、各軸の速度は固定されます。x速度、y速度、および(3Dの世界では)z速度があり、これらはすべて互いに独立しています。動きはこれらの垂直軸に合わせられます。

ただし、ピタゴラスでは、どの角度でも一定の速度が得られます。これにより、グリッドを非表示にし、オブジェクトを一定の速度であらゆる方向に移動させることができます。

オブジェクトが1秒で移動する領域は、ピタゴラスなしでこれに見えます(fe Chebyshevメトリック)。

ここに画像の説明を入力してください

そしてこれはピタゴラスと:

ここに画像の説明を入力してください

後者は通常、多くの場合、はるかに自然に見えます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.