Godot Game Engine
documentation about unit vector、正規化を読み取り、ドット積は、本当に多くの意味になります。ここに記事があります:
ユニットベクトル Ok、ベクトルが何であるかを知っています。方向と大きさを持っています。私たちはGodotでそれらを使う方法も知っています。次のステップは単位ベクトルについて学習することです。大きさが1のベクトルは単位ベクトルとみなされます。 2Dでは、半径1の円を描くと想像してください。この円には、2次元のすべての単位ベクトルが含まれています。
単位ベクトルについてはどういう特殊性がありますか?ユニットベクトルは素晴らしいです。換言すれば、単位ベクトルはいくつかの非常に有用な特性を有する。
単位ベクトルの幻想的な特性については、一度に1歩ずつ知りたいと思っています。だから、単位ベクトルは普通のベクトルからどのようにして作られていますか?
ノーマライズ どのベクトルをとっても、その方向を保ったまま、大きさを1.0に縮小することを正規化といいます。ベクターが有する場合は、推測したかもしれないよう
var a = Vector2(2,4)
var m = sqrt(a.x*a.x + a.y*a.y)
AX/= M AYの/ = M :正規化は、ベクトルの成分は、その大きさ(3Dであり、z)は、xとyを分割することによって行われますマグニチュード0(つまり、ベクトルではなく、原点もヌルベクトルと呼ばれます)、ゼロによる除算が行われ、宇宙は逆極性を除き2番目のビッグバンを通過します。その結果、人類は安全ですが、Godotはエラーを表示します。忘れないで!ベクトル(0,0)は正規化できません!
もちろん、ベクトル2とのVector3はすでにこれを行うための方法を提供するが:
a = a.normalized()
内積 OK、内積は、ベクトル数学の最も重要な部分です。ドットプロダクトがなければ、Quakeは決して作られなかっただろう。これはチュートリアルの最も重要なセクションですので、適切に把握してください。ベクトル計算を理解しようとしているほとんどの人は、単純な方法にもかかわらず、その頭や尾を作ることができないため、ここではあきらめます。どうして?理由はここにあります、それは
...ので、内積2つのベクトルを取り、スカラーを返しています:
var s = a.x*b.x + a.y*b.y
はい、かなりのもの。ベクトルaからxをベクトルbから掛ける。 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はそれほど悪くはありません。ええ、誰かがスチームでそれらの1つでかなり意志をしたと聞いています...
これはあなたの瞬間です、これは輝く時間です。あきらめないでください!この時点で、このチュートリアルは急激に変化し、ドットプロダクトを有用なものにすることに焦点を当てます。これがなぜ有用なのでしょうか。実際のアプリケーションでは、ドットプロダクトのユースケースに1つずつ注目します。意味を持たない数式はもうありません。数式は、それらが役に立つものを学ぶと理にかなっています。
サイディング ドットプロダクトの最初の有用で最も重要な特性は、どのような側面が見ているかを確認することです。 aとbの2つのベクトルがあるとしましょう。任意の方向または大きさ(どちらも原点)。彼らが何であるかは関係ありませんが、それらの間にドットプロダクトを計算すると想像してみましょう。
var s = a.dot(b) 操作は単一の浮動小数点数を返します(ただし、ベクトルワールドになっているのでスカラーと呼びますが、今後この用語を使用し続けます)。この数値は次のようになります。
数値がゼロより大きい場合、両方とも同じ方向(それらの間の角度は、<90度です)に向かっています。 数値が0より小さい場合は、両方とも反対方向(それらの間の角度が90°を超える)に向かっています。 数値がゼロの場合、ベクトルの形状はL(その間の角度は90度)です。 実際のユースケースのシナリオを考えてみましょう。蛇が森を通っていると想像してから、近くに敵がいます。敵が発見したスネークを見たかどうかをすぐにどのように確認できますか?彼を発見するためには、敵はスネークを見ることができなければなりません。その、のは言ってみましょう:
スネークが位置Aにある 敵の敵はF.
ので、方向ベクトルの方を向いている 位置Bにある、のが行く新しいベクトルBAを作成してみましょうアイコンタクトに目を、それがあろう作るために、ガードは、直蛇に向かって探していた場合、理想的にはB -
VARのBA = A:スネーク(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つの単位ベクトルを考えてみましょう。結果としてスカラーをプロットしながら
...最初のものは、あまりにも、第二の上を向いているが、我々はすべての方法(0°)まで(180°度)までからそれを回転します!
Aha!これはすべて今、Cosine関数です!
は、我々は
二つの単位ベクトル間の内積は、これら2つのベクトル間の角度の余弦です...原則として、そして、それを言うことができます。したがって、2つのベクトルの間の角度を取得するには、次のようにする必要があります。
var angle_in_radians = acos(a.dot(b))
この情報はどのように役に立ちますか?実際に角度を直接取得することはおそらく有用ではありませんが、角度を伝えることができれば参考に役立ちます。 1つの例はキネマティックキャラクターのデモです。キャラクターが特定の方向に動いてオブジェクトに当たったときです。私たちが襲ったものが床であるかどうかを知るには?
衝突点の法線を、以前に計算された角度と比較することによって、
この美しさは、同じコードがまったく同じで、3Dでは変更なしで動作することです。ベクトル演算は次元の量に依存しないため、軸を追加または削除するだけで非常に複雑さが増します。
ブリリアント。どうもありがとう。今私はより良い理解を持っています。 matriceの表現は多くの助けになりました! :) – HungryCoder
正規化のメリットは何ですか? –
@StanlyMosesベクトルは、方向と大きさの2つの要素の観点から考えることができます。ベクトルを大きさで割ることによって、方向成分のみを保持し、大きさを破棄する。たとえば、<1,1>と<2,2>は等価になります。これは、投影などの多くの操作に便利です。 – Shuklaswag