Joint Capture Biharmonic [Mardini2024]

これはMardini2024のDay19 Joint Capture Biharmonic の動画を視聴してまとめたものです。

[動画](https://www.youtube.com/watch?v=H-axB3rg03Q)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/3ccf709b-5bcb-5763-f08b-ba9aad409b99.png)

[公式のサンプルファイル](https://media.sidefx.com/uploads/contests/mardini2024/moeen_videos/mardini_examples_day19_jointcapturebiharmonic.zip) 

[Day18 APEX Scene Animate](https://qiita.com/jyouryuusui/items/25bfe0cf11c9625ae5a2) |　Day19 Joint Capture Biharmonic　|　[Day20 Ragdoll Solver SOP](https://qiita.com/jyouryuusui/items/46f539741ef1f3e10f14)

Joint Capture Biharmonicノードは、ジオメトリにスケルトンを適用するためのSOPレベルのノード

[Joint Capture Biharmonicのヘルプ](https://www.sidefx.com/ja/docs/houdini/nodes/sop/kinefx--jointcapturebiharmonic.html)

![200R.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/4a46958b-6499-5c36-7eca-6feedb6cba93.gif)

# 概要

- 主な機能：
  - ジオメトリを四面体メッシュに変換
  - スケルトンに基づいてジオメトリにウェイトを割り当て
  - 変形を可能にし、体積を保持
- 使用方法：
  1. ジオメトリとスケルトンを準備
  2. Joint Capture Biharmonicノードに接続
  3. Rig PoseとJoint Deformを使用して変形を適用
- カスタマイズ：
  - 四面体メッシュの生成方法（Adaptive/Uniform/Exact/Embed）
  - リサンプリングによるスケルトンの解像度調整
  - Joint Capture Paintによるウェイトの手動調整
  - Blend Factorを使用した元のキャプチャとの混合
  - Scale Attributeによる四面体の解像度の局所的調整
- 特徴：
  - プロシージャルな性質を持ち、スケルトンの変更に動的に対応
  - 柔軟な使用方法（例：ランダムなポイントを使用した変形）


## ジオメトリとスケルトンの準備

Geometryを作成し、その中でJoint Capture Biharmonicノードを呼び出します。
3つの入力、レストジオメトリ、キャプチャポーズ、アニメーションポーズがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/9dcba960-66dc-3b67-4603-64210505689c.png)


一つずつ割り当てていきます。

### レストジオメトリ 
キャプチャウェイトを追加するジオメトリを作成します。

Lineを作成、50ポイント
Sweepを作成、 Round Tube、エンドキャップSinglePlygon追加、カラムを30増

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/4846a1e9-3862-2eef-6c1f-79324986896e.png)



### キャプチャポーズとアニメーションポーズ（スケルトン）

スケルトンノードを作成します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/d5bd455b-2ace-39b0-ca24-31a32c5edb28.png)

ジョイントを追加しやすいようにビューポートに移動し、
Space+3を押してフロントビューポートに移動します。

Sweepの位置を確認しながらジョイントを作成していきます。
左上にSkeltonのショートカットボタンが出ていない場合は、Sleltonノードを有効にした状態でビューポート上でEnterを押してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/f1fba1b4-62af-f33f-540a-32c2653dd82c.png)

Space+1でパースペクティブモードに戻り、
ジオメトリの中心にスケルトンがあることを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/b924c7e6-393c-fadb-64e3-a9f649fc8a23.png)

このノードをキャプチャポーズとアニメーションポーズにつなぎます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/90b3c33e-65d2-e876-0c13-25c3e24eaf0d.png)


## Joint Capture Biharmonicの使用方法

接続すると、2つのものが生成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/c760d83f-3a69-acd3-956a-fa20a5c5af6c.png)

左側はスケルトンから来る各ジョイントのキャプチャウェイトを示しています。
右側は、左側のメッシュのテトラヘドラライズ（四面体化）されたバージョンを示しています。

これをどのように使うのかというと、右側の出力からはRig Poseを中継、その他をJoint Deformに入れ込みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/d4017b9d-52fe-09bc-9aee-163dadca7465.png)

Rig Poseを選択してEnterを押し、ハンドルを選択して回転させます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/cf8fb625-e4d6-dadc-6c0c-353da9c570b7.png)

もう一度Joint Deformの結果を見てみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/1df57ae2-1463-df2a-5266-d15486b24b5c.png)


これがJoint Capture Biharmonicの効果です。
ジオメトリとスケルトンを適用することで、様々なジョイントを調整できます。

## テトラヘドラル（四面体）メッシュの生成

その仕組みは、入力ジオメトリを取得し、
四面体メッシュに変換することです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/365501e5-d359-5791-5e18-637152ea8e5b.png)

四面体メッシュとは、内部のストラットと内部のジオメトリが存在します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/f0f18fa3-19ea-fdbc-966c-38a6f18223ec.png)

これにより、体積を保持しながら変形が可能になります。
Joint Capture Biharmonicの設定を見てみましょう、これらは四面体メッシュを生成するためのものです。ほとんどの場合、Adaptiveのままにしておくことができますが、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/822bf643-a550-ebd0-f0ed-58b730497ffc.png)

多くの場合、Uniformに変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/374abe25-5a22-34b2-52b9-2aea72e96ba9.png)

Uniformは、これらの三角形のそれぞれが同じサイズになるようにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/337c2ac6-a3fe-f111-6890-ff9f9eb8665c.png)


Adaptiveの場合、シャープなエッジがある場所では、より多くの三角形を作成しようとします。
これはこれで問題ないのですが、メッシュが複雑な場合は、その領域で速度が低下することがよくあります。
そのため、Uniformに切り替える必要があります。

