キャラ作り

時期が時期だけに色々とプレッシャーがやばいです。ってな時に呑気に3Dネタ。



今更ながら、2.48。しかも修正版じゃないっていう。使用頻度も落ちてきて、開発速度に追いつきません^^;
 使ってるレイヤーにマークがついたのが便利です。ボーンレイヤーにもついてくれないかな。ProxyInstanceがどうのこうのってマークがあるから無理かな。

何で切り替えてなかったのかと言うと、C++ 2008 SP1 Redistributable Packageが必要なので学校のパソコンで使えないから。何で学校のパソコンで使える必要があるのかと言うと、いつか大量レンダリングが必要になったときに、あまり人がいない時間帯で、十数台のパソコン占領してレンダリングしたいから。また「いつか」の話かよ。

そこで、自分用にちょちょいと書き換えられたら、なんてカッコいいんだ、って思いますが、そのレベルに到達するのはいつの事でしょう。VSも入れたことですし、コンパイルくらいしてみよ、よ、よ・・・・、いつかね。


で、キャプチャについての話ですが、製作した女性のスカートにClothの設定をしているところです。直接スカートのモデルにClothを適用するのは、重さ的に実用的ではないので、単純なメッシュのスカート、および足(障害物用)をつくり、それに物理演算を適応。さらにボーンをそれに追随させて、そのボーンでスカートを動かす、という手順です。

ボーンの追随のやり方はこれといっしょです。
 わざわざボーンを通すのは、部分的に変な動きになったりした場合に、一時的に追随をやめたり、影響度を変化させたり、実用する際に色々と制御がしやすいと思っているからです。Constraintでボーンを制御した結果を、FKに流し込む機能とかあれば、最終調整が容易だと思うんですが、ないのかな?(追記:ありました。詳しくはコメント欄へ)
 しかしまあ、ボーンの数だけ、頂点グループを作り、ボーン一つ一つ設定するので、面倒臭いです。いつか自動化スクリプト書く。

Clothの設定はプリセットにあるcottonでAirDampだけ10に上げています。あまりリアルに動かれると、他の動いていない部分から浮いてしまうので、控えめに動いてもらいたいんです。


---------------------------

素顔の改造。
up_20081216234732.jpg

左が最初作ったものなんですが、これじゃあ表情付けにくいでしょっと思って、右へと書き換えてます。どんなメッシュの流れがいいかは、キャラによりけりですかね。そう考えないとキリがないです。
ちなみにこれは、こんなキャラを作ろうと書き換えを行った結果。
up_20081216235251.jpg
運送屋のおじさん。一見ひょろく見えるけど力持ち!


顔を書き換えてたはずなのに、気付けば一生懸命鎖骨作ってました。
up2.jpg
この鎖骨フェチめ。
関連記事

コメント

はじめまして。
以前からこちらのブログを拝見させていただいてます。
Blender操作の画面キャプチャ動画など、とても勉強になります。

スカートのArmatureをCloth設定された別のメッシュにConstraintsで追従させるという方法ですが、ちょうど私も同じようなことを試しているところでした。
Blenderの付属のスクリプトの中に「animation_bake_constraints.py」というのがあって、これを使うとConstraintsを設定されたアニメーション(Action)からConstraintsなしの状態で同じ動きを再現する別のアニメーションを作成できます。

このスクリプトではConstraintsを削除したArmatureを新規に作成し、そこにアニメーションが作成されます。
スクリプトでBake実行後、スカートメッシュのArmature Modifierの「Ob:」指定を新しく複製されたArmatureに変更すると、Action EditorやIPO Curve Editorで編集可能な状態でスカートを動かせるようになります。

「Constraintでボーンを制御した結果を、FKに流し込む機能」というのは、大体こんな感じのことだと思うのですが、どうでしょうか?

すみません。
ちょっと確認してみたところ、スクリプトでConstraintsを削除したArmatureが新規に作成される...というのは、私の記憶違いだったようです。
スクリプト実行後にConstraintsの設定が全部消えてしまうので、自分でArmatureを複製しておいて、そのコピーの方にスクリプトを実行するようにしたので、ちょっと混乱してまったようです。

