« C4DのC.O.F.F.E.E.のPointLineDistance()関数を使って、ポリゴンの面積を求めてみる | トップページ | C4D C.O.F.F.E.E. 2つのベクトルに垂直なベクトルを返すvcross()関数の返すベクトル。 »

C4D C.O.F.F.E.E.で三角ポリゴンの法線の取得。

残念ながら、C.O.F.F.E.E.にはポリゴンの法線を取得する関数はありません。
法線が必要な場合は算出します。

ところで、ポリゴンの法線とは…
3DCGに携わっている方には、説明する必要はないですね。
「ポリゴンに直交する正規化されたベクトル」、「ポリゴンに直交する単位ベクトル」ですね…
と言う事は…
ポリゴンに直交していても、正規化していなく単位ベクトルでなければポリゴンの法線ではないと言うことだろうか?

ポリゴンの法線を求めるには、2つのベクトルに直交するベクトルを取得するvcross()関数を使います。

[vector]vcross([vector]v1 , [vector]v2)

v1とv2の順番は、見た目に時計の針を進めるような順番で指定すると、直交したベクトルは手前に伸びます。

Normal_2

左手系とか右手系って言うわけだけど…

vcross()で求めたベクトルは、単位ベクトルではないので、vnorm()関数で正規化し、長さを1.0にして三角ポリゴンの法線を完成させます。

[vector]vnorm([vector]v)

三角ポリゴンの法線を求める関数を作ります。

Normal_03

ポリゴンを構成する3個のポイントを渡します。
ベクトルの計算の順番を間違わないように…
C4Dの内部でも、ポリゴンのポイントを見た目に時計回りに指定すると、手前に伸びるように設定されています…
くれぐれも、C4Dのポリゴンの法線と逆向きにならないように気を付けて…

//三角ポリゴンの法線
GetPolygonNormal(p0 , p1 , p2)
{
  var v;

  v = vnorm(vcross(p2 - p1 , p0 - p1));

  return v;
}

関数にするほどでもなく、直接組み込んでも良いね。
この程度なら、直接組み込むんだろうけど…

変数vも必要ないね。直接returnで返しても…

//三角ポリゴンの法線
GetPolygonNormal(p0 , p1 , p2)
{
  return vnorm(vcross(p2 - p1 , p0 - p1));
}

そうか、だからC.O.F.F.E.E.にはポリゴンの法線を取得する関数が無いのか…
少しワザトらしかったかなぁ。

|

« C4DのC.O.F.F.E.E.のPointLineDistance()関数を使って、ポリゴンの面積を求めてみる | トップページ | C4D C.O.F.F.E.E. 2つのベクトルに垂直なベクトルを返すvcross()関数の返すベクトル。 »