Uniformの設定ではUniform Scale調整（四面体の最小サイズ）や最大サイズの設定が可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/59a00422-774c-a9a4-f6a9-e77ff0a2bbbd.png)

その他の設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/24f7852d-00d6-65f4-b357-732a2940c25c.png)

Exactは、正確な三角形のサイズを与えてくれます。
Embedは入力ジオメトリにおおよそ一致させます。例えば平らなオブジェクト（Grid）などを四面体にする際に便利です。



## リサンプリングとスケルトンの解像度

Ted MethodをAdaptiveに戻して、下の他のオプションを見てみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/513c8c28-8cc4-8338-4263-6f696c65e9b4.png)

このリサンプリングは、入力されるスケルトンのためのものです。
これにより、入力されるスケルトンの解像度が上がり、各ジョイントのウェイトがより良くなります。

## Joint Capture Paintによるウェイトの調整

Joint Capture Biharmonicを実行した後に、ジョイントのウェイトをどのように調整できるかを見ていきます。

図中の、ここにはソフトなBend（曲がり）があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/6cd52cdf-16ff-dbac-a6e3-0567f2d10878.png)

これはJoint Capture Biharmonicから出てくるジョイントのウェイトに依存しています。
そこでウェイトの調整に利用するのがJoint Capture Paintノードです。

ここに差し込みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/eb176f1e-f958-fc71-bd25-2dd24024c65d.png)


このノードでは、特定のジョイントをペイントすることができます。
Target Jointでpoint_0を選択するとその箇所のウェイトが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/3b5c1167-491e-bbaa-f08d-0dd2e9106c05.png)

point_1を選ぶと中央のエリアに最も影響を与えているウェイトが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/446eea45-18f6-6233-42aa-b4a513452ca7.png)


スムージングしている部分が、これらのソフトな曲がりの原因となっています。
ペイントして強いウェイト（赤色を増）にすると、Joint Deformに戻ったときに、より鋭い曲がり方になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/69d55d60-f16d-394e-88d3-3566aa42bb6a.png)


## Blend Factorによるキャプチャのブレンド

先程の手順で非常に鋭く曲がる結果となりました。
例えばそれが私たちの望むものではないとしましょう。
これを修正する手立てがあります。

ここでもう一度Joint Capture Biharmonicの出番です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/f7b15fa6-01ae-50b9-7790-fb4207fa4094.png)


このノード内で最初のJoint Capture Biharmonicと同じ計算をやり直します。
しかし、実際にここで注目すべきはBlend Factorです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/b8118d1b-3a7a-596b-9106-507ca86933aa.png)

このBlend Factorを使うと、既存のキャプチャと、このノードで生成されたキャプチャ、２つのウェイトを利用して好きなようにブレンドすることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/c422d29d-3810-a0c6-17eb-313428d3ecd8.png)


## Scale Attributeによる四面体の解像度調整

Scale Attributeは入力ジオメトリのAttributeに基づいて、四面体の解像度を調整することができます。
Attribute Wrangleを追加し以下の内容を記述します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/d5820e34-f085-a80b-3a70-1acd9a625c07.png)

```c
@targetscale = v@P.y;
```


そしてJoint Capture BiharmonicにてScale Attributesを有効にすると、下は高解像度、上は低解像度になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/eb5a20f6-8b2a-6962-5b3e-dac88bde5eea.png)


このようにして、生成される四面体メッシュをさらに制御することができます。

## プロシージャルな特性

Houdiniのリグシステムで素晴らしいのは、すべてがプロシージャルだということです。
スケルトンに戻って、（modifyで）途中にジョイントを追加しても、破綻せずに機能します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/8c80d39f-685a-6892-dddb-65433110a2c4.png)

※スケルトンの分割はShift + Ctrl + 左Clickです。
※うまく動作しない場合は、Blend Factorの値が上書きされている可能性があります


## そのほかの変わった使い方

例えば、Rubber Toyを作成し、IsoOffset（SamplingDiv:100）→Scatter（TotalCount:10）→Skeltonをつなぎます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/0bb3889e-0986-49f1-2670-a93e04a67bb8.png)

Rig Poseを移動させるとランダムな変形に使用することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/81edf910-264d-7fda-314d-161a7d359c1c.png)

つまりスケルトンをランダムなポイントで代用できます。
さらにこのポイントに対してAttribute Noiseを使うこともできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/4989b011-7597-0b60-ea6d-37045905c9a3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/f23717cf-94fb-5950-409f-c9f0f3432bec.png)


このようなとても奇妙な動きをつけることができます。

![Move2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/1b02fc47-00d5-c199-a6ad-ab8bb1c75475.gif)


# サンプルファイル

ラバートイの例のようにサンプリングしたポイントをノイズアニメーションで適用し、スケルトン変換したサンプルです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/3ef8349e-6029-3852-b38c-eb7b33cfdc2f.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/4e844719-d59d-cf4e-25fa-d4dd8f0db586.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/b2cf5ac5-1376-3f75-36e3-5edbafd53be4.png)


# おまけ：シワの表現　Wrinkle

Houdini20.5でWrinkleDeformerが追加されました。
Joint Capture Biharmonicノードの後ろにつなげるだけで簡単にシワの表現をすることができます。
WrinkleDeformerノードの前にポリゴン数を増やすためのSubdivideノードを挟む必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/17dd9dfe-a1d1-036d-e26f-b56a1a16cae5.png)

![200R.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/4a46958b-6499-5c36-7eca-6feedb6cba93.gif)


ちょっと怖い

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/600fa233-2b64-9a90-bdef-d309094ccf24.png)

ホラー表現でも使えそうです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/aff66904-61a9-f751-ed43-2ff99f05fdbd.png)