ベクトルをもう少し理解しようとしています。
ベクトルを正規化する必要性は何ですか?
ベクトルがある場合、N =(x、y、z)
正規化すると実際に何が得られますか-x/| N |を除算する必要があるという考えがわかりますy/| N | &z/| N |。私の質問は、なぜこのようなことをするのか、この方程式から何を得るのかということです。
これを行う意味または「内部」目的は何ですか。
少し数学の質問です、申し訳ありませんが、このトピックでは本当に明確ではありません。
これは、なぜ数値を乗算するのかを尋ねるようなものです。それはいつも現れます。
使用するデカルト座標系は、正規直交基底です(互いに直交する長さ1のベクトルで構成されます。基底は、基底を回転させたい場合に、これらのベクトルの一意の組み合わせで任意のベクトルを表すことができることを意味します)。これは、ビデオゲームの力学で見回すと発生します)行と列が正規直交ベクトルである行列を使用します。
線形代数で行列をいじり始めるとすぐに、正規直交ベクトルが必要になります。名前を付けるだけの例は多すぎます。
結局のところ、私たちはneed正規化されたベクトルを使用しません(---needハンバーガーを使用しないのと同じように、それらなしで生きることができますが、誰がto?)、しかしv / |v|
の同様のパターンが頻繁に登場するため、ショートカットとして名前と特別な表記(ベクトルの上の^は正規化されたベクトルであることを意味します)を付けることにしました。
正規化されたベクトル(単位ベクトルとも呼ばれます)は、基本的に、現実の事実です。
任意のベクトルV = (x, y, z)
の場合、|V| = sqrt(x*x + y*y + z*z)
はベクトルの長さを示します。
ベクトルを正規化するとき、実際にはV/|V| = (x/|V|, y/|V|, z/|V|)
を計算します。
正規化されたベクトルの長さが1であることが簡単にわかります。これは、次の理由によります。
_| V/|V| | = sqrt((x/|V|)*(x/|V|) + (y/|V|)*(y/|V|) + (z/|V|)*(z/|V|))
= sqrt(x*x + y*y + z*z) / |V|
= |V| / |V|
= 1
_
したがって、正規化されたベクトルを単位ベクトル(つまり、単位長のベクトル)と呼ぶことができます。
正規化されたベクトルは、大きさのみが変化し、方向は変化しません。また、同じ方向を指すすべてのベクトルは、同じベクトルに正規化されます(大きさと方向がベクトルを一意に定義するため)。したがって、単位ベクトルは方向を示すのに非常に役立ちます。
ただし、上記の説明はすべて3次元のデカルト座標_(x, y, z)
_に関するものでした。しかし、デカルト座標とはどういう意味ですか?
結局、3D空間でベクトルを定義するには、いくつかの参照方向が必要です。これらの参照方向は、正規にi、j、kと呼ばれます(または、i、j、kに小さなキャップが付いている-"i"と呼ばれます) cap」、「j cap」、「k cap」)。 V = (x, y, z)
と考えるベクトルは、実際には_V = xi + yj + zk
_として書き込むことができます。 (注:大文字で呼び出すことはもうありません。単にi、j、kと呼びます)。 i、j、kはX、Y、Z方向の単位ベクトルで、相互に直交する単位ベクトルのセットを形成します。これらはすべてのデカルト座標ジオメトリの基礎です。
座標には他の形式(円柱座標や球座標など)があり、それらの座標は_(x, y, z)
_のように直接理解することはできませんが、これらの座標も、基底を形成する3つの相互に直交する単位ベクトルのセットで構成されます。どの3つの座標を乗算してベクトルを生成します。
したがって、上記の説明では、他のベクトルを定義するために単位ベクトルが必要であることを明確に述べていますが、なぜあなたは気にする必要がありますか?
時々、大きさだけが重要です。それはあなたが「通常の」数(4または1/3または3.141592653のようなもの)を使用するときです-いいえ、あなたのすべてのOCDフリークのために、私はそこにPiを置くつもりはありません-それは私が邪悪な転生しているからです)。あなたは厄介な方向に投げたくないでしょうか?つまり、西向きのスイカ4キロが欲しいと言っても意味がありませんか。もちろん、狂った狂信者でない限り。
他の場合には、方向だけが重要です。マグニチュードは気にしないか、マグニチュードが大きすぎて計算できない(無限大のようなものです。無限大が実際に何であるかをだれも実際に知らないということだけです。 、そこに少し夢中になりました)。そのような場合、ベクトルの正規化を使用します。たとえば、北に4 kmのラインがあると言っても意味がありません。北向きの路線があると言う方が理にかなっています。それで、あなたは何をしますか?あなたは4キロを取り除く。あなたはマグニチュードを破壊します。あなたが残っているのは北だけです(そして冬は来ています)。これを頻繁に行うと、自分がやっていることに名前と表記を付ける必要があります。あなたはそれを単に「大きさを無視する」と呼ぶことはできません。それはあまりにも粗末です。あなたは数学者なので、それを「正規化」と呼び、それに「キャップ」の表記を与えます(おそらく、ベクトルにこだわるのではなくパーティーに行きたかったからでしょう)。
ところで、私はデカルト座標に言及したので、これは必須のXKCDです:
Godotゲームエンジン単位ベクトルに関するドキュメント 、正規化、およびドット積を読むことは、非常に理にかなっています。ここに記事があります:
単位ベクトル
では、ベクターとは何かを知っています。方向と大きさがあります。 Godotでの使用方法も知っています。次のステップは、単位ベクトルについて学習することです。長さが1の大きさのベクトルは、単位ベクトルと見なされます。 2Dで、半径1の円を描くことを想像してください。その円には、2次元に存在するすべての単位ベクトルが含まれています。
では、単位ベクトルの何がそれほど特別なのでしょうか。単位ベクトルは素晴らしいです。言い換えれば、単位ベクトルにはいくつかの非常に有用な特性があります。
単位ベクトルの素晴らしい特性についてもっと知りたいのですが、一度に1つのステップです。では、単位ベクトルは通常のベクトルからどのように作成されるのでしょうか。
正規化
ベクトルを取り、その方向を維持しながらその大きさを1.0に減らすことを正規化と呼びます。正規化は、ベクトルのxおよびy(および3Dではz)コンポーネントをその大きさで除算することによって実行されます。
_var a = Vector2(2,4)
var m = sqrt(a.x*a.x + a.y*a.y)
a.x /= m
a.y /= m
_
ご想像のとおり、ベクトルの大きさが0の場合(つまり、ベクトルではなく、原点はnullベクトルとも呼ばれます)、ゼロによる除算が発生し、宇宙は2番目のビッグバンを通過します(ただし、極性が逆である場合を除く) 。その結果、人間性は安全ですが、Godotはエラーを出力します。覚えておいてください! Vector(0,0)は正規化できません!。
もちろん、Vector2とVector3はすでにこれを行う方法を提供しています。
_a = a.normalized()
_
ドット製品
OK、ドット積はベクトル計算の最も重要な部分です。ドット積がなければ、Quakeは決して作られなかったでしょう。これはチュートリアルの最も重要なセクションなので、正しく理解してください。ベクトル数学を理解しようとするほとんどの人はここではあきらめます。なぜなら、それがどれほど単純であるにも関わらず、彼らはそれから頭や尾を作ることができないからです。どうして?理由は次のとおりです...
内積は2つのベクトルを取り、スカラーを返します。
_var s = a.x*b.x + a.y*b.y
_
はい、ほとんどそれです。ベクトルaのxにベクトルbのxを掛けます。 yについても同じことを行い、一緒に追加します。 3Dでもほとんど同じです。
_var s = a.x*b.x + a.y*b.y + a.z*b.z
_
まったく意味がありません!組み込み関数でそれを行うこともできます:
_var s = a.dot(b)
_
2つのベクトルの順序は関係ありません。a.dot(b)
はb.dot(a)
と同じ値を返します。
これが絶望の始まりであり、本とチュートリアルはこの公式を示しています:
そして、3Dゲームや複雑な2Dゲームの作成をあきらめるときがきたと気づいたとします。単純なものを複雑にするにはどうすればよいですか?他の誰かが次のゼルダまたはコールオブデューティを作らなければならないでしょう。トップダウンのRPGはそれほど悪く見えません。うん、誰かがSteamのそれらのどれかでかなり意志をしたと聞いています...
だから、これはあなたの瞬間です、これはあなたが輝く時間です。あきらめないでください!この時点で、このチュートリアルは急変し、ドット積の有用性に焦点を当てます。これが便利な理由です。私たちは、実際のアプリケーションで、ドット製品の使用例に1つずつ焦点を当てます。意味をなさない数式はもうありません。数式は、何に役立つのかを理解すれば意味があります。
サイディングドット積の最初の有用で最も重要な特性は、どのサイドアイテムが見ているかをチェックすることです。 2つのベクトルaとbがあるとします。任意の方向または大きさ(どちらも原点ではありません)。それらが何であるかは関係ありませんが、それらの間の内積を計算するとします。
_var s = a.dot(b)
_
この操作は単一の浮動小数点数を返します(ただし、ベクトルの世界にいるため、スカラーと呼び、今後もその用語を使用します)。この番号から次のことがわかります。
数値がゼロより大きい場合、両方が同じ方向を向いています(それらの間の角度は90度未満です)。数値が0未満の場合、両方が反対方向を向いています(それらの間の角度は> 90°度です)。数値がゼロの場合、ベクトルはL形になります(ベクトル間の角度は90°です)。
それでは、実際のユースケースのシナリオを考えてみましょう。ヘビが森を通り抜け、そして近くに敵がいると想像してください。敵がスネークを発見したのを見たかどうか、どうすればすぐにわかりますか?彼を発見するには、敵はヘビを見ることができなければなりません。それでは、次のことを考えてみましょう。
ヘビは位置Aにいます。敵は位置Bにいます。敵は方向ベクトルFの方を向いています。
そこで、ガード(B)からスネーク(A)に向かう2つのベクトルBAを差し引いてみましょう。
_var BA = A - B
_
理想的には、ガードがヘビの方を真っ直ぐに見ている場合は、目と目を合わせて、ベクトルBAと同じ方向にそれを行います。
FとBAの内積が0より大きい場合、Snakeが検出されます。これは、警備員が彼の方を向いていることを伝えることができるためです。
_if (BA.dot(F) > 0):
print("!")
_
これまでのところ、ヘビは安全なようです。
単位ベクトルでサイディングします。これで、2つのベクトル間の内積によって、同じ側、反対側、または互いに垂直な方向を向いていることがわかります。
これは、大きさに関係なく、すべてのベクトルで同じように機能するため、単位ベクトルも例外ではありません。ただし、同じプロパティを単位ベクトルで使用すると、追加のプロパティが追加されるため、さらに興味深い結果が得られます。
両方のベクトルが正確に同じ方向を向いている場合(互いに平行、それらの間の角度は0°)、結果のスカラーは1です。両方のベクトルが正確に反対方向を向いている場合(互いに平行だが、それらの間の角度) 180°)、結果のスカラーは-1です。これは、単位ベクトル間の内積が常に1〜-1の範囲であることを意味します。だから再び...
それらの角度が0°の場合、ドット積は1です。それらの角度が90°の場合、ドット積は0です。それらの角度が180°の場合、ドット積は-1です。ええと。これは奇妙によく知られている...これを以前に見た...どこに?
2つの単位ベクトルを見てみましょう。 1つ目は上向き、2つ目も上向きですが、上(0°)から下(180°度)まで回転させます...
結果のスカラーをプロットしながら!
ああ!これはすべて理にかなっています、これはコサイン関数です!
そのため、原則として...
2つの単位ベクトル間の内積は、これら2つのベクトル間の角度の余弦です。したがって、2つのベクトル間の角度を取得するには、次のことを行う必要があります。
_var angle_in_radians = acos( a.dot(b) )
_
これは何に役立ちますか?角度を直接取得することはおそらくそれほど役に立ちませんが、角度を知ることができるだけで参考になります。 1つの例は、キネマティックキャラクターのデモです。キャラクターが特定の方向に移動すると、オブジェクトに当たります。私たちがぶつかったのが床かどうか見分ける方法は?
衝突点の法線を以前に計算された角度と比較する。
これの利点は、同じコードがまったく同じように機能し、3Dで変更を加えなくても機能することです。ベクトル演算は、多くの場合、次元の量に依存しないため、軸を追加または削除しても、複雑さはほとんどありません。
あなたはその長さを1にしている-同じ方向を指す単位ベクトルを見つける。
これは、さまざまな目的に役立ちます。たとえば、ベクトルと単位ベクトルの内積をとる場合、そのベクトルの成分の長さを単位ベクトルの方向に持つことができます。
法線は、方向ベクトルとしてのみ使用されることになっています。これらは、正規化された法線ベクトルを必要とするライティング計算に使用されます。