fc2ブログ

青柳 臣一 ブログ(趣味系)

[Blender] 足のリグ (リバースフット)

「リバースフット」 で検索するとたくさん出てきます。
ただ、Softimage XSI や Maya ばかりだったので、Blender で作った例をあげときます。(まぁ、たいして変わりませんが)

LegRig_Fig1.png.jpg

名前が見にくいと思いますが、以下のようになっています。

  • UpperLeg … 上肢(太もも)。
  • LowerLeg … 下肢。UpperLeg の子。IK Solver が仕込んである。Chain Len は 2、Target は “ikLeg”、Pole Target は “poleLeg”。
  • Ankle … 足の甲部分。LowerLeg の子。Copy Rotation が仕込んである。Target は “AnkleAngle”。
  • Toe … つま先部分。Ankle の子。Copy Rotation が仕込んである。Target は “ctrlToe”。

以上が基本的な骨格部分です。
脚のメッシュを以上のボーンでスキニングすることになります。

以下は上記のボーンをコントロールするためのコントローラです。

  • ctrlLeg … 足全体のコントローラ。
  • ctrlToe … つま先の角度をコントロールするコントローラ。ctrlLeg の子(非接続)。
  • ctrlAnkle … 足の甲の角度をコントロールするコントローラ。ctrlLeg の子(非接続)。
  • AnkleAngle … ctrlAnkle の角度を Ankle に伝えるためのボーン。ctrlAnkle の子(非接続)。(ctrlAnkle が後ろ向きなので Ankle にあわせて前向きに直すためのボーン)
  • ikLeg … IK Solver のターゲットになるボーン。AnkleAngle の子(非接続)。
  • poleLeg … IK Solver のポールターゲットになるボーン。ctrlLeg の子(非接続)。

また、図ではずらして描いてますが、本当は ctrlLeg と ctrlToe、ctrAnkle は重なっています。そして、これらが AnkleAngle の先っぽのところにあります。

コントロールに使うのは ctrlLeg、ctrlToe、ctrlAnkle、そして、poleLeg だけです。

  • ctrlLeg … 脚の移動、回転。
  • ctrlToe … つま先の上下の向き。上下以外の回転と移動を禁止しておくと使いやすい。
  • ctrAnkle … 足の甲部分の上下の向き。上下以外の回転と移動を禁止しておくと使いやすい。
  • poleLeg … 膝の向き。ctrlLeg の子にしておけば ctrlLeg の向きを変えれば脚をひねることができる。つま先の向きを変えずに内股にしたりするときは poleLeg を移動する。ctrlLeg の子にするかどうかはお好みで。

あとは見やすく選択しやすいように Shape を作ったり、グループ分けして色をつけたりすれば OK です。
もちろん、コントローラの 4つ以外はボーンレイヤーを分けて普段は非表示にしておけば邪魔になりません。(なにより、間違って動かしちゃったりするのを防げます)

サンプルの blend ファイルを置いておきます。
http://cid-ca42d76a68f54d16.skydrive.live.com/self.aspx/Public/Blender/LegRig.blend
(Blender 2.49b)

つま先も動かせるようにした 「リバースフット改」 という感じのものですが、結構使いかってはいいんじゃないかと思います。

スポンサーサイト



[Blender] きれいに関節を曲げるためのボーン構造 “Skinbones” 法

ここで紹介するのは、↓の内容をそのまんま Blender でやってみたというものです。
http://www.sonofpat.com/Tutorials.html
って、ありゃ、サイトが無くなってるぅ。残念だな。気になる方は Web Archive とかで探してみればみつかるかも。

最初にお断り。
正直、今回の手法はほんとにそこまでする意味があるのか?見合った効果があるのか?よくわかりませんw
それと Skinbones 法という名前が 3DCG 一般で使われている用語なのかよくわかりません。検索してもそれらしいのはほとんど見つからないから上記のサイトを書かれた人がとりあえずそう呼んでただけのような感じがします。

で、どういう方法なのかというと下図 (1) (2) みたいなものです。

Skinbones_Fig1.png.jpg

 

Skinbones_Fig2.png.jpg

これを見ればだいたい検討つくとは思いますが、(1) は赤が肩ボーン、青が上腕ボーンです。緑はすべて補助ボーンで上腕に連動して自動的に動きます。(2) も同様で、赤が腰ボーン、青が大腿ボーン、緑は大腿ボーンと連動して動く補助ボーンです。
そして、これが Skinbones の特徴と言っていいと思いますが、1つの頂点を動かすために 1つの補助ボーンが入れてあります。(1) では肩の 6つの頂点を動かすために 6つの補助ボーンが、 (2) では股関節の 8つの頂点のために 8つの補助ボーンが入っています。

