fc2ブログ

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

[Blender] 平面とカーブで眼を作る

アニメ調のキャラでは眼が大きい場合が多々あります。
あまりに眼が大きいためそれにあわせて眼球を作ると頭から飛び出すほどの大きさになっちゃうこともよくあります。
頭から飛び出すわけにはいかないので、球はあきらめて平面で作るとか、以前 「[Blender] 平面に近い眼球を作る方法」 で紹介したような球を empty でスケール変換して見かけ上ひらべったくするとか、そういった方法で何とかするわけです。
で、あるとき、ふと 「平面を曲げて眼を作ってやればいいんじゃね?」 と思い立ちました。

以下、長々と解説を書いてますが、blend ファイルを見りゃわかるって方は下のほうにサンプル blend ファイルへのリンクを貼りつけてありますのでそいつをどうぞ。

■ 平面とカーブで眼を作る

  1. Curve ? Bezier Curve でカーブを追加します。横方向用と縦方向用の 2つのカーブを追加してそれぞれ好みの形にします。(下図の (1) ) ここでは、角を丸めたホッチキスの針みたいな形にしました。また、横方向用と縦方向用を同じ形にしていますが、もちろん違う形で問題ありません。
  2. カーブの前に平面 (Plane) を置きます。動かさないのであれば平面の位置はどこでも構わないと思いますが、ボーンを入れて動かす場合は平面とカーブとの位置関係が Curve Modifier の結果に影響するのでオブジェクトの原点をあわせておいた方が良さそうです。
    で、この平面を適当に分割しておきます。(下図の (2) )
  3. 平面に Curve Modifier を 2つ追加します。それぞれの Modifier の Ob: に横方向用と縦方向用のカーブのオブジェクトを指定します。(下図の (3) ) カーブを追加した時の向きによっては X, Y, Z, ?X, ?Y, ?Z のボタンを調整する必要があるかもしれません。
  4. これで下図の (4) のように平面がカーブに沿うようにグニャッと曲がるはず。

CurveEye_Fig1.png.jpg

基本はこれだけです。
Curve Modifier を知っていれば何も特別なことはやってないんですけどね。
アニメ調の眼にする場合は、この平面を UV 展開してテクスチャを貼ることになると思います。その辺は書きませんが、単なる平面なので UV 展開も簡単です。

■ ボーンを組み込む
眼を動かせるようにボーンを組み込みます。ここでいくつか注意点があります。
以下、ごちゃごちゃと書いてますが 「理屈はいいから方法だけ教えれ」 という方は適当に読み飛ばしてくださいw

まず、眼をキョロキョロさせる前に、そもそも頭が動いたときにそれにあわせて眼も動いてくれないと困ります。
すなわち、上で作った平面とカーブを頭にあわせて動くようにする必要があるということです。
普通に、Armature Modifier を追加して、Weight Paint で頂点にウエイトを設定して、、、もちろん平面はこれで問題ありません。ところがカーブでこれをやろうとすると困ったことになります。
Curve には Armature Modifier はあるのですが、Weight Paint がありません。というか、Vertex Group がありません。なので Armature Modifier を追加してもアーマチュアにあわせて頂点を動かすことができません。なにか方法があるのかもしれませんが私にはわかりませんでした。
そこで別の方法で眼を頭にあわせて動かす必要があります。以下、その方法です。

ここでは、下図 (1) のように Neck ボーン(首)→Head ボーン(頭)と繋がっていて、この Head ボーンに追随するように眼を動かしたいとします。そして、これらのボーンは BodyArmature というオブジェクト名のアーマチュアになってるとします。

  1. Object Mode で右クリックで横方向用カーブを選択。
  2. Shift キーを押しながらボーンを右クリック。(これで横方向用カーブと BodyArmature 全体とが選択された状態になるはず)
  3. 2つが選択された状態のまま Pose Mode に切り替える。
  4. Head ボーンを右クリックで選択。(Shift キーは押す必要がないので注意)
  5. Ctrl + P で 「Make Parent To」 を出し、「Bone」 を選択。

