ベクトル演算は 3D グラフィックス、物理演算およびアニメーションにとって基本であり、さらに深く理解することで Unity を最大限活用するのに役立ちます。以下で主要な演算および活用できる多くの場面に関しての提案をまとめます。
二つのベクトルが互いに足しあわされるとき、結果はもとのベクトルを次から次への “ステップ” とみなすのと同じです。二つのパラメーターの順番はどちらにせよ同じになるので影響がないことに注意ください。
もし最初のベクトルを空間上の点とした場合、2 つ目のベクトルはその位置からのオフセットまたは “ジャンプ” とみなすことができます。例えば、地面から 5 ユニット上の位置を見つけるためには次の計算を用いることができます。
var pointInAir = pointOnGround + new Vector3(0, 5, 0);
もしベクトルが力を表す場合、より直感的な捉え方は向きや大きさです(大きさは力の大きさです)。二つのベクトルを足すことは力の合成と同じです。この考え方は別のコンポーネントで同時に加えるときに便利です(例えば、正面に向うロケットが横風の影響を受けているかもしれません)。
ベクトルの減算は、ひとつのオブジェクトから別のオブジェクトへの向きと距離を出す場合にもっともよく使われます。減算の場合は、2つのパラメーターの順番は計算結果に 影響を与える ことに注意ください。
// ベクトル d は c と同じ大きさですが、反対方向に点があります。
var c = b - a;
var d = a - b;
数字については、負の値のベクトルを足すのは、正の値のベクトルを減算するのと同じです。
// これらは両方とも結果は同じです。
var c = a - b;
var c = a + -b;
負の値のベクトルはもとと同じ大きさであり、同一線分上に沿いますが、まったく逆の方向となります。
ベクトルについて議論するとき、普通の数字(例えば浮動少数点の値)をスカラーとみなすことが通常です。この意味は、スカラーはひとつの “スケール” または大きさしかありませんが、ベクトルには大きさと向きがあります。
ベクトルにスカラーを乗算すると、元のベクトルと同じ方向を向くベクトルが得られます。ただし、新しいベクトルの大きさは元の大きさにスカラーの値を乗算した値となります。
同様に、スカラーの除算は元のベクトルの大きさをスカラーで割ります。
これらの演算はベクトルが動作のオフセットまたは力を表現するときに便利です。これによりベクトルの向きを変えることなくの大きさを変更できます。
あるベクトルが自身の大きさにより除算されると結果は大きさが 1 のベクトルとなり、これは正規化ベクトルと呼ばれています。もし成果ベクトルにスカラーを乗算すると、結果の大きさはスカラーの値と同じになります。これは力の向きが一定でありながら強さが制御できるときに便利です(例えば、車の車輪はつねに前に進みますが、強さはドライバにより制御されます)。
内積は二つのベクトルによりスカラーを返します。このスカラーは二つのベクトルの大きさを乗算したもの、およびベクトルのなす角のコサインと等しくなります。両方のベクトルが正規化されているとき、コサインは本質的に最初のベクトルが二つめのベクトルの向きに進んでいるかを表します(あるいはその逆もあり、パラメーターの順番は影響ありません)。
角度を基にして、対応するコサインを計算機により見つけることは容易です。しかし、下図のようにいくつかの主なコサインの値を直感的に理解することが役に立ちます。
内積はとてもシンプルな演算であり、Mathf.Cos 関数のいくつかのケースではベクトルの magnitude 演算の代わりに使用できます。(まったく同じではありませんが、場合によっては得られる効果は同じです)。しかし、内積の関数を利用したほうが要する CPU 時間が短く、このために価値の高い演算となります。
この他の演算は 2D や 3D、あるいはより高次元ベクトルのでも定義ができます。一方で対照的に、外積は、3D ベクトルでしか意味をなしません。二つのベクトルを基に、別のベクトルを結果として出力します。
結果ベクトルは二つの入力ベクトルに対して垂直になります。“左手の法則” を覚えることで、入力ベクトルの順番による出力ベクトルの向きを判断することができます。もし最初のパラメーターが手の親指、二つめのパラメーターが人差し指、そして結果は中指の方向を指します。もしパラメーターの順番が逆になると結果のベクトルは正反対の向きで、ただし同じ大きさとなります。
結果の大きさは入力ベクトルの大きさを乗算して、さらにそれらがなす角のサインを乗算したものとなります。サイン関数で役立つ値を以下で示します。
外積は、いくつかの便利な情報を返り値に合成するため複雑に感じられるかもしれません。しかし、内積と同様に数学的にとても効率的であり、これを使用しなければ遅い超越関数に依存するコードを最適化することができます。