APEX Autorig Component 機能一覧


# はじめに

前回記事[APEX超入門：Houdiniの新しいキャラクターリギング](https://qiita.com/jyouryuusui/items/e897a239921f4bf9a6cd)では、KineFXとAPEXがどう違うのか、とりあえずAPEXを触ってみよう！と、はじめの一歩を解説しました。  
より踏み込んだAPEXの深堀りについては、yskzfjt さんが[KineFX/APEXをめぐる混乱を個人的に整理した記録](https://qiita.com/yskzfjt/items/4a752500db290ade1fdf)という素晴らしい記事を公開いただいているので、そちらをぜひ御覧ください！  
じゃあ今回の記事は何を書くのかですが、APEXはなんとなくわかった...じゃあAPEXでリグは実際どう使うの？というところにフォーカスして解説していきます。

# APEX Autorig Componentノード

[APEXAutorigComponentのヘルプ](https://www.sidefx.com/docs/houdini/nodes/sop/apex--autorigcomponent.html)  
APEXAutorigComponentは名前の通り”コンポーネント”ということで、モジュラーリギングのための機能がまとまっており、ブロックのように繋げることが可能です。
しかし名前だけ見て「あぁこれができるんだな」とイメージはできても、大前提となるセットアップ（skelパッキング前のnameやtagsなどの準備）が多く、何で動かないんだ！となりがちです。  

そこでコンポーネントの内容を小さいサンプルと共に網羅的に見れるAPEX Autorig Componentの各コンポーネント機能の紹介記事を目指して書いていきます。
 
実行環境はHoudini20.5.378です。繰り返しになりますが、APEXはBETA版ですので、今後以下の内容は変更される可能性があります。


## APEX Autorig Componentジオメトリノードhelp 記載内容

ヘルプの内容を確認すると以下の概要があります。  

APEXリグにリグコンポーネントをプロシージャルに追加します。  

このノードは、リグコンポーネントを使用して、APEXキャラクター（APEXリグ）をプロシージャルに拡張します。リグコンポーネントは、Houdiniに同梱されているプリビルドコンポーネント、または異なるリグで再利用するために独自に作成したコンポーネントのいずれかです。

注釈：  
- プリビルドコンポーネント：SideFXが用意したものです。fktransform　multiik　など後ほど紹介します  
- 異なるリグで再利用するために独自に作成したコンポーネント：言葉としてわかりにくいですが、自分でAPEXのコンポーネントを作ってもいいよ♪　ということです。普通はやらないです  

AMATERASさんの[APEX解体新書](https://qiita.com/amateras/items/e576dcb144390407b74b#%E3%82%B9%E3%83%86%E3%83%83%E3%83%973-2b)にも記載されていますが、改めてこのノードの入出力を見てみましょう



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/0b24c9f9-555e-bd9c-324c-94373bd5ff03.png)

画像 AutorigComponentノードの入出力

#### 入力
- CharacterStream  
  - 変更する APEXキャラクタージオメトリ 
  - 階層を持ったPackedPrimitive(.shp .skel .rigなど)
- ComponentScript  
  - コンポーネントで呼び出す APEX グラフを含むジオメトリ
  - ジオメトリという皮を被った「任意の仕組みを追加してリグを更新するグラフ」
  - コンポーネントパラメータのパラメータレイアウトへの変更は、parmoptions Detail Attributeにメタデータとして保存されます。

#### 出力
- CharacterStream  
  - 変更された APEXキャラクタージオメトリ 
- ComponentScript  
  - 呼び出されたコンポーネントの APEXグラフ。コンポーネントのパラメータ・レイアウトの基本情報を含むメタデータ（parmoptions Detail Attributeに格納）を含みます。配線上の利便性のために提供されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/a673aa0c-841f-6585-ac94-d2966c372569.png)


図　parmoptions (Detail Attribute)　ヘルプ付きjsonフォーマットとして出力される　

基本的にはキャラクターストリームしか使いません。



## ComponentScriptとは

第2入力と第2出力は何なの？というと、基本的には使いません。これは（実際に使うリグ用の）APEXグラフ自体を作るAPEXグラフ（Component用のAPEXグラフをつくる仕組みとしてのAPEXグラフ）を独自に作成して入力するとき、確認するときに利用します。APEXグラフ自体を作るAPEXグラフってなんやねん！？と思われるかと思います。イメージとしてはPythonスクリプトで上流の条件に応じてPythonコードのテキストファイルを動的に作っているようなかんじです。←というよりそういう動きです 

どこで使うのかですが、例えば入力にSecondInputを選択したときや、APEX ScriptSOPでデコンパイルして実際のAPEXグラフのコードを出力して確認・改造したいときなどに利用します。第2入力に差し込んでないときもSideFXが用意したプリビルドコンポーネントは内蔵されています。これは通常は（APEXグラフを埋め込まれた）bgeoファイルとして読み込みますが、APEXScriptSOP内のComponentScriptで呼び出すことも可能で、出力されるAPEXグラフの結果は同じです。そういった意味ではAutorigComponent内では常に２つのAPEXグラフが存在しているといってもいいかもしれません。ただ、そう考えだすと頭が混乱するので、上流のAPEXグラフを解釈して必要なAPEX機能を追加してくれる黒子がこっそり存在しているという理解でよいかと思います。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/5f77138e-5aa0-02dc-f87a-f6f6a757a973.png)

図：２つのAPEX　右のAPEXグラフ(もしくはScript)が左のAPEXグラフを作ってくれる



## 用意されている各コンポーネント機能：プリビルドコンポーネント

コンポーネントは自分で作ることもできますが、よく使うコンポーネントはSideFXが事前に用意してくれています。  
注意点として、このコンポーネントは今もアップデートされており今後も増加する（もしくは更新される）可能性があります。


たとえばHoudini20のコンポーネントは７個程度でしたが、Houdini20.5のコンポーネントは１９個に増えています。  


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/70b18dcc-70c0-0348-e37a-f5899a324fbf.png)