もともと人体の皮膚は骨によって形が決まるわけじゃなく、骨の周りにある筋肉やら脂肪やらといったいろんな組織によって形付られているわけです。それをごく単純化した骨の位置関係だけで本物と同じような形にしようということに無理があるのは明らかです。かと言って、まじめに筋肉をシミュレートするようなのは大変です。そこで必要なボーンをジャンジャカ入れ、それで少しでもうまい具合に変形するようにしよう、ということなんでしょう。

で、これらの補助ボーンは以下の要素によって動きが制御されます。

・Copy Rotation Constraint
補助ボーンに Copy Rotation Constraint を仕込んで、上腕ボーンや大腿ボーンと連動して自動的に動くようにします。

・Copy Rotation の Influence
たとえば、Influence を 0.1 にすれば、上腕が 90度動いたときに 9度だけ動くことになります。

・ボーンの位置と長さ
本物の人体と違ってボーンを体の中に納める必要があるわけじゃないので、好きなところにボーンを配置できます。
また、長くすれば大きく動きますし、短ければ小さく動きます。

・Roll 値
Armature の Eidt Mode のメニュー Armature→Bone Roll でセットしたりリセットしたり、もしくは、Armature→Transform Properties で出るパネルで表示・設定できる Roll 値のことです。
この値はそれぞれのボーンのローカル座標の向きを決めるものです。普通なら上腕を前に回転させれば補助ボーンも前に回転する、というようになるわけですが、Roll 値をいじると前のとき下に、下のとき後ろに、というように回転軸をずらすことができます。

以上の Influence、位置・長さ、Roll 値を組み合わせて補助ボーンがいい感じに動くように調整するわけです。

と、内容的にはこれだけです。
ただ、実際にやってみるとそれなりには大変でした。
上腕は前と下に大きく動きますし、上や後ろにもちょっと動きます。股関節も同様です。そのため、どちら向きに動いてもそれなりにいい結果になるというポイントを探しだすのは簡単ではありません。そもそもそんなポイントは無いってこともあるでしょうし。また、当然ながら頂点の位置も重要になります。けど、頂点の位置を調整すると近くの頂点にも影響を与えたりしてそれらも再調整が必要になったりします。結局、すんなりうまくいくことはめったになく、あれやこれやと調整を繰り返すことになります。ちまちまと調整してると 「ShapeKey 登録して、上腕ボーンでドライブするようにした方が早いんじゃね?」 とか思えてきます(笑)

というわけで、最初に書いたように 「ここまでする意味あるのかなぁ?ここまでしなくてももっと単純な方法でも似たような結果になるんじゃないかなぁ?」 と感じているのが正直なところです。
もちろん、Skinbones という手法を否定するつもりもありませんし、うまくはまれば単純なスキニングよりかなりいい結果が出るんじゃないかとは思ってるんですけどね。
けど、ちょっと調整が大変すぎるかなぁ、と。
正直、次にボーンのセットアップをするときにはこんなにたくさん補助ボーンを入れたりはしないと思いますw

[Blender] 手首をなるべくきれいにひねるための補助ボーン

まず何も考えずに作った例。
下図 (1) の細い部分が前腕、ちょっと太くなってるところが手首から先と思ってください。それぞれ、LowerArm、Hand という名前のボーンが入っています。頂点ウエイトも図の通り。それぞれ黄色く選択されている頂点が Weight:1.0、されていない頂点が 0.0 です。
これで Hand ボーンを 90度ひねったのが図 (2)。真横からだとわかりにくいのでちょっと斜めから見てます。一列の並びだけで 90度分のひねりの相手をしなくちゃいけないのでかなり不恰好になります。
極端な話、180度ひねると図 (3) のようになっちゃいます。

Twist_Fig1.png.jpg

これを何とかしようというのが今回の話。

ちなみに、前回の 「[Blender] 肘や膝をなるべくきれいに曲げるための補助ボーン」 に書いたようにこれもデュアル・クォータニオン・スキニングを使うとこうはならなかったりするわけですが、今回も Quaternion ボタンはオフのままで何とかするってことで。

オーソドックスなのが図 (4) のように前腕全体でひねる方法。
実際の人間も、手首が回転するわけではなく、前腕の 2本の骨がクロスするように動くことで手首のひねりを実現しているそうですから、そういう意味でも理にかなっているのかも。
図 (4) では頂点ウエイトが LowerArm は左から 1.0, 0.75, 0.5, 0.25, 0.0、Hand が左から 0.0, 0.25, 0.5, 0.75, 1.0 となっています。

