概要
Houdiniはカーブ全体を単純に滑らかにするのは簡単に出来ますが、下図のように角ばった形状は保持しつつ滑らかにするのは工夫が必要です。
この記事で紹介する手法は特徴点を取得し、その場所を基準にカーブをバラバラにしてから滑らかにする手法です。
特徴点の取得
まずPoint Wrangleで、特徴点を取得します。
特徴点の指定はポイントの角度を基準に、一定角度以下のポイントをグループに登録します。
// 隣のポイントを取得
int nb_pts[] = neighbours(0, @ptnum);
// 隣にあるポイントの数が2個じゃなければ処理を飛ばす
if (len(nb_pts) != 2)
return;
// 隣のポイントの位置を取得
vector p0 = point(0, "P", nb_pts[0]);
vector p1 = point(0, "P", nb_pts[1]);
// 隣の位置に向かうベクトルを取得
vector dir0 = normalize(p0 - @P);
vector dir1 = normalize(p1 - @P);
// 角度の取得
float dot = dot(dir0, dir1);
float angle = degrees(acos(dot));
// 一定角度以下ならグループに登録
i@group_feature = angle < chf("angle_threshold");
ここでは120度以下のポイントをfeature
というグループに登録しました。
特徴点を基準にカーブを切り分ける
取得した特徴点を基準にカーブを切り分けていきます。
まずはすべてのポイントをばらばらにします。
カーブのすべてのポイントをばらばらにするにはConvert Line
を繋げてからSplit Points
を繋げます。
見た目は変わっていませんが、エッジごとにカーブが分かれた状態で切り分けられます。
次にFuseノードを繋げ、Group欄に!feature
と指定し(!を付けることで指定したグループ以外になります)、先ほど取得した特徴点以外のポイントを繋げます。
ただそのままではプリミティブは分かれたままなので、Poly Path
を繋げてポイントが繋がってる場所は一つのカーブになるようにする必要があります。
滑らかにする
最後にResampleノードを繋げ、間隔を設定し、Treat Polygon AsをSubdivision Curvesにするとポイントを増やしながらカーブを滑らかに出来ます。
一連の流れのhipファイルは下記にアップしています。説明上開いたカーブで説明しましたが、hipファイルでは閉じたカーブで行ってます。
もしもっと良い方法を知ってる方がいればTwitterかコメントで教えてください。