画像：Houdini20のコンポーネント一覧  

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/29415f3f-c257-1c7a-07b0-e098b959a0c0.png)


画像：Houdini20.5のコンポーネント一覧  

その中には「これって何するコンポーネントなの？」というものもあるので、順を追って基本的なノードを紹介していきたいと思います。


# APEXグラフのAttribute

事前知識として。読み飛ばして問題ありません。
[参照](https://www.sidefx.com/docs/houdini/character/kinefx/graphmetadata.html)

|名前|クラス|型|説明|
|:----|:----|:----|:----|
|name|point|string|ノードの名前|
|callback|point|string|ノードのコールバック名（ノードタイプ）|
|Cd|point|float|ノードの色|
|portname|vertex|string|ポートの名前|
|portalias|vertex|string|サブポート名、または名前が変更されたポート名|
|portindex|vertex|int|ポートのインデックス番号|
|parms|point|dict|ポートのデフォルト値を含む辞書|
|tags|point|string[]|グラフノードの識別子として使用される文字列の配列。タグは、graph::FindNodes などのグラフノード内で、APEX パスパターン関数 %tag() を使用してマッチングできます|
|properties|point|dict|ノードに関する追加のメタデータを含む辞書。プロパティは、graph::FindNodes などのグラフノード内で、APEX パスパターン関数 %properties() を使用してマッチングできます|

# コンポーネント概要一覧

### 1. fktransform - FK 基本的なリグの構築

![FK1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/809ceb23-f1f0-80c6-e2d8-33ba2db87b79.gif)

- ガイドスケルトンを使用してAPEXグラフノード階層を作成する基本的なコンポーネント
- リグ構築の最初のステップとして使用される　Base.rig
- 主な機能：
  - TransformObjectノードの作成
  - 回転順序の設定
  - スケール継承の制御

### 2. bonedeform - スキンメッシュ変形

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/a2e87223-27ac-26e4-2af2-f68c2e5e28a9.png)

- リグにBoneDeformノードを追加
- スケルトンによるメッシュ変形
- キャプチャウェイトを持つジオメトリの変形を制御する

### 3. configurecontrols - コントロールの外観設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/ba238bd4-a125-479b-b2ea-1251e3d21bb5.png)

- APEXリグのコントロールの外観と動作を設定
- ガイドコントロールの使用
- コントロールシェイプの設定と管理

### 4. spine - 背骨

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/663b933a-7df4-2872-b932-19c717a7c705.png)

- キャラクターの背骨を設定
- スプライン制御による柔軟な変形
- 主な機能：
  - カーブオーダーの制御
  - タンジェント方向の設定
  - 階層的なコントロール構造

### 5. multiik - 複数関節のIK
- 3ノード以上のIKチェーン設定
- 複数のIKチェーンの同時設定
- IKソルバーの詳細な制御オプション

### 6. ikfkblend - IK/FKブレンド

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/5528d964-0cd8-f7a1-cfcc-41efb342a111.png)

- IKチェーンとFKチェーン間のローカルブレンド
- シームレスなIK/FK切り替え
- アブストラクト(抽象)コントロールによるブレンド制御

### 7. smoothik - スムーズな2ボーンIKソルバー
- ２つのボーンのインバースキネマティクスを適用する

### 8. fbik - フルボディIK
- リグ全体に対するIKシステム
- ボディ全体の姿勢制御
- ウェイト設定システム

### 9. blendshape - 表情制御など

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/b73e20c1-019b-f434-3760-6e2598a40640.png)

- ブレンドシェイプによる表情やモーフィング制御
- コントロール付きのブレンドシェイプ管理
- 複数のブレンドシェイプの組み合わせ

### 10. wrinkledeform - しわ表現など
- キャラクターの皮膚のしわ表現
- ポーズに応じた動的なしわ生成
- コライダーによる干渉制御

### 11. groomdeform - ヘア/ファー/フェザー制御など
- ヘア、ファー、フェザーのグルーミング制御
- スキンシェイプへのアタッチメント
- 動的な毛髪表現


### 12. deltamush - メッシュスムージング
- リグの変形後のメッシュスムージング
- アーティファクトの軽減
- 変形品質の向上

### 13. lookat - 視線制御

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/96937c25-f38e-94b8-9466-05d152bcb244.png)

- ドライブされたノードにlookatコンストレイントを作成
- 視線やオブジェクトの方向制御
- 複数のlookatコンストレイントの管理