これで横方向用カーブが Head ボーンの子になりました。
試しに Pose Mode で Head ボーンを動かしてみれば、それにあわせて横方向用カーブが動くはずです。
あとは同じ手順で縦方向用カーブ、平面を Head ボーンの子にします。
これで Head ボーンにあわせて眼が動くようになったはずです。

続いて、眼をキョロキョロさせられるようにします。
普通なら Head ボーンの子ボーンとして Eye ボーンを追加して、眼の平面に Armature Modifier を追加して Weight Paint で頂点ウエイトを設定して、、、とするところです。
ところがこの方法ではうまくいきません。
眼の平面は Head ボーンの子オブジェクトです。Head ボーンが動けばそれにあわせてオブジェクトが動きますが、これはオブジェクト自体がグローバル座標系で動いているだけです。当然、オブジェクト内のローカル座標系は動いていません。それに対して、Eye ボーンは BodyArmature オブジェクトの座標系の中にあり、その位置はEye→Head→Neck→...というように根っこのボーンからの動きがすべて累積された状態にあります。そのため、Eye ボーンの変位量を眼の平面に適用しても期待した結果になりません。
ではどうするか?以下、その方法です。

  1. Object Mode で新たに Armature を追加。この Armature を EyeArmature と名付けます。この EyeArmature は眼の平面のオブジェクト原点とあわせておいた方がいいんじゃないかと思います。
    また、この EyeArmature の中のボーンを Eye という名前にしておきます。
  2. Object Mode で右クリックで EyeArmature を選択。
  3. Shift キーを押しながら BodyArmature を右クリック。
  4. 2つが選択された状態のまま Pose Mode に切り替える。
  5. Head ボーンを右クリックで選択。(Shift キーは押す必要がないので注意)
  6. Ctrl + P で 「Make Parent To」 を出し、「Bone」 を選択。

ここまでやったのが下図 (2) です。
パッと見では Eye ボーンが Head ボーンの子ボーンのように見えますが、上記の手順のようにやれば 「Head ボーンの子オブジェクトとして EyeArmature があり、その中に Eye ボーンがひとつだけある」 という状態になっています。
上で座標系がどうのと書きましたが、要するに 「眼のオブジェクトが Head ボーンの子オブジェクトになってるんだから、それを動かすボーンも Head ボーンの子オブジェクトにする必要がある」 ってことなわけです。(余計わかりにくいか?w)

あとは眼の平面に Eye ボーンのウエイトを設定してやれば OK です。

  1. 眼の平面に Armature Modifier を追加。このとき Modifiers パネルで Curve Modifier より Armature Modifier が上になるように移動する。(下図 (3) )
  2. 平面の頂点にウエイト付けする。このとき、周囲一周は Eye の Weight: 0.0、それ以外は Weight: 1.0 にする。(下図 (3) )

ここでも注意があります。
まず、Modifier の順番。これは上記の通り Armature Modifier が上になるようにする必要があります。(スキニングしてからカーブで曲げるか、カーブで曲げてからスキニングするか、の違い)
次に頂点のウエイトですが、周囲一周を Weight: 0.0 のまま残しているのはわけがあります。
Curve Modifier はオブジェクトの原点を見ているのではなく、メッシュの一番左側 (もしくは右側) を調べてそこを原点に処理しているようです。メッシュすべてを Weight: 1.0 とすると Eye ボーンを動かすとメッシュ全体が動くわけですが、そうするとメッシュの一番左側もいっしょに動き、その動いた結果を原点として Curve に貼りつけるので結果として何も動かないことになります。(こんな書き方でわかるかな?w)
そのため周囲は動かないように Weight: 0.0 のままにしているわけです。
また、もともと一番左にある頂点ではなく、スキニング後にもっとも左になった頂点が原点とみなされるようです。そのため Curve Modifier を使っているメッシュをスキニングで変形させると予想と違う位置になってしまう場合があります。これはどこが原点になっているかを考えながらうまいこと調整するしかないと思います。(うーん、文章で説明するのは難しい)