...と、書いた後でさらに調べてみると、やはりArmatureは新規に作成されるみたいでした。
スクリプトの実行前にArmatureを選択しておく必要があるのですが、Poseモードではなく、Objectモードで選択しておく必要があるようです。
Poseモードで選択した状態では、新規にArmatureが作成されず、作成されたAnimationのIPOはBakeに失敗し、フラットなライン状態になってしまいます。

実は、私の作成しているキャラクターのリグのファイルでは、Armatureの複製の処理でなぜかエラーが起こるので、このスクリプトの作者の方がBrender Artist Forumに投稿された古いバージョンとかを参考にして、スクリプトを改造したものを使っていました。
久しぶりにオリジナルのスクリプトを動かしてみたので、いろいろ混乱してしまいました。
何度もコメントをしてしまい、すみません。

matoさん、はじめまして。
それ、ズバリです!ありがとうございます!

実は自分でブログ書いた後で、調べてBake Constraintsまで行き着いたんですが、Poseモードで動作するものとばかり思っていたので(というかPoseモード以外で実行するとエラーで強制終了してしまっていた)、これは目的のものとは違うと思ってました。

何度か試しているんですが、できる場合とできない場合がありますね(IKターゲットが頂点グループだと失敗?)
肝心のブログの女性のモデルだとできませんでしたが、こんな機能も用意されているとわかって良かったです。ありがとうございました。


Blender操作の画面キャプチャは無編集ですいません^^;。何かの役に立てば幸いです。

またまた、すみません。
やっぱりエラーがでていますか。
「IKターゲットが頂点グループだと失敗?」というのは、そんな感じがします。
TiBraさんのようにプログラムをどんどん書ける方なら自分で書き直してしまうと思いますし、参考になるかわからないのですが、私の改造したものはこんな感じです。

ここから
########################################################
# prior to running script, make a duplicate of a reference (constrained) armature and remove constraints from the clone.
# simplistic example where ref and clone have to be identical with respect to bone names and order
# select the unconstrained armature clone, then shift-select the reference armature object.
# the actual motion of the reference armature's bones will be keyed in the clone's pose ipo


import Blender
from Blender import *
from Blender.Mathutils import *
import struct
import string
import bpy
import BPyMessages
import BPyArmature
from BPyArmature import getBakedPoseData

#=================
# Global Variables
#=================

# set senstitivity for displaying debug/console messages. 0=none, 100=max
# then call debug(num,string) to conditionally display status/info in console window
MODE=Blender.Get('rt') #execution mode: 0=run normal, 1=make test armature
DEBUG=Blender.Get('rt') #how much detail on internal processing for user to see. range 0-100
BATCH=False #called from command line? is someone there? Would you like some cake?

#there are two coordinate systems, the real, or absolute 3D space,
# and the local relative to a parent.
COORDINATE_SYSTEMS = ['local','real']
COORD_LOCAL = 0
COORD_REAL = 1

# User Settings - Change these options manually or via GUI (future TODO)
usrCoord = COORD_REAL # what the user wants
usrParent = False # True=clone keeps original parent, False = clone's parent is the clone of the original parent (if cloned)
usrFreeze = 2 #2=yes, 0=no. Freezes shadow object in place at current frame as origin
# delta is amount to offset/change from the reference object. future set in a ui, so technically not a constant
usrDelta = [10,10,0,0,0,0] #order specific - Loc xyz Rot xyz
usrACTION = True # Offset baked Action frames to start at frame 1

CURFRAME = 'curframe' #keyword to use when getting the frame number that the scene is presently on
ARMATURE = 'Armature' #en anglais
BONE_SPACES = ['ARMATURESPACE','BONESPACE']
# 'ARMATURESPACE' - this matrix of the bone in relation to the armature
# 'BONESPACE' - the matrix of the bone in relation to itself

#Ipo curves created are prefixed with a name, like Ipo_ or Bake_ followed by the object/bone name
#bakedArmName = "b." #used for both the armature class and object instance
usrObjectNamePrefix= ""
#ipoBoneNamePrefix = ""
# for example, if on entry an armature named Man was selected, and the object prefix was "a."
# on exit an armature and an IPO curve named a.Man exists for the object as a whole
# if that armature had bones (spine, neck, arm) and the bone prefix was "a."
# the bones and IPO curves will be (a.spine, a.neck, a.arm)

R2D = 18/3.1415 # radian to grad
BLENDER_VERSION = Blender.Get('version')