### 14. mappedconstraints - コンストレイント管理
- マッピングプロパティに基づくノード間のコンストレイント
- 複数ノード間の関係性管理
- 自動的なコンストレイント設定

### 15. transformdriver - 変形制御
- TransformObjectノードの作成・親子関係・コンストレイントの設定
- 複数の変形の組み合わせ管理など

### 16. poseblend - ポーズブレンド
- 複数のポーズ間のブレンド制御
- ポーズライブラリの管理
- ブレンドシェイプとの連携

### 17. spline - カーブ
- カーブでの変形

### 18. reversefoot - 足のメカニズム

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/43749ab0-3a63-5541-45ad-dfda0c4accb0.png)

- ヒール、トウ、ティルトコントロールを備えたリバースフット
- 歩行アニメーション用の高度な足のコントロール
- 地面との接地を考慮した設計

### 19. findorcreaterig - APEXグラフ作成
- 既存のAPEXリグ（APEXグラフ）を探し、なければ新規作成


# コンポーネント概要詳細

## fktransform - FK 基本的なリグの構築

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/3876f985-e42b-3a2b-6363-7be3cff9a2fa.png)

**概要**  

fktransformは、既存のガイドスケルトン（KineFXジョイント）をベースに、APEX Graph上でTransformObjectノードを自動生成するコンポーネントです。  
FK（Forward Kinematics）での回転制御を主体とした基本的リグを素早く構築できます 

![fk2-1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/2057e2b6-713c-90c2-510b-d66ad8b58c6d.gif)

形状（shape）、スケール（scale）の設定や、回転順序（rord）、トランスフォーム順序（xord）、タグ（tags）などを一元管理できます。たとえばデフォルトでは、Controlsタブ内のrpromotegroupのみ全て有効のワイルドカード（*）指定がされています。これによって回転のみのギズモハンドルのコントローラーを表示しています。移動やスケールも行いたい場合は”t”promotegroup、”s”promotegroupに必要なグループを指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/f946ae31-d006-3bc8-cec1-08a9c350458d.png)


**サンプル例**  

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/bb51a228-5ab0-d893-be54-6ec2d6543a56.png)


最も単純なFK、しかしこれだけだとAPEXでやる意味は全然ありません。ただ曲げたいだけならRigPoseノードのほうがシンプルではあります。
しかし、複雑なリグシステムをモジュールとしてFK・IKと一直線に連ねていくことが出来るのがAPEXのすごいところです。
Base.rigとなるAPEXグラフを作成してくれるので、一番最初にセットアップ用として配置されることが多いです。


20.5からはキャラクターのガイドスケルトンGuides.skelを、fktransformでTransformObjectに変換し、肩・肘・手首など各関節にFKコントロールを付与することが可能です。
もしもGuides.skelを付与するのが面倒であればsourceの対象をBase.skelとしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/cac18c8f-836e-bb07-4fc3-ded30e1a31ba.png)

画像  tagsがなくても一応動く

**どのパラメータを利用するか**  
- guidesource：ガイドに使うスケルトンを指定 
- prefix / suffix：生成されるTransformObject名に付与する接頭・接尾辞  
- Sourceタブ内　promotegroup　移動回転スケール の制限
- Controlsタブ内　source：実際にコントローラーで動かすスケルトン 
- Shapeタブ内　shape / scale：コントロール形状とスケール  

**APEXグラフ　プログラム解説**  
- ガイドスケルトンのジョイントを走査して、それぞれに対応するTransformObjectノードを作成  
- プロパティ辞書にmapping:<skeleton>を追記し、後続の「ikfkblend」等で参照できるようになっている  
- 必要に応じてpttransformを追加接続し、pttransformnameで指定した名称のskel::SetPointTransformsノードへ各TransformObjectのxformを出力  



## bonedeform - スキンメッシュ変形

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/a2e87223-27ac-26e4-2af2-f68c2e5e28a9.png)


**概要**  
bonedeformは、KineFXのsop::bonedeformノードをリグ内に追加し、アニメーションされたスケルトンとメッシュを連動させるコンポーネントです。  
- キャプチャウェイト（capture weights）に基づき、メッシュをボーンアニメーションに追従させます 
- リグ全体における「スキンメッシュ」のデフォーメーション部分を担う機能です  
- restポーズや参照スケルトンを指定し、promoterestgeo等で外部から差し替えられます  

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/6dd70f13-72e9-82e4-3dff-5b5cc9d7aacb.png)

**サンプル例**  

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/d3617d72-3b68-a609-dd8a-e36d3a5fe60a.png)

スキンジオメトリをSweepで作成しBase.shpをパックフォルダーに流入、Base.skelからJointCaptureBiharmonic SOPでウェイト自動設定 → bonedeformに流すという流れです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/0303388b-bab4-80b3-3b9e-fbf9e3e9d84d.png)

図　パックフォルダにウェイト付きの.shpが存在していることが大前提です


**どのパラメータを利用するか**  
- prefix：sop::bonedeformノードにつける接頭辞  
- animatedskeleton：アニメ済みのスケルトン（SetPointTransforms など）  
- restgeo / restskeleton：レスト状態のメッシュとスケルトン  
- outputgeo：最終出力名  