CurveEye_Fig2.png.jpg

基本的な構造は以上です。
上記は片目分ですが、両目必要な場合は同じものをもう 1セット作ることになります。

■ サンプル blend ファイル
blend ファイルをあげておきます。
http://cid-ca42d76a68f54d16.skydrive.live.com/self.aspx/Public/Blender/CurveEye.blend
(Blender 2.49b で作った blend ファイルです)

このサンプルには両目分入っています。
また、左右の目をまとめて操作できるコントローラのボーンも入れてあります。

  • CtrlEyeMove ボーン … 両目をキョロキョロ。あまり大きく動かすと眼のメッシュが壊れる。
  • CtrlEyeCross ボーン … 両目のヨリ目具合を調整。あまり大きく動かすと眼のメッシュが壊れる。
  • CtrlEyeSize ボーン … 両目のメッシュのサイズを調整。テクスチャが貼ってあれば瞳の大きさを変えたりできます。あまり大きく動かすと眼のメッシュが壊れる。

とりあえず、横着して Grease Pencil ですがコメント書いといたので見ればわかるんじゃないかと思います。
ちなみに Move と Cross は EyeArmature.L/R の Eye ボーンにしこんだ Copy Location で連動させてます。(Local 座標系の Offset で)
Size は同じくしこんだ Transform で X 方向、Z 方向への移動をサイズに変換してます。
また、「あまり大きく動かすと眼のメッシュが壊れる」 の理由はカーブの長さが足りなくなったり、メッシュのサイズがカーブからはみ出したりするからです。このあたりは必要十分になるように適当に調整すれば OK です。

以上、長々と書きましたが、自分ではかなりいい方法だと思っています。
カーブなのでかなり柔軟に形状を調整できますし、肝心なところは単なる平面なのでテクスチャの調整も楽です。
アニメ調のキャラの眼だけでなく、ザクやドムのモノアイみたいなやつとかにも使えそうです。

スポンサーサイト



[Blender] マテリアルノードで天使の輪

ここ 10ヶ月くらいあまり Blender はさわってなかったんですが、ふと、またモデリングとかしてみようかなぁと思い立ちました。
で、その前に以前いくつか試したことをまとめておこうと。

というわけで、最初は 「マテリアルノードで天使の輪を描いてみた」 です。
Blender は 2.49b です。
(試してたのは 10ヶ月以上前なのでその頃は 2.49 はまだ出てなかったと思いますが、今回この記事を書くにあたって 2.49b でサンプルを作りなおしました)

天使の輪っていうのはアレです。アニメ風の絵の髪の毛にできる反射のことです。
普通にスペキュラで描いただけではああいうアニメ風の輪っかにはならないんですよね。
そこで反射ではなく、マテリアルノードで描き足してやるようにしてみました。

もともとのアイデアはこちらです。
天使の輪をトゥーンレンダリングで作る
こちらは Softimage XSI のシェーダーを使った例ですので Blender でそのまま再現することはなかなかできませんが、内容自体はとても参考になりました。
というか、

  • アニメ絵とかの髪の毛は光源無視で光っている
  • 頭の真上にライトがあるかのように光っている
  • カメラの上下角に応じて天使の輪の位置がずれる

というのを読んでものすごくショックを受けました。「おぉ、ライトなんて関係なかったんや!」 とw
で、これらを素直にマテリアルノードでやってみました。

サンプルとして作った blend ファイルを置いておきます。
http://cid-ca42d76a68f54d16.skydrive.live.com/self.aspx/Public/Blender/TenshinoWa.blend
(Blender 2.49b で作ったサンプルファイル)

以下、簡単な解説

マテリアルノードは以下のようなもの。

TenshinoWa.png.jpg

