2012-04-03 9 views
18

もう少しベクトルを理解しようとしています。ベクトルを正規化する必要はありますか?

ベクトルを正規化する必要はありますか? | N | - 私は、ベクトル、N =(x、y、z)は

あなたはそれを正規化するとき、あなたが実際に何を得るのですかをお持ちの場合は

私はあなたがX /分割する必要がアイデアを得ますy/| N | & z/| N |私の質問は、なぜこのことをやっているのか、私はこの方程式から何を得るのかということです。

これを実行する意味は「内部」とは何ですか?

数学の質問のビット、私はお詫び申し上げますが、私は本当にこのトピックでは明確ではありません。

答えて

4

これはなぜ私たちが数字を乗算するのかと尋ねるようなものです。それはいつも起きている。

私たちが使用するデカルト座標系は正規直交基底(互いに直交する長さ1のベクトルであり、基底とはこれらのベクトルの一意の組み合わせで表されることを意味します)です。 (あなたが周りを見回すときにビデオゲームの仕組みで起こる)基礎を回転させると、行と列が正規直交ベクトルである行列が使用されます。

線形代数の行列を十分に使い始めると、正規直交ベクトルが必要になります。名前を付ける例はあまりにも多くあります。我々はは(私たちはは、我々は彼らなしでは生きことができ、ハンバーガーを必要としないが、誰がために起こっている?と同じように)正規化ベクトルが必要ですが、ありません一日の終わりに

v/|v|という同様のパターンが頻繁に現れ、人々は名前と特別な表記法(ベクトルの上にはベクトルが正規化されたベクトルを意味する)をショートカットとして与えることに決めました。

正規化されたベクトル(単位ベクトルとも呼ばれます)は、基本的には生命の事実です。

+0

ブリリアント。どうもありがとう。今私はより良い理解を持っています。 matriceの表現は多くの助けになりました! :) – HungryCoder

+0

正規化のメリットは何ですか? –

+1

@StanlyMosesベクトルは、方向と大きさの2つの要素の観点から考えることができます。ベクトルを大きさで割ることによって、方向成分のみを保持し、大きさを破棄する。たとえば、<1,1>と<2,2>は等価になります。これは、投影などの多くの操作に便利です。 – Shuklaswag

0

あなたは長さを1にしています - 同じ方向を指す単位ベクトルを見つけること。

単位ベクトルのベクトルの内積を単位ベクトルの方向にそのベクトルの成分の長さとするなど、さまざまな目的に役立ちます。

1

法線ベクトルは、方向ベクトルとしてのみ使用されます。これらは、正規化された法線ベクトルを必要とする照明計算に使用されます。

29

ベクター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)に関するものです。しかし、デカルト座標ではどういう意味ですか?

3次元空間でベクトルを定義するには、いくつかの参照方向が必要です。これらの基準方向は、正準IJK( - "私はキャップ" と呼ばれる、 "Jキャップ" と "Kキャップ" それらにほとんどキャップを有する、またはI、J、K)と呼ばれます。 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フリークのすべてに対して、私はそこにパイを置くつもりはありません)。 )。あなたは厄介な方向に投げたくはありませんか?私は西洋に直面しているスイカを4キロにしたいと言うのは本当に理にかなっていますか?あなたが狂った狂信的な人でなければ、もちろんです。

その他の場合は、方向のみが重要です。あなたは大きさを気にしないでください。大きさは無限大です(無限のようなもの、無限大が本当に何であるかを実際に知っている人は誰もいません - オールハイル・ザ・グレイ・インフィニット、彼は無限の無限を持っています...) 、そこに少し持ち去られた)。このような場合、ベクトルの正規化を使用します。たとえば、北4kmに面した線があるとは言いません。私たちは北に面した線を持っていると言うのがより理にかなっています。だからあなたは何をしていますか?あなたは4キロを取り除く。あなたは大きさを破壊する。残っているのは北です(そして冬は来ます)。これはしばしば十分です。あなたがしていることに名前と表記をしなければなりません。あなたは単にそれを「大きさを無視する」と呼ぶことはできません。それはあまりにもひどいです。あなたは数学者なので、正規化と呼んでいます。これはおそらくベクトルに縛られずにパーティーに行きたかったからです。私はデカルト座標を述べたので、

ところで、ここ義務XKCDです:XKCD

+1

非常に役に立ちます。正規化の重要性を明確に示します。 –

+2

受け入れられた答えよりもはるかに優れています。 –

+1