Twist_Fig2.png.jpg

これを 90度ひねってみたのが図 (5)。
図 (2) と比べるとかなりましです。
ただ、この方法ではどうしても前腕が痩せてしまいます。
頂点の位置をうまいことすればもう少しましになるかもしれませんが、スキニングの仕組み上どうやったって痩せます。ひねり方向の移動では、複数のボーンが引っ張り合った結果、回転軌道上ではなくボーンの中心方向によってくるんですから避けようがありません。
あと、今回の話の本質とは関係ないので無視してますが、図 (4) みたいな構造だと手首を上下左右に曲げることができません。曲げると図 (6) のように前腕全体がしなっちゃいます。そりゃ、Hand のウエイトを前腕部分に割り振ってるんですから当然です。なので、この方法でやるなら手首の曲げとひねりを別々のボーンで行うなどの工夫が必要です。(それも下に書く今回の手法と同じような感じで対応可能ですが)

というのが前置き。ここから、ひねりをきれいに、と言うか、痩せないようにするためのひねり用補助ボーンの話です。
まずは図 (7)。

Twist_Fig3.png.jpg

UpperArm は上腕のボーンです。ボーンの親子関係を示すために足しただけで、ひねり用ボーンとは関係ありません。(今回の例ではあってもなくてもいっしょ)
Twister1 がひねり用の補助ボーンです。LowerArm と同じように UpperArm の子になっています。見えなくなってしまうため図では離して描いていますが、実際には LowerArm とまったく同じ位置に重なって入っています。そして Twister1 には Copy Rotation Constraint と IK Solver Constraint が仕込みます。
Copy Ratation のターゲットは Hand です。なので、Hand が回転すると Twister1 も同じく回転します。
IK Solver のターゲットも Hand です。なので、Twister1 は常に Hand の方を向きます。また、Chain Len を 1 にしているのでこの IK Solver が影響するのは 1つのボーンだけ、すなわち、Twister1 自身だけです。
この Copy Rotation と IK Solver の両方が入っているのがミソです。こうすると Copy Rotation によって Hand に同期して回転しますが、IK Solver によって向きが Hand の方に修正されます。IK Solver は向きを修正するだけでひねり方向の回転にはノータッチなので結果的に、向きは LowerArm と同じ、けれども Hand と同じだけひねった状態、となります。
そして、もうひとつのミソが Copy Ratation の Influence が 0.5 になっていることです。こうすると Twister1 は Hand のひねりの半分だけひねられます。もちろん、0.8 にすれば 80%、0.2 にすれば 20% という具合に Hand の何%ひねるかを指定できます。

では、本番。
図 (8) がそれです。

Twist_Fig4.png.jpg

ひねり用ボーンを Twister1、Twister2、Twister3 の 3本にしました。この図でも離して描いていますが本当は LowerArm とまったく同じ場所に重なって入っています。そして、Copy Ratation の Influence の値を除いて設定はまったく同じです。
頂点のウエイトは図のようになっています。すべて選択されているところが Weight: 1.0 でされていないところが 0.0 です。見れば分かる通り、複数のボーンのウエイトが入っている頂点はありません。

これの Hand を 90度回転させてみたのが図 (9) です。

Twist_Fig5.png.jpg

Hand が 90度、Twister1 は 67.5度(75%)、Twister2 は 45度(50%)、Twister3 は 22.5度(25%) だけひねられています。
図 (5) と見比べてもらえば痩せてないのがわかると思います。そりゃ、ひとつの頂点はひとつのボーン影響しか受けないようにしたんですから痩せるはずはないんですが。
ボーンも表示させたのが図 (10) です。LowerArm がドリルみたいになってますが、これは重なって入っている Twister1、Twister2、Twister3 がそれぞれ違う角度で回転しているからこう見えます。

ところで、補助ボーンを LowerArm とまったく同じ場所に同じ長さで入れていますが、今回の場合、長さはお好みで構いません。始点位置は揃えないとまずいですが、長さはひねりに関しては影響しませんから。
ただ、LowerArm の位置を変えるときなどに補助ボーンの長さが違うと調整が面倒なので私は長さもまったく同じにしてます。
あと、Blender のボーンには Roll 値があります。
Armature の Edit Mode でメニューの Armature→Bone Roll でクリアしたり設定できたりするやつです。また、Armature→Transform Properties で出るパネルで Roll 値を見たり変更することもできます。
この Roll 値はボーンそれぞれの座標系を決める値ですから、これがずれていると Copy Rotation の結果もずれます。
これも都度調整するのは面倒なので、私は、LowerArm と位置も長さも Roll 値も同じ、としています。

