スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
引き続き男性キャラクタを作っています。

今回は顔のセットアップをしました。
顔のセットアップには様々なアプローチがあると思います。

今回は、曲線的な動きにしたいためにアゴとまぶたを、
細かく制御しやすくするために眉毛付近を Joint で制御。
それ以外は Blend Shape で制御することにしました。
計算コスト削減のため Fur や Hair は直接生やさずに
毛根用の別オブジェクトを Wrap デフォーマで追従させています。

このようなセットアップをするのは初めてなので
何度か試行錯誤した末に何とかそれらしいものができました。



顔のモデルも少し修正し、口の中もちゃんと作りました。

眉毛付近などの動きなどにまだ気になるところがあったり
ターゲットシェイプの数が少なすぎるっぽかったりするので
またやり直すかもしれません。


何となくアイディアが浮かんだためまたスクリプトを書いてしまいました。
今回は Pymel です。

import pymel.core as pm
import math

def main(max, isGray):
selList = pm.selected()
base = selList[-1]
tgtList = selList[:-1]
nov = len(base.verts)
notgt = len(tgtList)

tgtPosList = notgt*[nov*[0]]
basePosList = nov*[]

pm.modeling.polyColorPerVertex(r=0,g=0,b=0,cdo=True)

for basevtx in base.verts:
basePosList.append(basevtx.getPosition(space='object'))

for i in range(notgt):
for j in range(nov):
tgtPosList[i][j] = (tgtList[i].verts[j].getPosition(space='object'))

if(isGray):
x = math.sqrt(pow(tgtPosList[i][j][0]-basePosList[j][0],2))
y = math.sqrt(pow(tgtPosList[i][j][1]-basePosList[j][1],2))
z = math.sqrt(pow(tgtPosList[i][j][2]-basePosList[j][2],2))
tgtList[i].verts[j].setColor([x/max,y/max,z/max])
else:
v = tgtPosList[i][j]-basePosList[j]
mag = math.sqrt(v[0]*v[0]+v[1]*v[1]+v[2]*v[2])
tgtList[i].verts[j].setColor([mag/max,mag/max,mag/max])


Blend Shape と同じようにターゲット,ベースの順に選択をして
実行をするとターゲットとベースの差分に色がついて表示されるようになります。
第2引数 (isGray) を True にすると白になり、
False にすると X,Y,Z をそれぞれ R,G,B に割り当てた色になります。

20120617_02.png 20120617_01.png


果たしてこれが便利なのかは制作者自身よく分かっていませんが(ぉ、
Pymel の良い練習になりました。
やはり実際に自分で制作をするとスクリプトのアイディアもどんどん浮かんできますね。

そしてこういうスクリプトは多次元配列が扱える分
MEL よりもかなり楽に書くことができます。
しかし実際まだまだ色々と調べながらなので MEL で書くよりも数倍時間がかかってしまいますが
早く慣れたいところです。


次は Cloth の設定をしようかと思っています。
コメント
管理者のみ閲覧可能にする
Profile
HN らい

都内某社テクニカルディレクター
都内某専門学校講師
都内某企業講師
元中国某社S3Dスーパーバイザー
Contact
(ENGLISH OK. 可以用中文。)
Categories
Archives
RSS Link
QR Code