分かる人が見ればそのまんまですが、

  1. まず Normal でてっぺんが真っ白、横が真っ黒になるようにします。この Normal ってマウスでぐりぐり操作するしかないみたいで、ちょうどいい位置にするのにちょっとイライラします。なるべくでっかくして操作した方がいいです。
    で、この出力を ColorRamp に繋いで輪っかになるように一部を取り出します。
    この ColorRamp の出力を直接 Output に繋げば輪っかだけがレンダリングされるので調整するときはそうした方が楽かも。
    また、この ColorRamp の色を変えれば天使の輪の色を変えることができます。 あとここでは黒→白→黒のグラデーションにしているので天使の輪もグラデーションがかかりますが、グラデーション無しにしたって構いません。その辺はお好みで。
  2. 上記だけでも天使の輪になりますが、シマシマにしたかったのでテクスチャを使ってシマシマにしました。
    普通に UV 展開してシマシマのテクスチャを描きます。試しに描いたのはこんな感じ。(以下のは形がわかるように UV とシマシマ部分だけを描いてます。実際のテクスチャは真っ黒にシマシマだけがある状態です。実物はサンプルの blend ファイルにパックしてあります)
    TenshinoWa_Tex.png.jpg
    このテクスチャを Shading ? Material パネルの Texture と Shading ? Texture パネルで読み込みます。ただし、レンダリングに使いたいわけではなく、マテリアルノードで使うだけですので、Texture のところにあるチェックをはずしておきます。
    TenshinoWa_TexturePanel.png.jpg
    マテリアルノードでは Geometry の UV をこのテクスチャに繋いでやって UV を反映させます。
  3. これら 1 と 2 の結果を合成します。ここでは Multiply の Fac 1.00 を使いました。こうすると 1 の輪っか部分 かつ 2 のテクスチャのシマシマのあるところ のみが描かれます。サンプルのテクスチャでは前髪や後ろ髪部分は真っ黒にしてあるためこれらの部分には天使の輪は描かれないわけです。天使の輪を描くところと描かないところをテクスチャで制御できるのでちょっと便利かな?とか思ってます。
  4. あとはマテリアルの本来の色と 3 で作った天使の輪とを合成するだけです。

と、こんな感じです。

自分では普通にスペキュラで描くよりはだいぶましになってるかな?と思います。
ただ、本当にマンガチックな天使の輪は髪の毛を完全な球体とみなして、そこに輪っかを投影しているような感じだと思います。(天使の輪がデコボコしない)
これができるとおもしろいかなぁなんて思ってるんですが、ちょっと難しそう。
一応、髪の毛のメッシュを球体とみなしたときの x, y, z 座標を頂点カラーの RGB にでも入れておいて、マテリアルノードではその頂点カラー (球体とみなした時の x, y, z) から求めた法線を Normal に放り込んでやることができればできそうだ、なんて思ってるんですがどうでしょ?

ところで、この方法で天使の輪を描いたテスト動画をニコニコにも上げてたりします。

わかる人にはすぐわかりますが 友Pのテスト動画 のマネですw
リピートすると繋がってゆらゆらする予定だったんですが、なぜか最後に静止部分が入っちゃってますね。Blender では 30fps×2秒の 60フレームぴったりになってるはずなので、エンコードするときに最後にちょっと余計な部分が追加されちゃってるのかな?

ちなみに、これは以前ニコニコに上げたりしていたモデルとは別のモデルです。
最初のは事実上生まれて初めてモデリングしたものでしたし、いろいろと直したいところもあったりで、きれいさっぱり捨て去って完全に新規にモデリングし直しました。
で、このモデルを作ってる時に今回の天使の輪やその他いくつか試してみたのが今回の記事の元ネタです。
けどこのモデルはボーンを入れ終わって後はもうちょっと調整すれば完成かな?というところまで進めたところで、その後 10ヶ月完全放置になってしまっているというかわいそうな娘です。(まぁ、Blender 自体をさわってなかったわけですが)

