ちょっとした覚書。
weldは同じ頂点番号の頂点を異なるactorに属する面が共有している場合に、weldはそれぞれ異なるactorに存在する2つ以上の頂点が至近距離に存在する場合に、一方のactorの頂点を他方のactorの頂点に追従させる機能である。
これによってactorがどのように変形しても、面が「繋がっている」ように見せることができる。
同一の頂点番号に対して働くので、同座標にある異なる頂点間ではweldは実現しない。
weldはactorのbend(屈伸)およびシーンファイルのbendBodies(パーツ間をなめらかに表示)が有効であるときに機能する。
actorの階層構造には依存しないが、便宜上基準となる側のactorを親、追従する側の子と称する。
weldはcr2ファイル内において、階層構造の記述の後、displayOnの次の行から
weld 《子側のactorの内部名》:《フィギュア番号》
《親側のactorの内部名》:《フィギュア番号》
という形式で記述される。
通常セットアップルーム等でフィギュアを作成した場合、このweldツリー構造はフィギュアの階層構造をコピーする形で作成される。
Poserの基本小道具の平面詳細を、グルーピングツールでグループ分けして(ついでにマテリアルも分けて)下記のようなフィギュアを作成する。
ここで、part B(内部名B)とpart C(内部名C)は、part A(内部名A)の子階層である。
partBを-Y方向に、part Cを+Z方向にそれぞれ移動させる。
子側となるpart Bとpart Cの端の面が伸びている。パート間に新たな面が作成されるわけではなく、端の共通する頂点がpart Aの位置から移動していないことがわかる。
また、part Bとpart Cの間にはweldの指定がないので、パート間が分断されていてる。
そこで、part Cがpart Bに追従するようにcr2ファイルにweld指定を追加する。
最初のフィギュアと同様にpart Bとpart Cを移動すると、part Cの左端の頂点がpart Bの位置に移動する。
さて、weldは同一の頂点番号を持つ頂点において働く機能であるので、異なる座標にある頂点には働かない。では、もともとは同一の座標であったが、後からデフォーマ等で頂点が移動した場合は頂点はどのように扱われるだろうか。
そこで、part Aのみをデフォーマ(マグネット)で変形させ、そのオブジェクトをwavefrontOBJ形式で出力し、外部ソフトにインポートしてみた。
出力のオプションに「ポリゴングループに既存のグループを含める」オプションのみを適用し、その他のチェックを入れない場合と、「モーフターゲット(ワールド変換なし)」にチェックを入れた場合で比較する。
オプション無しの場合は、子側の頂点が親側の頂点に追従している。
また、子階層をマグネットで変形させた場合も同様である。
このことから、二つのことがわかる。
- 子側のactorがモーフやデフォーマ等によって変形を加えられた場合、weld機能によって共通頂点は移動していないように見えるものの、内部の実際の処理としては移動している。
- 出力オプションの「モーフターゲット(ワールド変換なし)」は、ワールド変換(軸回転・移動・拡大縮小など)を無効化するだけではなく、weldによる頂点の移動も無効化する。
poser上ではweldの効果を無効化するにはbendを無効にするしかない(するとモーフやデフォーマの効果も無効化されてしまう)ので、このオプションはモーフの効果だけを確認できる唯一の手段である。
まあ、だからなんだ、と言われたらそれまでの話なんだけど。kirakiraさんちで書かれていた自分の言いたかったこと、というわけで。
もう一つ。jointを別パートに適用させるやつ。
part Bをz軸回転させた時に、影響範囲が他のパートに及ぶように設定する。デフォルトではpart Cはpart A-part B間の影響を受けない。そこで、part Aにある「part Bのz軸回転によるjoint」のチャンネルをpart Cにコピーする。
しっかり追従するようになった。一つのactorに対して、複数のactorを追従させることも可能なようである。
ただし、この状態ではJPの設定ができない。なぜなら、part Bのz軸回転を調節することで値が変更されるのは、part B自身とpart Bのjoint内でotherActorとして指定されているpart Aのみだからである。この状態でJPを変更すると、part A・part Bは新しい設定になるが、part Cにはロードした時の設定が残ってしまう。
また、part BのotherActorに複数のactorを指定することはできないようだ。otherActor A:1とotherActor C:1を複数行に記述すると後の方の行が優先され、otherActor A:1 C:1などのように記述するとpart Bのjointチャンネルそのものが無効になってしまう。
マグネットの影響は複数のパーツに及ぶ事が可能なわけだから、技術的に不可能なわけではないと思うが……果たして。
こういう技術的な話、なかなか日本じゃ見かけない。知ってる人は知ってる事なんだろうけど、テキストとしてネットに上がることはあまりないようである。まあ調べるのも面倒だし、書くのも面倒だけど。それとも昔は存在したものの消失してしまったんだろうか。バージョンによってPoserの仕様が変わったとしても、「その時点でのPoserの話」または「その時観測された現象」ということで無いよりずっと有用な情報だと思うんだけどなー。
《2008.5.28 誤情報訂正》
Weldの条件を完全に誤解していたので訂正。
詳細は2008年5月28日付けの「Weldについて(再)」にて。
《2011.11.12追記》
一部のリンク先のコンテンツが破棄されたため、該当するリンクを削除しました。