# Gets the current scene, there can be many scenes in 1 blend file.
scn = Blender.Scene.GetCurrent()

#=================
# Methods
#=================
########################################
def debug(num,msg): #use log4j or just console here.
if DEBUG >= num:
if BATCH == False:
print 'debug: '[:num/10+7]+msg
#TODO: else write out to file (runs faster if it doesnt have to display details)
return

########################################
def error(str):
debug(0,'ERROR: '+str)
if BATCH == False:
Draw.PupMenu('ERROR%t|'+str)
return

########################################
def getRenderInfo():
context=scn.getRenderingContext()
staframe = context.startFrame()
endframe = context.endFrame()
if endframe<staframe: endframe=staframe
curframe = Blender.Get(CURFRAME)
debug(90,'Scene is on frame %i and frame range is %i to %i' % (curframe,staframe,endframe))
return (staframe,endframe,curframe)

########################################
def scrub(): # scrubs to startframe
staFrame,endFrame,curFrame = getRenderInfo()

# eye-candy, go from current to start, fwd or back
if not BATCH:
debug(100, "Positioning to start...")
frameinc=(staFrame-curFrame)/10
if abs(frameinc) >= 1:
for i in range(10):
curFrame+=frameinc
Blender.Set(CURFRAME,curFrame) # computes the constrained location of the 'real' objects
Blender.Redraw()
Blender.Set(CURFRAME, staFrame)
return

########################################
def bakeBones2(ref_ob,arm_ob): #copy pose from ref_ob to arm_ob
scrub()
staFrame,endFrame,curFrame = getRenderInfo()
act = getBakedPoseData(ref_ob, staFrame, endFrame, ACTION_BAKE = True, ACTION_BAKE_FIRST_FRAME = usrACTION) # bake the pose positions of the reference ob to the armature ob
arm_ob.action = act
scrub()

# user comprehension feature - change action name and channel ipo names to match the names of the bone they drive
debug (80,'Renaming each action ipo to match the bone they pose')
act.name = arm_ob.name
arm_channels = act.getAllChannelIpos()
pose= arm_ob.getPose()
pbones= pose.bones.values() #we want the bones themselves, not the dictionary lookup
for pbone in pbones:
debug (100,'Channel listing for %s: %s' % (pbone.name,arm_channels[pbone.name] ))
ipo=arm_channels[pbone.name]
ipo.name = pbone.name # since bone names are unique within an armature, the pose names can be the same since they are within an Action

return
########################################
## main
ref_ob = Blender.Object.GetSelected()[0]
arm_ob = Blender.Object.GetSelected()[1]
## bakeBones(ref_ob,arm_ob)
bakeBones2(ref_ob,arm_ob)
print 'done'

########################################
ここまで。
あらかじめArmatureを複製しておいて、Poseモードのメニュー「Pose」-「Constraints」-「Clear Constraints...」でConstraintsを削除しておきます。
スクリプトの実行時には、Constraintsなし、Constraintsありの順に「Shift」キーを押しながら両方とも「Object」モードで選択して実行します。
私はこんな感じで使っています。

長くなってしまってすみません。

すみません。上のコメント中のコードのインデントがなくなってしまいました。
自分のブログのスペースにファイルを置こうと思ったら、タイミング悪くメンテナンス中でした。
勝手だとは思いましたが、Blender.jpさんのところでスレッドを立てて、ファイルを置かせていただきました。

http://blender.jp/modules/newbb/viewtopic.php?topic_id=971&forum=5&post_id=4932#forumpost4932

スレッドの記事中で、こちらの記事のURLを勝手にご紹介させていただきました。
もしご迷惑でしたら、本当にすみません。

いえいえ、全然構わないですよ。
 いつか書くとか言っときながら、まだAPIすら呼んだことない初心者以前なので助かります。

ちょっとmatoさんの仕事の速さに僕の検証が追いついてません^^;
処理が完了した後で、新たにできたボーンを消したら落ちるなどよく分からないことが起きていたりで。

簡単なリグなら頂点グループもできるようになりました。複雑なものに関しては相変わらずですが。

残念ながら、スクリプトの中身を見てどうこう言えるレベルじゃないので、お役に立てそうにありません。すいません。

何度も、何度もすみません。
Blender.jpの方に、ちょっと補足説明を書いてきました。
色々とわかりにくいことを書いてしまってすみません。