そういや、このモデルでは髪の毛や肌の色もマテリアルノードで描いています。
シェーダーは Lambert のままにして、マテリアルノードで Color を ColorRamp に繋いでそこで 2値 (髪の毛なら暗い茶色と明るい茶色、肌なら暗い肌色と明るい肌色、という具合) にしています。髪の毛は 2値化した色に今回の方法でさらに天使の輪を加えています。
これなら影の色も自分で指定できますし、Blender 標準の Toon シェーダーよりきれいにできるように思います。もちろん、2値だけでなく、暗い色・普通の色・明るい色の 3値にするなどもできるはずですし、それぞれを好きな色にできるわけです。
ただ、ライティングが変わるとマテリアルノードの ColorRamp を調整してやらないと陰がうまくでないという大きな欠点がありますが。少なくとも 2.49 ではマテリアルノードの ColorRamp にキーを打ったりできないので、アニメーションするときには困ることもあるかもしれません。

おまけネタ
シマシマのテクスチャを GIMP2 で簡単に作る方法 (Photoshop とかでも似たような感じでできると思いますが)

  1. 「下塗り」-「雲」-「ソリッドノイズ」 で X サイズを 16、Y サイズを 0.1 でノイズを描く。これだけでもそれなりのシマシマになってます。
  2. ちょっと縞が荒い場合は 「拡大・縮小」 ツールで横方向に縮小したりしていい感じの縞にする。
  3. 上記を繰り返すなりコピー&ペーストするなりして縞模様の画像を作る。
  4. 色合いがイマイチな場合はトーンカーブとかで調整する。
  5. 「境界をぼかす」 とかを使っていい感じの縞模様のおびを作り、それを 「変形」-「極座標」 で丸める。

これだけ。

[自転車] 3/22~3/28 の走行記録

22日の休日に走りに行っただけ。
火~木は雨、金は用事、週末の土日も乗れずでいくらなんでもヤバイ感じ。

【“[自転車] 3/22~3/28 の走行記録”の続きを読む】

[自転車] 3/15~3/21 の走行記録

土曜日に用事で梅田に行ったついでにチェーンを買ってきた。日曜日に付け替え。
RFX8 を購入したときのままだから 1万2千キロくらい走ったのかな。
ほんとはもっと早めに替えてあげた方がいいんだろうけど。

まだ雨がちだけどちょっとは乗れた一週間。
以下、自転車通勤の記録。

【“[自転車] 3/15~3/21 の走行記録”の続きを読む】

[自転車] 3/8~3/14 の走行記録

自転車通勤 3日。
雨の日もあったから仕方ないけど、それにしても最近ぜんぜん乗れてない。

【“[自転車] 3/8~3/14 の走行記録”の続きを読む】

[自転車] 3/1~3/7 の走行記録

用事があったり雨だったりで 2日自転車通勤しただけ。

以下、その記録。

【“[自転車] 3/1~3/7 の走行記録”の続きを読む】

[自転車] 2/22~2/28 の走行記録

最近サボりっぱなしだったけど、今週からまたそれなりに乗っていこう、、、と思ったけど雨やら何やらで 3日自転車通勤しただけ。

以下、自転車通勤の記録。

【“[自転車] 2/22~2/28 の走行記録”の続きを読む】

[自転車] 2/15~2/21 の走行記録

自転車通勤 1日のみ。
天気は悪くなかったけどなんとなくモチベーションが上がらず。

【“[自転車] 2/15~2/21 の走行記録”の続きを読む】

[自転車] 2/8~2/14 の走行記録

雨ばかりの週。自転車通勤は 2日のみ。
週末はチョコレートガールズを見に行くため東京へ。

以下、自転車通勤の記録。

【“[自転車] 2/8~2/14 の走行記録”の続きを読む】

[自転車] 2/1~2/7 の走行記録

雨だとか用事だとかで 2日しか自転車通勤しなかった。

以下、自転車通勤の記録。

【“[自転車] 2/1~2/7 の走行記録”の続きを読む】