前回の 「[Blender] 肘や膝をなるべくきれいに曲げるための補助ボーン」 に 「手首のひねりを手首ボーンではなく LowerArm ボーンをひねることによって表現しているような場合は二軸回転することになるのでこの方法は使えない」 と書きましたが、これの回避策も今回の手法で可能です。今回の手法では手首のひねりは補助ボーンで表現するので LowerArm はひねらなくていい、と言うか、ひねらないようにできる、というわけです。

この間ニコニコに上げた春香には最近書いている天使の輪やら平面とカーブで作った眼やら肘の補助ボーンやら今回のひねりの補助ボーンやらがみんな入っているんですが、腕部分のボーンをすべて表示したのが図 (11) です。

Twist_Fig6.png.jpg

肘のところにある青い四角形が前回の肘の補助ボーン、肘の上下にある青いジグザグが前回の肘の内側と外側を調整するための StretchTo を仕込んだ補助ボーン、上腕と前腕にあるサイコロみたいな青い立方体が今回のひねり用補助ボーン、あとはコントローラーやら何やらです。もちろん補助ボーンはボーンレイヤーを分けておいて普段は非表示にしとけば邪魔にはなりません。(左上にちょっと見えてるのは 「[Blender] 平面とカーブで眼を作る」 で書いた瞳のサイズ、ヨリ目、位置をコントロールするためのコントローラー)

本物の人体は肩をひねれるようですが、同じことをすると簡単に肩がねじれてしまいます。そこで肩はひねらずに上腕をひねるようにしています。
同様に股関節も股関節でひねるのではなく大腿でひねるようにしています。

ちなみに、以前見た Softimage XSI の解説動画では null を配置してそいつを expression で動かすといった感じでひねってました。Copy Rotation と IK Solver の二段重ねっていうのは Blender 独特かもしれませんが、本質的にはやってることは同じです。

上に書いたそのまんまなのであまり必要ないようには思いますが一応サンプル blend ファイルを置いておきます。
http://cid-ca42d76a68f54d16.skydrive.live.com/self.aspx/Public/Blender/Twist.blend
(Blender 2.49b)

[Blender] 肘や膝をなるべくきれいに曲げるための補助ボーン

まずは何も考えず普通に。
下図 (1) は、腕 (ここでは単純に八角柱) に UpperArm (上腕)、LowerArm (前腕) のボーンを入れたものです。頂点ウエイトは図のようになっています。(黄色く選択されている頂点が Weight: 1.0 でされていないのが 0.0)。
これを 90度、135度曲げてみたのが図 (2)。

ElbowBone_Fig1.png.jpg

肘の外側にあたる部分は結構ひしゃげます。パイプを曲げたときみたいな感じとでも言えばいいでしょうか。
まぁ、スキニングの仕組みから言って極々普通です。
通常のスキニングは単なる線形補間、すなわち、一つの頂点を複数のボーンが引っ張り合いっこして位置を決めるわけです。今回の場合、肘のところの頂点は UpperArm、LowerArm とも Weight: 1.0 なので同じ力で引っ張り合います。なので当然こういう結果になります。
ちなみに、ウエイトは比率なので、1.0 : 1.0 でも 0.5 : 0.5 でも 0.1 : 0.1 でも結果は同じです。

そういや、ずいぶん前に 「単なる線形補間ではなく、回転している部分は回転で補間する方式があればいいのに。クォータニオンで計算すりゃできるんじゃないの?」 みたいなことを書いたことがあるような気がしますが、どうやらそれがデュアル・クォータニオン・スキニングと呼ばれるものみたいですね。
Blender にもデュアル・クォータニオン・スキニングは搭載されています。Armature Modifier の Quaternion ボタンを押すだけです。実際押してみると肘のひしゃげ方がずいぶんましになります。
ならそれでいいじゃん、という気もしないでもないですが、ここではデュアル・クォータニオン・スキニングは使わないということで以下進めます。(単に私が使ってないからですが)

話がそれましたが、普通のスキニングではこういう形になってしまうわけですが、実際の肘を見ると骨の形から来てるんだと思いますがこんなにひしゃげません。むしろちょっととがってるような感じがするくらいです。膝も同じような感じですね。
で、これを改善したいわけですが、頂点の位置を調整すれば多少はましになると思います。
ただ、スキニングの仕組みから考えて、複数のボーンで引っ張り合う以上近くに寄ってくることは避けようがありません。
ならば、複数のボーンで引っ張り合わなけりゃいいんじゃね?というのが以下の方法です。
(元ネタは BlenderArtists のフォーラムで見たんだったと思う)

