HoudiniでUVのシームエッジを取得

# 概要

HoudiniでUVのシームエッジを取得する方法を3つ紹介します。
バージョンは18.0.287を使用しています。
![](https://paper-attachments.dropbox.com/s_105DF6D72EC9BAA975387EB44AC677610E26B3C1291152F4D4C2A224720A0130_1586234434730_GroupUVSeam.png)

# 使用例

**Remesh**する時に**Hard Edges**に取得したグループを指定するとUVを保持して、Remesh出来ます。
<img src="https://paper-attachments.dropbox.com/s_105DF6D72EC9BAA975387EB44AC677610E26B3C1291152F4D4C2A224720A0130_1586236943755_Remesh.png" width=49.5%> <img src="https://paper-attachments.dropbox.com/s_105DF6D72EC9BAA975387EB44AC677610E26B3C1291152F4D4C2A224720A0130_1586236949118_RemeshAndHardEdges.png" width=49.5%>


[四角形化](https://twitter.com/d658t/status/1247145044722606080)でシームエッジを保持する時に使えます。
<img src="https://paper-attachments.dropbox.com/s_105DF6D72EC9BAA975387EB44AC677610E26B3C1291152F4D4C2A224720A0130_1586237366628_Quad.png" width=49.5%> <img src="https://paper-attachments.dropbox.com/s_105DF6D72EC9BAA975387EB44AC677610E26B3C1291152F4D4C2A224720A0130_1586237360928_QuadAndUV.png" width=49.5%>


Heightマップを使ったディスプレイスを行う時にシームエッジの箇所のみぼかすことで破綻を防ぐ事が出来ます。
<img src="https://paper-attachments.dropbox.com/s_105DF6D72EC9BAA975387EB44AC677610E26B3C1291152F4D4C2A224720A0130_1586237178839_Displace.png" width=49.5%> <img src="https://paper-attachments.dropbox.com/s_105DF6D72EC9BAA975387EB44AC677610E26B3C1291152F4D4C2A224720A0130_1586237184955_DisplaceAndBlur.png" width=49.5%>

# 手法1

一つ目は**Group from Attribute Boundary**ノードです。
デフォルト設定で繋げるだけでUVのシームエッジをグループにしてくれます。
![](https://paper-attachments.dropbox.com/s_105DF6D72EC9BAA975387EB44AC677610E26B3C1291152F4D4C2A224720A0130_1586234423708_GroupFromAttributeBoundary.png)

# 手法2

2つ目は**Vertex Split**と**Group Transfer**を使った方法です。
**Vertex Split**にuvを指定するとシームエッジの箇所でポリゴンを分けてくれます。
<img src="https://paper-attachments.dropbox.com/s_105DF6D72EC9BAA975387EB44AC677610E26B3C1291152F4D4C2A224720A0130_1586234479820_SplitPreview.png" width=49.5%> <img src="https://paper-attachments.dropbox.com/s_105DF6D72EC9BAA975387EB44AC677610E26B3C1291152F4D4C2A224720A0130_1586234455774_VertexSplit.png" width=49.5%>
そこに**Group Create**ノードを繋ぎ、**Unshared Edge**にチェックを入れるとシームエッジの箇所にグループが作られます。
そのままではトポロジーが変わってしまうので、**Group Transfer**でグループを転送します。
**この時、Distance Thresholdを0.001など小さい値にしないと正しく転送されないので、ご注意下さい。**
![](https://paper-attachments.dropbox.com/s_105DF6D72EC9BAA975387EB44AC677610E26B3C1291152F4D4C2A224720A0130_1586234507350_GroupTransfer.png)

# 手法3

3つ目の方法は**Attribute Wrangle**を使用した方法です。
2つ目と同様に**Vertex Split**を繋いだ後に、元ジオメトリを1つ目のインプット、2つ目に**Vertex Split**を繋げ、**Run Over**を**Vertices**にしてから、下記コードを入力します。

```C#
int edge = vertexhedge(0, @vtxnum);
if (hedge_equivcount(1, edge) == 1)
{
    int src_pt = hedge_srcpoint(0, edge);
    int dst_pt = hedge_dstpoint(0, edge);
    setedgegroup(0, "seams", src_pt, dst_pt, 1);
}
```
![](https://paper-attachments.dropbox.com/s_105DF6D72EC9BAA975387EB44AC677610E26B3C1291152F4D4C2A224720A0130_1586234542193_Wrangle.png)

# 処理速度

以上3つの方法の処理速度を計ってみます。
軽いモデルだと差が分かりづらいので、豚さんにSubdivideを3段階掛けた状態で計測してみます。
![](https://paper-attachments.dropbox.com/s_105DF6D72EC9BAA975387EB44AC677610E26B3C1291152F4D4C2A224720A0130_1586236420583_Performance.png)
少し見にくいですが、それぞれの処理速度は


- **手法1：2.026秒**
- **手法2：0.713秒**
- **手法3：0.100秒**

となりました。やはり**Attribute Wrangleは速いですね！**
**Group from Attribute Boundary**は標準ノードなのに思ったより遅いという結果になりました。

# まとめ

以上HoudiniでUVシームを取得する方法でした。
ちなみに紹介した手法はいずれもアトリビュートの境界を取得するものなので、例えば**N**を指定する事でハードエッジの取得にも使えますし、**shop_materialpath**を指定する事でマテリアルの境界を取得する事も出来ます。
![](https://dl.dropboxusercontent.com/s/haqqln0t8yip9yv/GroupHardEdge.jpg?dl=0)