これは非常に良い説明です。実際に、私はいつもこのような質問を愛しています。なぜなら、このような答えを生み出すため、ここにいる人々の何人かは、どうしてその理由を説明しなくても、専門用語を説明しています。私は開発者であり、ジャーゴン(私はまったく気にしない)に追いついていますが、時には、彼らの命名の理由が、それが何をするのかということが重要な点があります。例えば(エスプレッソ単体テストの意図されたメソッドとの比較)と(マップと対応するflatMapメソッド)。 –

8

Godot Game Engine
documentation about unit vector、正規化を読み取​​り、ドット積は、本当に多くの意味になります。ここに記事があります:

ユニットベクトル Ok、ベクトルが何であるかを知っています。方向と大きさを持っています。私たちはGodotでそれらを使う方法も知っています。次のステップは単位ベクトルについて学習することです。大きさが1のベクトルは単位ベクトルとみなされます。 2Dでは、半径1の円を描くと想像してください。この円には、2次元のすべての単位ベクトルが含まれています。

enter image description here 単位ベクトルについてはどういう特殊性がありますか?ユニットベクトルは素晴らしいです。換言すれば、単位ベクトルはいくつかの非常に有用な特性を有する。

単位ベクトルの幻想的な特性については、一度に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)。

enter image description here そして、あなたはそれが3Dゲームや複雑な2Dゲームを作る放棄する時間です実現:絶望が始まり、書籍やチュートリアルはあなたにこの数式を見せる

です。何かとても単純なことがどうしてそんなに複雑になりますか?誰かが次のゼルダまたはコールオブデューティをしなければならないでしょう。結局のところ、トップダウンRPGはそれほど悪くはありません。ええ、誰かがスチームでそれらの1つでかなり意志をしたと聞いています...

これはあなたの瞬間です、これは輝く時間です。あきらめないでください!この時点で、このチュートリアルは急激に変化し、ドットプロダクトを有用なものにすることに焦点を当てます。これがなぜ有用なのでしょうか。実際のアプリケーションでは、ドットプロダクトのユースケースに1つずつ注目します。意味を持たない数式はもうありません。数式は、それらが役に立つものを学ぶと理にかなっています。

サイディング ドットプロダクトの最初の有用で最も重要な特性は、どのような側面が見ているかを確認することです。 aとbの2つのベクトルがあるとしましょう。任意の方向または大きさ(どちらも原点)。彼らが何であるかは関係ありませんが、それらの間にドットプロダクトを計算すると想像してみましょう。

var s = a.dot(b) 操作は単一の浮動小数点数を返します(ただし、ベクトルワールドになっているのでスカラーと呼びますが、今後この用語を使用し続けます)。この数値は次のようになります。

数値がゼロより大きい場合、両方とも同じ方向(それらの間の角度は、<90度です)に向かっています。 数値が0より小さい場合は、両方とも反対方向(それらの間の角度が90°を超える)に向かっています。 数値がゼロの場合、ベクトルの形状はL(その間の角度は90度)です。 enter image description here 実際のユースケースのシナリオを考えてみましょう。蛇が森を通っていると想像してから、近くに敵がいます。敵が発見したスネークを見たかどうかをすぐにどのように確認できますか?彼を発見するためには、敵はスネークを見ることができなければなりません。その、のは言ってみましょう:

スネークが位置Aにある 敵の敵はF.

enter image description here ので、方向ベクトルの方を向いている 位置Bにある、のが行く新しいベクトルBAを作成してみましょうアイコンタクトに目を、それがあろう作るために、ガードは、直蛇に向かって探していた場合、理想的にはB enter image description here -

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つの単位ベクトルを考えてみましょう。結果としてスカラーをプロットしながら

enter image description here ...最初のものは、あまりにも、第二の上を向いているが、我々はすべての方法(0°)まで(180°度)までからそれを回転します!

enter image description here Aha!これはすべて今、Cosine関数です!

は、我々は

二つの単位ベクトル間の内積は、これら2つのベクトル間の角度の余弦です...原則として、そして、それを言うことができます。したがって、2つのベクトルの間の角度を取得するには、次のようにする必要があります。

var angle_in_radians = acos(a.dot(b)) 

この情報はどのように役に立ちますか?実際に角度を直接取得することはおそらく有用ではありませんが、角度を伝えることができれば参考に役立ちます。 1つの例はキネマティックキャラクターのデモです。キャラクターが特定の方向に動いてオブジェクトに当たったときです。私たちが襲ったものが床であるかどうかを知るには?

衝突点の法線を、以前に計算された角度と比較することによって、

この美しさは、同じコードがまったく同じで、3Dでは変更なしで動作することです。ベクトル演算は次元の量に依存しないため、軸を追加または削除するだけで非常に複雑さが増します。

関連する問題