ElbowBone_Fig2.png.jpg

図 (3) は Elbow ボーンを追加してあります。重なって見にくくなっちゃってますが、Elbow ボーンは UpperArm ボーンの子で LowerArm ボーンとほとんど重なって入っています。
また、Elbow ボーンには Copy Ratation Constraint を仕込んであります。ターゲットは LowerArm ですが、Influence を 0.5 にしてあります。
頂点ウエイトは図のような感じです。
これを 90度、135度曲げてみたのが図 (4)。

Elbow ボーンは Copy Rotation によって LowerArm にあわせて回転しますが、Influence が 0.5 になっているため LowerArm のちょうど半分だけ回転します。
肘のところの頂点はこの Elbow ボーンによってスキニングされるのでひしゃげ方はだいぶましになっています。
ちなみに、たぶんですが、デュアル・クォータニオン・スキニングにしたときと同じ結果になってるんじゃないかと思います。(回転で補間するってそういうことだよね?)

こんな単純な形ではなく、実際のモデルで試してみると、頂点の位置などをうまいこと調整すれば 「まぁ、許容範囲じゃね?」 という位にはできそうな感じです。

ただ、この方式にはちょっと注意点があります。
LowerArm ボーンを複数軸で回転させると、当然それにあわせて Elbow ボーンも半分だけ回転するので肘の形が壊れます。
通常、肘や膝は一軸でしか回転しませんが、たとえば、手首のひねりを手首ボーンではなく LowerArm ボーンをひねることによって表現しているような場合は二軸回転することになるのでこの方法は使えません。
と、言いつつこれには回避策があります。それについてはまた次回。

さて、だいぶましになったとはいえ、もう少し肘を尖らせたいような感じもします。
また、下図 (5) (6) のように 45度くらい曲げた場合は肘の内側が凹んでいます。Elbow ボーンをいれてある図 (6) はだいぶましにはなりますがそれでもちょっと凹んでいます。

ElbowBone_Fig3.png.jpg

では、これの対処法。まずは肘の内側。
下図 (7) がそれです。

ElbowBone_Fig4.png.jpg

UpperArm、Elbow、LowerArm は上のと同じです。

  • InnerAnchor … UpperArm の非接続の子。
  • InnerTarget … LowerArm の非接続の子。
  • InnerStretch … InnerAnchor の非接続の子。StretchTo Constracint が仕込んである。Target は InnerTarget。

これを動かすとどうなるかというのが図 (8) です。ただ、InnerAnchor、InnerTarget、InnerStretch は UpperArm と LowerArm になるべく近づける、できれば重ねてしまった方が効果がはっきりします。重ねてなくても効果はありますが、見た目にもわかりやすいので図 (8) では重ねています。

ElbowBone_Fig5.png.jpg

頂点ウエイトは図 (8) の黄色く選択されている頂点に InnerStretch の Weight: 0.2 を加えています。それ以外は今までと同じです。ですから、選択されている頂点は Elbow の Weight: 1.0 と InnerStretch の Weight: 0.2 の両方のウエイトが入っています。
図 (8) を見たまんまですが、肘がまっすぐなときは InnerStretch は腕に重なっています。肘を曲げるにつれて見かけ上 InnerStretch が内側に出てきます。それによって InnerStretch のウエイトが入っている頂点が内側に引っ張り出されます。

肘の外側もやり方は同じです。
それが図 (9) です。

  • OuterAnchor … UpperArm の非接続の子。
  • OuterTarget … LowerArm の非接続の子。
  • OuterStretch … OuterAnchor の非接続の子。StretchTo Constracint が仕込んである。Target は OuterTarget。

そして肘を曲げてみたのが図 (10)。
こちらも同じく黄色く選択された頂点に OuterStretch の Weight: 0.2 を加えています。
ちょっと影響が大きすぎて肘が飛び出しちゃってますがもちろんこれは OuterAnchor や OuterTarget の位置、および、頂点のウエイトで調整することになります。

ElbowBone_Fig6.png.jpg

あんまり必要ないと思いますが、いちおうサンプルの blend ファイルを置いておきます。
http://cid-ca42d76a68f54d16.skydrive.live.com/self.aspx/Public/Blender/ElbowBone.blend
(Blender 2.49b)

どうでしょ?
こういった手法を使えば肘や膝の形状をそれなりに制御できます。
もちろん、肘や膝だけでなく肩や足の付け根などにも使えます。が、こういったところは可動範囲が大きすぎてなかなかうまく制御できないのが難しいところですが。
また、StretchTo を使う手法なんかは、腕を曲げたときに力こぶを作ったりといったようなことにも使えそうです。