**APEXグラフ　プログラム解説**  
- FindNodeでsop::bonedeform相当ノードが既にあるか確認 → なければ追加  
- Propertiesへrestgeo, restskeleton, animatedskeletonの参照をセットし、geo[in] → bonedeform → geo[out]というグラフ構造を作る  
- prefixをノード名に反映し、promoterestgeo等がオンの場合、APEXノードの入力ポート/出力ポートにジオメトリをマップ  


## configurecontrols - コントロールの外観設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/ba238bd4-a125-479b-b2ea-1251e3d21bb5.png)


**概要**  
configurecontrolsは、リグ内に存在する複数のコントロールを後からまとめて外観・挙動の設定を変えるためのコンポーネントです。  
- すでに生成済みのFKやIKコントロールの色変更、形状変更、リミット設定などを一括で行う  
- useguidesを使うことでガイドスケルトンとコントロールの形状情報を同期して上書きする方法もある  

**サンプル例**  
リグ全体のコントロールをconfigurecontrolsで参照し、すべてをcircle_wires形状にしたり、一部のローカル軸をロックしたりする  

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/5f941d8b-a582-ff81-9f15-eecdff26caa9.png)

**どのパラメータを利用するか**  
- useguides：ガイド情報を利用するか  
- guidesource：参照するガイドスケルトン  
- skincontrolshape：コントロール形状の種類など （実際の実装では、内部でSetPointAttribValue等を駆使してコントロールのCdや形状メタデータを書き換えるケースがある）  

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/12728705-2bb9-8f5c-f72c-f2d83753679f.png)

コントロールシェイプの形状について

configurecontrolsでも設定できますし、他のコンポーネントのShapeタブでも設定可能です。また、APEX ConfigureControlsノードでも設定が可能です。
シェイプ名は忘れがちなので、APEX ConfigureControlsノードで設定するほうが楽かもしれません。色や細かい設定も可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/08dfcabb-51f3-3526-afd6-7f483dc5d0ea.png)


|画像|形状名|説明|
|:----|:----|:----|
|![3dcross.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/a2891e9f-0077-a286-4471-a09ce7ca88c6.png)|3dcross|3次元の十字形状|
|![ball.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/064454e3-7096-366c-6434-3386e42ea178.png)|ball|球体|
|![ball_wires.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/84495ced-c398-d270-90d6-fa811bb6d24f.png)|ball_wires|球体のワイヤー|
|![ballline_wires.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/ef3d593f-dd2e-3484-b899-d4bc90ec22d1.png)|ballline_wires|球体とラインを組み合わせたワイヤー|
|![blob.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/54ee5bc7-e3e7-e275-a6f3-ecccb5c2c91a.png)|blob|球体と十字|
|![box.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/1fc98738-a492-b229-ec58-d538078afa67.png)|box|ボックス|
|![box_wires.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/1b22b072-5979-dd3c-b077-ca548cb73c2d.png)|box_wires|ボックスのワイヤー|
|![boxcross_wires.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/9fdb204d-371b-b0df-4c3f-d0099189e248.png)|boxcross_wires|ボックスと十字を組み合わせたワイヤー|
|![boxplanes_wires.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/3ad77931-53e1-d702-67c7-d52f1070685d.png)|boxplanes_wires|ボックスと平面を組み合わせたワイヤー|
|![circle_plane.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/d88c8d29-82e7-c5c7-fe02-e7f8c637a103.png)|circle_plane|円形の平面|
|![circle_wires.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/007bf4f8-7cfc-71e7-2ef6-668bf86416b5.png)|circle_wires|円のワイヤー|
|![circleplanes_wires.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/12ad03eb-a765-2ef5-82cf-7b9b6deb2801.png)|circleplanes_wires|円と平面を組み合わせたワイヤー|
|![cone.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/8de836fd-ca37-1a60-34ef-1a19fe0e0cf6.png)|cone|円錐|
|![cross.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/2ca8ea0c-10b6-14a7-2645-0c0b3f97ad0e.png)|cross|十字形状|
|![cross_wires.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/11a2a82b-7cf7-785c-7796-6e5ab4a289bf.png)|cross_wires|十字形状のワイヤー|
|![crossplanes_wires.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/2a4857ed-e632-069d-fd2a-d7e15a28b66c.png)|crossplanes_wires|十字形状と平面を組み合わせたワイヤー|
|![ctrl_shape.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/b9cdc704-a82c-6694-7a27-0aeb290e32a7.png)|ctrl_shape|コントロールシェイプ|
|![lineb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/dcd7a9c6-b9fe-ee82-d06c-6b307994940a.png)|lineb|ラインと球体|
|![lineblob.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/5ab595e8-a71b-48ee-c3e7-a3cc8c76bf34.png)|lineblob|ラインと球体２|
|![plane_wires.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/670bb628-89c4-c292-cd54-305a5b7b2cde.png)|plane_wires|平面状のワイヤー|
|![planecross_wires.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/a7f96340-7e60-ae86-192b-e60c140bbb96.png)|planecross_wires|平面と十字を組み合わせたワイヤー|
|![planes_wires.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/3f2135f8-f336-4e41-bac5-8ad032f6e385.png)|planes_wires|複数の平面を組み合わせたワイヤー|
|![rubber.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/724c4fc0-4bc9-2ed7-982a-5ecf58f4949a.png)|rubber|ラバートイ（なんであるんだろう）|
|![star.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/414174b3-4de5-03d0-efd0-5126df4fa0ca.png)|star|星型|
|![torus.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/d7879653-aebf-6270-561f-a9c4fb27fdbe.png)|torus|トーラス|
|![torusb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/4b63ade8-2446-0956-e289-69be775c8f17.png)|torusb|球体とトーラス|




