5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

角ばった形状は保持しつつカーブを滑らかにする

Last updated at Posted at 2023-12-10

概要

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 AsSubdivision Curvesにするとポイントを増やしながらカーブを滑らかに出来ます。

一連の流れのhipファイルは下記にアップしています。説明上開いたカーブで説明しましたが、hipファイルでは閉じたカーブで行ってます。
もしもっと良い方法を知ってる方がいればTwitterかコメントで教えてください。

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?