プロシージャルモデリングをする際ジオメトリ上の適切な部分の選択は重要で、何かしら自動的に操作するようなものを作ろうとすると Group の作成に大半の時間を使うことになることが良くあります。

この記事では個人的によく使う基本的な Group の作り方をいくつか紹介します。

H16.5.268 hipファイル adventcalendar17_08.hipnc

Primitive group の境界線

Primitive group の境界線を Edge group に変換します。

まずは変換する Primitive group の用意
ac_17_08_01_00000.png

  • 元のグループを拡張する Group Promote Sop で Point group に変換、元のグループは後で使用するため Keep Original Group にチェック。 続けて同じ Group Promote Sop 内で Primitive Group に戻します。 Point group から Primitive Group に変換する際 Include Only ~ にチェックを入れないことで元の Point group を"含む" Primitive group が出来るためひとまわり拡張されたグループになります。 ac_17_08_01_00001.png ac_17_08_01_00002.png
  • 拡張したグループから元のグループを引き算したグループを作成 ac_17_08_01_00003.png
  • 前の手順で作った差分グループと元のグループを Edge group に変換 同時に変換しているので重なって見えますが実際にはそれぞれ別の Edge group ができています。 ac_17_08_01 (0;00;00;04).png
  • それぞれの Edge group が交差するグループを作成 これで元の Primitive group の境界線になります。 ac_17_08_01_00007.png

Polyline

Attribute Expression Sop を使って Polyline の特定のポイントをグループにします。

端点

neighbourcount() は指定したポイントに隣接する(エッジで繋がっている)ポイントの数を返します。
neighbourcount(0, @ptnum) == 1
ac_17_08_02_00000.png

枝分かれ

隣接するポイントが2より大きい場合、枝分かれ(2つ以上の Polyline から共有されている)。
neighbourcount(0, @ptnum) > 2
ac_17_08_02_00001.png

最初の頂点

@ptnum == primpoint(0, @primnum, 0)
ac_17_08_02_00002.png

最後の頂点

@ptnum == primpoint(0, @primnum, @numvtx-1)
ac_17_08_02_00003.png

角度

角(かど)のポイントをグループにします。

  • ジオメトリの外周のポイントを選択
    ac_17_08_03_00002.png

  • 対象のポイントを共有するエッジ間の角度からグループを作成

int neghpts[] = neighbours(0, @ptnum);

vector v[];
foreach(int pt; neghpts)
{
    vector p = point(0, 'P', pt);

    if(inpointgroup(0, chs('group'), pt))
        push(v, normalize(p - @P));
}

float angle = acos( dot(v[0], v[1]) );
@group_cornerpoint = degrees(angle) < ch('angle');

ac_17_08_03_00003.png