[ここ](https://www.sidefx.com/docs/houdini/nodes/sop/apex--configurecontrols.html)にもアイコン画像詳細があります

**APEXグラフ　プログラム解説**  
- Graph内でControlsFromGuides等で生成されたノードに対し、UpdateNodeTagsやUpdateControlsなどのAPIを使って形状変更  
- useguidesがオンの場合、ガイドスケルトンのアトリビュートを参照し、一括で色や形状を再設定できるロジックが組まれている  


## spine - 背骨

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/663b933a-7df4-2872-b932-19c717a7c705.png)

**概要**  
spineは、背骨に相当する複数のジョイントをスプライン制御で制御するコンポーネントです。  
- 背骨が湾曲する動き、上下方向の伸縮などを少数のコントロールで表現 
- AttribAdjustArrayではspineのtagsをセットしておく 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/8186d82b-9a6a-95d3-89a3-9a25a7821eb9.png)


**サンプル例**  

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/0adc5ecb-2154-7ac2-f4ac-9eac4ba4fa12.png)

キャラクターの背骨ジョイントをspineで扱い、コントロールを置いて全体を曲げる例  

スケルトンのnameには以下の設定をしておく（例

```c
if(@ptnum==0){
@name="pelvis";
}else {
@name="spine_0"+itoa(@ptnum);
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/1568fd3e-e525-3a5c-f180-7cb426d2327e.png)


**どのパラメータを利用するか**  
- Drivenタブ　drivens：スプラインで動かすTransformObject群  
- Controlsタブ　driverparent：全コントロールの親。空ならそれぞれ自動で階層を形成  

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/6b622366-e72a-c283-eac5-37ecc7aec92b.png)


**APEXグラフ　プログラム解説**  
- 複数ジョイントを受け取り、BezierやNURBSなどのカーブを内部的に生成  
- カーブの各CVをコントロールノードに対応させ、Move/Rotateで背骨を変形  
- driverparentoverrideなどが指定されていれば、作成するコントロールの親子付けを上書きするロジック  



## multiik - 複数関節のIKシステム

**概要**  
multiikは、複数ノードのIKチェーンや複数チェーンを一度に作るコンポーネントです。  
- 長い骨チェーン（4ジョイント以上）や、左右の脚をタグL_leg R_legで分けてIK化するなど  
- ポールベクターやターゲットなどもまとめて生成  

IKを利用する場合は、AttributeAjustArrayノードでのtag付けが非常に重要です。
タグの簡単な付け方はAttributeAjustArrayノード有効時にタグを付けたいジョイントを選択し「a」のショートカットをビューポート上で行います。
そうすることで、タグを簡単に指定することが可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/b124eadf-bacd-49ff-d66a-e7ec98538a3c.png)

**どのパラメータを利用するか**  
- segments：タグ指定して複数IKを一度に作る  
- prefix / suffix, name：コントロールの名称  
- usetwist, usegoalrot, resiststraight, stretch, dampen, trackingthresholdなど  
- tagroot, tagpolevec, tagtarget：生成するコントロールノードに付与するタグ群  
- rootparent, tipparent, povectorparent：それぞれの親階層指定  

**APEXグラフ　プログラム解説**  
- 指定されたタグ（segment）でノードをグルーピング → IKソルバーを追加し、polevectorやgoalノードを作成  
- root, tip, polevecそれぞれにTransformObjectノードを割り当てて、MultiIKSolver相当のノードに接続  
- levelroot/leveltip等のboolパラメータで、各コントロールのローカル軸をワールドアライメントにするスクリプト分岐  



## ikfkblend - IK/FKブレンド

**概要**  
ikfkblendは、IKとFKの両方が存在するリグで、それらをローカルブレンド（0＝FK、1＝IKなど）する仕組みを構築します。  
- アニメーション中にスムーズにIK⇔FKを切り替えられる  
- 未生成のFKノードがあれば自動追加して対応付け  

**どのパラメータを利用するか**  
- guidesource：FK／IKノードを作る際の基準スケルトン  
- mapping：mapping:Base.skelなど、FKとIKが同じジョイントを指していると判断するため  
- segments：特定のタグ（腕・脚）ごとにIKFKブレンドを構築  
- iknodes / fknodes：それぞれのノードパターン  
- fk_prefix / fk_suffix：FKノード未存在時の自動生成用  
- parent：抽象コントロールの親ノード  
- abstractpos, abstractscale：抽象コントロール（ブレンド用スライダー）の位置とスケール  

**APEXグラフ　プログラム解説**  
- FindNodesでIKノード群とFKノード群を探索 → 同じmapping辞書キーを持つノード同士を対応付け  
- TransformBlendLocalやTransformBlendSubnetノードなどを追加し、blendパラメータを抽象コントロールに紐付け  
- IK 0.0 → FK 1.0 等の補間ロジックをGraph内で構築  


## SmoothIK - スムーズな2ボーンIKソルバー



**役割と概要**

SmoothIKは、2ボーンIKに「スムージング機能」を加えたソルバー。通常の2ボーンIKが肘や膝でガクッと角度が変わってしまうような挙動を抑え、より柔らかく曲げるのが狙い。メインの回転軸（main_axis）やストレッチ有無、減衰パラメータ（falloff）などを細かく設定することで、手足の動きを自然かつ安定した形に仕上げられます。

**主なパラメータ**

smooth：   スムージングをオン/オフするフラグ。オフなら通常のTwoBoneIKと同等の挙動  
stretch_falloff：   ストレッチ具合を緩和するための減衰値。伸びきる瞬間のパキッとした動きを抑制  
main_axis / stretch：   メインの回転軸、ストレッチ可否の設定。どの方向にどれだけ伸ばせるかを指定  
falloff：   IK解の到達精度や減衰度合いを決め、より自然な伸び縮みを補助  

大事なIKなのにHoudiniヘルプにドキュメントが無い



## fbik - フルボディIK

**概要**  
fbik（フルボディIK）は、フルボディIKソルバーをリグに組み込み、手足を動かすと体幹も連動して自然に姿勢を保つようにするコンポーネントです。  


**どのパラメータを利用するか**  
- name：FBIKサブネット名  
- guidesource：コントロール作成の参照スケルトン  
- iterations / tolerance / damping：ソルバー設定  
- driven / drivers：ソルバー対象ノードとドライバーとなるノード（足先、手首、首など）  
- prefix, suffix, shape, color, scale  

**APEXグラフ　プログラム解説**  
- PhysIKSolverノードを生成し、FindOrAddNode("SetTargets")などを使って各ジョイントをターゲット化  
- weight属性を参照し、IK影響度を調整可能に  
- スケルトンのSetPointTransforms → solver → 全身IK出力 → SkeletonUpdateGeoなどへ接続  


## blendshape - 表情制御など

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/b73e20c1-019b-f434-3760-6e2598a40640.png)


**概要**  
blendshapeは、メッシュの複数ターゲット形状をブレンドして変形させるためのコンポーネントです。顔の表情や筋肉の膨らみなど、いわゆるモーフターゲットをコントロールする仕組みを実装できます。  

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/a7c40fc4-fce0-7f9f-6604-09308f5be711.png)

**サンプル例**  

今年のアドカレでくろさわさんの記事でも登場しています。こちらを[参照](https://note.com/thesaurus/n/nc9d1f85562d0)
セットアップはこれとほぼ同じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/0393c481-d131-65d4-07be-47289f45b00a.png)

**どのパラメータを利用するか**  
- prefix：blendshapeサブネットの名前に付与  
- guidesource：コントロールの参照ガイド  
- baseshape / baseskeleton：キャプチャ済みのベースメッシュとスケルトン  
- bonedeform：接続先のsop::bonedeformノード指定  
- controloffset：複数コントロールを親階層から少しずつずらす量  
- parentcustom：各blendshapeコントロールの親を個別設定  

**APEXグラフ　プログラム解説**  
- メッシュ形状をsop::kinefx::characterblendshapescoreなどで解析 → AbstractControlを複数生成  
- 各ターゲットのウェイトをパラメータとしてPromoteし、APEX Controls からアニメ可能にする  
- 最終的にsop::bonedeform→blendshapeの流れで合成変形される  



## wrinkledeform

**概要**  
wrinkledeformは、キャラクターの皮膚にしわ表現を加えるためのコンポーネントです。Vellumを利用したシミュレーションや専用のWrinkleSolverを組み込み、肘・膝等の曲げに応じてリアルなしわを生成できます。  


**どのパラメータを利用するか**  
- folderprefix：Wrinkle系要素を保存するキャラクターフォルダの接頭辞  
- bindcolliders：コリジョン使用の有無  
- portpattern：リグ内でDeform後のメッシュを出力しているノードを探すためのパターン  
- nodeprefix：サブネット名  

**APEXグラフ　プログラム解説**  
- WrinkleSolverやWrinkleColliderノードをTemplateでマージ → graph.Merge(wrinkleSopGraph)  
- Deformed meshを探すためにFindNodeでsop::bonedeformや該当パターンを検索 → 見つかればWrinkleDeformerのGeoに接続  
- コリジョン用ShapesをBindするかどうかをbindcollidersで分岐し、WrinkleConstraintsやHeightfieldをGraphに混ぜる  


## groomdeform

**概要**  
groomdeformは、毛髪・羽根・ファーなどのGroomをアニメ済みスキンに追従させるコンポーネントです。  
basegeoname（スキン）とgroomname（毛髪カーブ）を関連付け、動きに追従するようDeform  
羽根やフェザーの場合はsurfaces（groomsurfaces）も追加  

羽根の場合、groomsurfacesnameでフェザーポリゴンを指定し、羽根本体の揺れと連動  など

**どのパラメータを利用するか**  
- basegeoname：メインスキン  
- groomname, groomsurfacesname：カーブやポリゴンのGroom形状  
- groomskelname：グルーム用のスケルトン  
- nodeprefix：内部ノードの名前  
- outputcurves, outputsurfaces：最終的に出力する要素の切り替え  
- skinnormalattrib, skintangentattrib：アタッチ時の方向計算に使う法線や接線  

**APEXグラフ　プログラム解説**  
- GuideDeformやGroomAttachに相当するノードを追加し、SetPointTransformsからのスキン変形に合わせてカーブやサーフェースを移動  
- Valueノードなどを使ってgroomカーブを受け取り、WrinkleDeformer等と併用されるシーンもある  
- outputcurvesやoutputsurfacesがオンの場合、Graph出力にそれぞれを繋ぐ処理  


## deltamush

**概要**  
deltamushは、ボーン変形後のメッシュをスムージングするためのdeltamush SOPノードを追加するコンポーネントです。シワや尖りを緩和して自然な頂点移動に近づけます。 

**どのパラメータを利用するか**  
- prefix：ノード名  
- bonedeform：接続先のsop::bonedeformのポート指定  
- method：ラプラシアン or コタンジェントなどの重み方式  
- iterations：反復回数  
- stepsize：1回あたりのスムージング量  

**APEXグラフ　プログラム解説**  
- FindFirstPortで指定されたbonedeform出力にsop::deltamushノードを差し込む  
- Dictionaryにiterations, stepsize, methodを設定し、UpdateNodeでsop::deltamushに伝達  
- Layout後にGraphがsop::bonedeform→deltamush→出力 という流れになる  

## lookat

**概要**  
lookatは、指定ノードをターゲット方向へ注視させるコンポーネントです。首や眼球、カメラなどを特定の目標点へ自動的に向ける仕組みを簡単にセットアップできます。  

**サンプル例**  

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/b23c8766-6e68-0595-e867-f38326cb33b1.png)

ややこしいのが、driven：回転させたいもの　に入れる内容です。ここは実際に回転を行うスケルトンのnameのAttributeを参照しています。
どれがスケルトンのnameで、どれが自動生成されるコントローラーの名前で、どれがtagsの名前なのかが混在しているのが現状の混乱の原因のように感じます。
名前のラベルか色分けしてくれると助かるのですが、、

**どのパラメータを利用するか**  
- name：lookatサブネット名  
- guidesource：ガイドからの親参照  
- driven：回転させたいもの  
- driver：中継コントロールとして生成するノード名  
- target, up：ターゲットとアップベクトルのノード名。空なら新規作成  
- useup, keepdriven, keepoffset, lookataxis, lookupaxis, shapescale, shapecolor  

**APEXグラフ　プログラム解説**  
- LookAtロジックをtransform::LookAt等で実装し、inxform(driver→driven)とlookat(target)を接続  
- keepoffsetがオンの場合、現在のオリエンテーションを初期オフセットとして保持するMatrixを計算しMultiply  
- upベクトルもルックアップとして接続し、Rollの暴れを抑制  


## mappedconstraints

**概要**  
mappedconstraintsは、mapping:Base.skel等の辞書プロパティをキーに、2つのノードが同じジョイント由来かを判定 → 一方から他方にxformを渡す制約を作るコンポーネントです。  
IKノードを別スケルトンに合わせて制約するとか、FKと別の階層を同期するときに便利  
大量のノードを一括で照合し、自動接続ができる  

**サンプル例**  
from = %tag(fk), to = %tag(bind), mapping = mapping:Guides.skel → FKノードがBindノードと同じジョイント名であれば、FKのxformをBindにコピーする  
衣装リグなど別階層を同じ骨IDで同期する際にも利用可能  

**どのパラメータを利用するか**  
- from：制約元ノード（タグやパターン）  
- to：制約先ノード（タグやパターン）  
- mapping：辞書キー（例：mapping:Base.skel）  

**APEXグラフ　プログラム解説**  
- FindNodesでfromパターンを列挙 → それぞれの辞書を読み、dict_get(mapping)を確認 → string_formatでvalue & toと組み合わせ…など  
- 一致した場合にgraph.FindAndConnectInputでxform接続  
- オフセット計算は行わず、位置をスナップする単純な拘束となる実装  


## transformdriver

**概要**  
transformdriverは、新規または既存のドライバ(TransformObject)ノードを作成し、複数のドリブンノードをまとめて制御するための親子付け・トランスフォーム制約を行うコンポーネントです。  

**どのパラメータを利用するか**  
- setups：複数のドライバ設定をDictionary Arrayで定義  
- driver, driventransforms, driverguide, driverparent, ignoreoffset, use_t, use_r, use_s, shape, scale, color, rotate, rord, xord など  
- guidesource：driverguideの参照先  
- makecontrol, promotet, promoter, promotes：コントロール化とUIプロモート  

**APEXグラフ　プログラム解説**  
- setups配列をループし、それぞれFindOrAddGuideでdriverノードを確保 → skel::FindJoint等で親階層に接続  
- driventransformsをFindNodesし、ParentBlendやConnectInputで移動回転スケールを一括制約  
- ignoreoffsetオンなら、初期行列をMultiplyしてオフセットを打ち消すロジックが入る  


## poseblend

**概要**  
poseblendは、複数のポーズ（位置・回転・スケールなど）をまとめて一元管理し、スライダーでブレンドできるようにするコンポーネントです。フェイシャルや全身ポーズライブラリを構築して、アニメーション時に好きなポーズをミックスする用途が代表的。  

**どのパラメータを利用するか**  
- nodeprefix：ノード名の接頭辞  
- folder_poses：マルチパラム。各ポーズに以下キーを設定  
  - pose_name, pose_shape, blendshape_name, ctrl_offset, ctrl_color, ctrl_parent  
- それぞれのポーズについて抽象コントロールを生成し、PoseDeltasやBlendShapeを紐付け  

**APEXグラフ　プログラム解説**  
- folder_posesをループし、ValueやAbstractControlを作成 → 各ポーズ用のトランスフォームを管理  
- Pose間のウェイトをMultiply<Matrix4>やtransform::MultiBlend<Matrix4>で合成し、対象ノードのxformに流し込む  
- blendshapeの場合はsop::blendshapesノードに対しSetBlendWeightを呼ぶ形で連携する  


### 17. spline - スプライン

**概要**  
splineコンポーネントは、**背骨や尻尾、触手のように複数ジョイントをまとめてスプライン制御**したいときに使われます。少数のコントロールで曲線を操作し、広範囲を滑らかに変形できるのが最大の特徴です。カーブのオーダーや端点の固定など、柔軟な設定が可能で、背骨とは別の任意領域にも適用できます。

- 背骨や首をさらに細かく制御したい場合  
- 尻尾や触手、ケーブル状パーツなど「連続ジョイントを少数のCVで動かす」場面  
- カーブをベースにした独自のモーションパターンを作りたい場合  

**どのパラメータを利用するか**  
- curveorder：  ベジエカーブの次数。大きいほど滑らかだが複雑。  
- segments：    タグで分割される複数のチェーンを一括処理できる。  
- custom：   デフォルトの4コントロール式ではなく、任意のドライバ数やCV配置を指定するモード。  
- pinroot / pintip：    ルートや先端の回転を拘束し、動きを安定化させる。  


## reversefoot - 足のメカニズム

**概要**  
reversefootは、キャラクターの足首〜つま先にかけての逆方向の回転チェーンを作り、踵やつま先を軸に回転させるリグを組むコンポーネントです。  
- heel, toe, tilt, rollといった独立コントロールを自動生成  

ReverseFootでは、ヒールやボール、トウといった複数のピボットをあらかじめ階層的に組み込み、一つの抽象コントロールでそれらの軸を切り替えながら回転させることができるため、歩行アニメなどで頻繁に発生する「踵を上げる→ボールで重心を支える→つま先を上げる」動作をスムーズに実現できます。

**サンプル例**  

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/43749ab0-3a63-5541-45ad-dfda0c4accb0.png)



**どのパラメータを利用するか**  
- driver：足リグ全体を操作する上位ノード（腰など）  
- segments：タグ指定で複数足を処理  
- ankle, ball, toe, ikdriven：それぞれのノードパターン  
- groundplane, heeloffset, tiltoffseta/b, toeoffset, toecontroloffsetなど  
- tilt, roll, inverttilt, invertroll  
- hidedriven：元のIKターゲット等を隠す  

**APEXグラフ　プログラム解説**  
- 足首Jointからheel → tiltA → tiltB → toeの順にヒエラルキーを再構成  
- heel_ctrl, toe_ctrlなどのGuideノードをFindOrAddGuideで追加 → SetPointAttribValueでtagsを付加  
- 抽象コントロールにもroll・tiltの計算ノードを挿入し、それらをsop::transformblend等で足元の回転に反映 

## findorcreaterig - APEXグラフ作成

**概要** 
既存のAPEXリグ（APEXグラフ）を探し、なければ新規作成するだけ



# おわりに

今回は「APEX Autorig Component ノード」に焦点を当て、各種コンポーネントの機能と概要をざっと整理しました。
もともと予定していた「APEX超入門２」は、@yskzfjt さんの記事の充実ぶりのおかげで少し形を変えてお送りする形となりましたが、その分APEXScriptをデコンパイルして解析した内容を含め、コンポーネントごとの流れを見直す機会にもなりました。

もちろん、この記事だけで APEXリグのすべてを把握するのは難しいですし、何度も触れましたがAPEXはまだBETA版です。将来的にパラメータやノード構成が大幅に変わる可能性もあります。しかし、いま存在しているコンポーネントをひととおり把握しておくだけでも、「APEXならこれが実現できそう」とイメージをふくらませるきっかけになるはずです。

今回APEXについて調べるにあたり、[MaxRoseさんの動画](https://www.sidefx.com/ja/tutorials/kinefx-rigging-with-apex/)をはじめ、AMATERASさんの[APEX解体新書](https://qiita.com/amateras/items/e576dcb144390407b74b#%E3%82%B9%E3%83%86%E3%83%83%E3%83%973-2)や[cgwiki](https://tokeru.com/cgwiki/HoudiniApex.html)、yskzfjtさんの[KineFX/APEXをめぐる混乱を個人的に整理した記録](https://qiita.com/yskzfjt/items/4a752500db290ade1fdf)、SideFX 公式の紹介動画など、多くの方々の先行情報に助けられました。

みなさんの記事に感謝するとともに、Advent Calendar に向けて毎年多彩な記事を投稿してくださるコミュニティの方々にも改めて感謝します。この記事が、ほんの少しでもお役に立てば幸いです。来年もどうぞよろしくお願いいたします。