私は、まだ自力で一からまともにPythonスクリプトを書いたこともない超初心者です。
先ほどのコードも1週間くらい前に、かなり時間をかけてあちこちのコードを切ったり張ったりして、ようやく動くようにできたというのが実情です。
ということで、仕事が速いなんてことはまったくありません。
いきなりコードを張りつけたりして、まぎらわしいことをしてすみません。
もし、このコメントをまったくプログラミングしない人がたまたま見ていて、ConstraintsのBakeってどんな感じか試してみようとか思った場合に、少しは役に立てれば...とか余計なことを考えてしまいました。

初めてコメントさせていただいたのに、どたばたしてしまってすみませんでした。
これからも、ときどきコメントさせていただければと思いますので、よろしくお願いします。

いやー、僕の方でさらにまぎらわしくしてしまったみたいでー^^;
しずしずとやってるもんで、返信も追いつかなくてすみません。

Blenderユーザーで目立つ人は、エンドユーザーに留まらないような人達ばかりですが、僕のように分け分からずともひそひそと使っている人は結構いると思うので、かなり助けになると思います。そもそも付属スクリプトに目がいかないということもあると思いますし。
 最低数のキーフレームでBakeしてくれる、みたいな改良が進むといいですね(願望w

方向性の見えないブログですが、こちらこそよろしくお願いします。


付属スクリプトの使い方が分からない人のためのキャプチャ
http://eyevio.jp/movie/206872

嘘です。テストついでに録っただけです。
改めて記事に書くのも何なんでここに張らせてください^^

またまた、コメントさせていただきます。
モーションキャプチャのデータやゲームエンジンのシミュレーションをBakeしたりしても、1フレームずつびっしりキーフレームが打ち込まれた状態のActionができてしまうので、キーフレームを減らすスクリプトというのも色々あるようですね。
Blenderの標準機能でもIPO Curve Editorの中に「Curve」-「Clean IPO Curves」というコマンドがあって、それぞれのIPO単位でカーブの形状をなるべく維持してキーフレームを減らすことができます。

私は5フレームとか10フレームごとにキーフレームがそろっている状態が編集しやすいと思い、そういうスクリプトを探してみるといくつか見つかったのですが、どれも少しずつ問題があるという感じで、やはりいくつかを組み合わせて改造スクリプトを作っています。
Constraints Bakeのスクリプトと両方まとめて、簡単に操作をキャプチャした動画を作ってみました。
http://vimeo.com/2583276

こちらのURLの先にスクリプトも置いてありますので、もしよろしければ見てみてください。

おお、すばらしい!これぞ実用的っと言った感じですね。

絶対そういうスクリプト誰かが作ってるとは思ってたんですが、標準機能であったんですか。知識の有無って大きいですね・・orz
確かに、服のように細かく動くものは、等間隔に打たれたキーの方が、ヘタに最適化するより、修正し易いかもしれませんね。 スクリプト提供感謝します。大変助かります。

ソフトボディを触りだした当初は挙動を見て楽しむ、くらいしか使い道がなかったですが、やっと実用に耐え得るだけの知識がついたと言う感じです。ありがとうございます。

それでは、matoさんのすばらしい作品が見れることを期待します。
そして、前駆者の知恵を頂いてぬくぬくとさせていt

コメントの投稿

非公開コメント

このブログについて
□ ブログ内容
決まった趣旨はありません。
興味を持ったこと・日常で行ったことを何でも書きます。

3DCG・プログラミングなどが多めです。

★下記のブログに移行しました★
https://tiblab.net/blog/
検索フォーム
ユーザータグ

Blender キャプチャ blendファイル BGE GameEngine Python ムービー Android  CG Red5 Terragen C# C++ 

カテゴリー
プロフィール

TiBra

Author:TiBra
趣味でCG制作、プログラミング等を行っています。メイカーズに憧れています。

ネットを通じた交流を広げたく思っていますので、コメント・メールはお気軽にどぞー

Mail:tibraあっとlive.jp
HP:TibLabmemocode
動画:VimeoFC2動画ニコニコ
ファイル:SkyDrive
企画:3Dゲーム作業実況

Blogリンク
不都合がございましたらご連絡ください。
当ブログのリンクバナー
FC2 ID
FC2カウンター
RSSフィード