ゲームAIの本を読んでいます。
使用されている用語の1つは、ベクトルを単位に正規化することです。そのためには、各次元x
、y
およびz
をその大きさで除算する必要があります。
ベクトルで何かを行う前に、ベクトルをユニットに変換する必要があります。どうして?
そして、誰かが私たちが単位ベクトルを使用しなければならないいくつかのシナリオを与えることができますか?
ありがとう!
ベクトルを正規化する必要はありませんが、そうすると、多くの方程式が少し単純になります。また、APIを小さくすることもできます。どのような形式の標準化でも、必要な関数の数を減らす可能性があります。
簡単な例を示します。 2つのベクトルuとvの間の角度を求めたいとします。それらが単位ベクトルの場合、角度は単なるarccos(u v)です。それらが単位ベクトルでない場合、角度はarccos(です。 = v /(| u | | v |))。その場合、とにかくuとvのノルムを計算することになります。
ジョン・D・クックが言うように、主にベクトルそのものではなく方向を気にするので、主にこれを行っています。コンテキストによっては、マグニチュード情報を必要としない/必要としない可能性が高いです-方向自体だけです。マグニチュードを取り除くために正規化して、他の計算を歪めないようにします。これにより、他の多くのことが簡単になります。
AIに関して-P1(AIの悪者)とP2(あなたのヒーロー)の間のベクトルVを悪者の移動方向として取ると想像してください。悪者に1ビートあたりの速度Nで移動してもらいたいのですが、これをどのように計算しますか?さて、私たちは各ビートでベクトルを正規化するか、Nを掛けて移動距離を計算するか、最初に方向を事前正規化し、そのたびに単位ベクトルにNを掛けます-そうでなければ悪者は移動しますヒーローから離れていればさらに!ヒーローが位置を変更しない場合、それは心配する計算が1つ少なくなります。
そのコンテキストでは、それは大したことではありません-しかし、100人の悪者がいる場合はどうでしょうか。または千? AIが悪者の組み合わせに対処する必要がある場合はどうなりますか?突然、1ビートあたり100または1000の正規化が保存されます。これはいくつかの乗算とそれぞれの平方根であるため、最終的には、データを事前に正規化しないと、AI処理率が低下することになります。
より広く-これの数学は非常に一般的です-人々はここで3Dレンダリングのようなことのために彼らがしていることをやっています-たとえば、表面の法線をユニット化しなかった場合、レンダリングごとに何千もの正規化がある可能性があります。完全に不要です。 2つのオプションがあります。1つは各関数に計算を実行させるか、2つはデータを事前正規化するかです。
フレームワークデザイナーの観点から:後者は本質的に高速です。前者を想定すると、ユーザーがデータを正規化しようと考えている場合でも、同じ正規化ルーチンを実行する必要がありますOR =各関数の2つのバージョンを提供することになりますが、これは頭痛の種です。しかし、この時点で、呼び出す関数のバージョンを人々に考えさせることで、正しい関数を呼び出すのに十分なことを考えさせることもできます。 1つは、そもそもそれを提供するだけであり、パフォーマンスにとって正しいことを彼らにさせます。
大きさではなく、ベクトルが指す方向のみに関心があるため、ベクトルを正規化することがよくあります。
具体的なシナリオは 通常のマッピング です。表面に当たる光と表面に垂直なベクトルを組み合わせることで、奥行きの錯覚を与えることができます。サーフェスからのベクトルは平行方向を定義し、ベクトルの大きさは実際に計算を間違ってしまいます。
何かを行う前に、ベクターをユニットに変換する必要があります。
このステートメントは正しくありません。すべてのベクトルは単位ベクトルではありません。
座標空間の基礎を形成するベクトルには、操作を容易にする2つの非常に優れたプロパティがあります。
これにより、3D空間で任意のベクトルを単位ベクトルの線形結合として書き込むことができます。
(ソース: equationsheet.com )
各成分を大きさで除算する必要がある場合は、このベクトルを単位ベクトルに変換することを選択できます
(ソース: equationsheet.com )
座標空間または基底ベクトルがわからない場合は、さらに進む前に、グラフィックの数学についてもう少し学ぶことをお勧めします。
すでに提供されている回答に加えて、2つの重要な側面に言及します。
すべての三角関数は、単位円上で定義されます。数値pi
自体は、単位円上で定義されます。
ベクトルを正規化すると、スケーリングのラウンドを行わずに、すべての三角関数を直接使用できます。前述のように、2つの単位ベクトル間の角度は、単純にacos(dot(u, v))
であり、それ以上のスケーリングはありません。
ベクトルは、大きさと方向の2種類の情報を運ぶ量として解釈できます。力、速度、加速度は重要な例です。
マグニチュードと方向を個別に扱いたい場合は、形式vector = magnitude * direction
、ここでmagnitude
はスカラー、direction
は単位ベクトルであることが多く、非常に便利です。マグニチュードの変更はスカラー操作を伴い、方向の変更はマグニチュードを変更しません。 direction
は、vector
の大きさがmagnitude
と正確に等しくなるように、単位ベクトルである必要があります。