【Houdini】tips的なもの -normalについて-

2022.05.13更新

Houdiniでモデリングする際にCopy to Points等を使ってオブジェクトを配置することが多いが、基準となるポイント(頂点)のnormalを適切に設定しないと意図しない向きでオブジェクトが配置される。
調整のやり方を毎度のことながら忘れるのでメモ。
※新しい方法を仕入れた際に随時更新したい。

PolyFrameを使う

normal調整の際によく紹介されるノードなんだけどイマイチ理解しきれていない。『Tangent Name』に『N』を入れて使うパターンが多く、各ポイントの接線方向のnormalが生成されているような気はしている。

VEXからnormalを設定する

if(@ptnum == 0) {
  @N.z = 1;
}

if(@ptnum == 1) {
  @N.y = 1;
}

if(@ptnum == 2) {
  @N = set(0, 0, 1);
}

if(@ptnum == 3) {
  @N = set(0, 1, -1);
}

// set関数を使わなくても中括弧でもOKっぽい
// @N = {0, 1, -1};
  • これ以降はVEXでの話になる。

  • @Nは現在のnormal情報が入っているのでそこに代入する形でnormalが設定できる。

  • xyzの3方向をまとめて代入する場合はset関数を使う。

  • 個別に指定したい場合は『@N.x = 1』といった形で指定すれば代入できる。

  • プロシージャル的に考えるとあんまり固定値でnormalを設定したくないので使い所は限定的かなと感じる

両端のnormalの向きを内向き(or 外向き)にする

vector pt0 = point(0, "P", 0);
vector ptLast = point(0, "P", @numpt-1);

if(@ptnum == 0){
   @N = normalize(ptLast - pt0);
}
if(@ptnum == @numpt-1){
   @N = normalize(pt0 - ptLast);
}
  • 内向きというか、最初と最後のポイントを比較計算することでお互いの方を向いたnormalができる。5, 8行目の減算を逆にすると外向きになる。

  • @numptがポイントの総数、@ptnumが計算時の現在のポイント番号となるのが紛らわしい。

  • 『@numpt - 1』で最後のポイント番号が取得できる(上の画像で言えばポイント総数は4であるが、ポイント番号は0から始まるので最後のポイント番号としては3となる)。

  • 基本的にnormalに関してはnormalize関数を使って0-1の範囲に収めたほうが良い。normalを使って位置の移動を計算する際にそのほうが都合が良い(@P * @Nとかの計算をする際に0-1基準の方が処理が楽)。

ベクトルの外積を使って直角方向のnormalを作成する

@up = set(0, 1, 0);

@N = cross(@up, @N);
  • 2つのベクトルの外積をとるとそれに直行するベクトルが計算できる。

  • VEXだとそれがcross関数で計算できる。

  • 上記でいうと@upにy方向のnormalを設定し、それと現在のnormal(@N。これは一番初めに掲載した画像の通り接線方向を向いている)の外積を取ることで放射線上のnormalが計算できている。

  • @upと@Nを入れ替えると内向きのnormalにもなる。

オブジェクトの中心(重心)方向にnormalを設定する

// 1つ目のVEX「addPointBase」
// Run Overは「Detail (only once)」
addpoint(0, @P);

// 2つ目のVEX「setNormalCentroid」
// Run Overは「Points」
@N = normalize(point(0, "P", @numpt-1) - @P);
  • 1つ目のVEXでオブジェクト(パス)の重心にあたるポイントを新規追加する

  • 2つ目のVEXで上記で追加したポイント(最後に新規追加したポイントなので「@numpt-1」でポイント番号を指定)を元に各点の座標から差分を取ってnormalを作成する

  • gridやcircleなどの最初から閉じられたパスはpolyframeノードを使うことで中心方向へのnormalを作成できるが、モデリングの途中でできるこういった形状についてはVEXを使って工夫する必要がある

  • 今回は重心にポイントを置いたが、やっていることは任意のポイント位置を参照してnormalを作成するということ。

この記事が気に入ったらサポートをしてみませんか?