« C4D C.O.F.F.E.E. 2つのベクトルに垂直なベクトルを返すvcross()関数の返すベクトル。 | トップページ | C4D C.O.F.F.E.E.で四角ポリゴンの法線を求める方法を考える。 »

C4D 方向を示す複数のベクトルの平均?

方向を示すベクトル。
方向のみを示すベクトルは、普通、正規化され単位ベクトル(長さが1.0のベクトル)になっている事が多いことでしょう。
ポリゴンの面の向きを示す法線ベクトルなどがそうですね。

この方向を示すベクトル。複数を示す平均の方向を考えてみよう。

この事は、複数のポリゴンに囲まれたポイントの法線(頂点法線ベクトル)や…
複数のポリゴンが向いている、平均的な方向を取得したい場合に使えるでしょう…

普通、平均といえば、全てのサンプルの総和をサンプル個数で割りますが…

方向ベクトルの場合は、どうでしょう?

方向ベクトルが2個の場合。

まずは、2つの方向ベクトルを足します。

Normal_05

単純明快ですね…
赤いベクトル + 緑のベクトル = 黒いベクトル

これをサンプル数である2で割ると…

Normal_06

オレンジ色のポイントが平均の地点です。

黒いベクトルをサンプル数2で割ったので、黒いベクトルの1/2(中心)地点にオレンジ色の点がきます。
この2つのベクトルが位置を示すベクトル(座標)ならば、オレンジ色のポイントは2つのベクトルが指し示す地点の中間位置になります。

方向ベクトルが3個の場合はどうだろう?

Normal_07

赤いベクトルと緑のベクトル、それと青いベクトルを足したベクトルは黒いベクトルです。

この黒いベクトルをサンプル数3で割ると、3つのベクトルの平均になります。
黒いベクトルをサンプル数3で割ったので、黒いベクトルの1/3の地点にオレンジ色の点がきます。

赤いベクトル、緑のベクトル、それと青いベクトルが、位置を示すベクトルならば…
この3つのベクトルが指す地点でできる三角形の重心が、オレンジ色の地点になります。

ただし今回は、位置ベクトルではなく、方向ベクトルです。
オレンジ色の地点は、2本のベクトルの場合も3本のベクトルの場合も、合成されたベクトル(黒いベクトル)の上にあります。方向が同じという事です。

さて方向ベクトルは、正規化して単位ベクトルにしますので、黒いベクトルと平均にされたベクトルを共に単位ベクトルにすると同じベクトルになります。

要するに、サンプル数に関係なく、
複数の方向を示すベクトルの平均的な方向は、サンプルベクトルの総和を正規化して単位ベクトルにするだけでいいのです。

//イメージなので実行しないでください。

//[vector]v1 方向ベクトル.1(単位ベクトル)
//[vector]v2 方向ベクトル.2(単位ベクトル)
//[vector]v3 方向ベクトル.3(単位ベクトル)
//[vector]a_v1  3つの方向ベクトルの平均的な方向のベクトル.1
//[vector]a_v2  3つの方向ベクトルの平均的な方向のベクトル.2

//下の2つのベクトルは同じ値のベクトルになります。
a_v1 = vnorm((v1 + v2 + v3) / 3.0);
a_v2 = vnorm(v1 + v2 + v3);

注意しなければいけない事は、方向を示すベクトルは、前もってvnorm()等の関数を使って単位ベクトルにしておいてください。

方向ベクトルが単位ベクトルでなければ…

単位ベクトルでなくても、全ての方向ベクトルが同じ長さであれば問題はありません。
ですが、長さが違うと、本来の平均的な方向とは違い、長いベクトルの方に引き寄せられる感じになります。

Normal_22

|

« C4D C.O.F.F.E.E. 2つのベクトルに垂直なベクトルを返すvcross()関数の返すベクトル。 | トップページ | C4D C.O.F.F.E.E.で四角ポリゴンの法線を求める方法を考える。 »