2007年11月30日金曜日

blender - 鏡音リン(7)

トゥーンレンダリング以外、あまり興味なくて、モデリングは結構上手くなった気がするのに、レンダリング技術は一向に上がらないので、レンダリング練習。

弱リアルな感じに、、と粘ってみたものの


うーん…。俺レンダリング駄目だ…。リアルに生きよう。
ちなみに、顔の影が許せなかったので、顔だけペイントソフトで修正して、妙な感じになたorz
やっぱモデリングで手を抜いたところは、ダイレクトに反映されますね。。手とか。

追加。上のよりは暗め。顔修正無し版。

2007年11月29日木曜日

blender - python 同じAction一掃

Poseモードで色々動かした後、動かしていないものも全部選択して、InsertKeyして、こんな感じにActionを作ります。


すると、動いていないBoneにも、キーが設定されてます。


この余計なキー(実際にはIpoCurveのbezierPointsの点でした)を一掃するべく、スクリプト書きました。

実行!!

↓結果。





しかし、出来たものの、余計なところを消してないか?また、実用に耐えうるのかどうか、非常に怪しいです。

実行は、Blenderのテキストエディタで開いて、ALT-Pで。

!!!必ずデータをバックアップしてから使ってください!!!

http://render.jp/blender/deleteSameAction.py



import Blender
from Blender import *

scene = Blender.Scene.GetCurrent()
armatures = [ob for ob in scene.objects if ob.type == 'Armature']

# ----------------------------------
# delete same IpoCurves
#
# return list of deleted for print
# [[ipo,curve,index], [ipo,curve,index] ...]
#
# ipos : list of Ipos
# frameNums : list of frame numbers
# ----------------------------------
def deleteSameCurve(ipos, frameNums):
deleted = []
for ipo in ipos:
if (ipo == None):
continue
for curve in ipo:
pre = None
index = 0
for time in frameNums:
# nothing
if (len(curve.bezierPoints) == 0):
continue
# not existed bezierPoint at time
if ([x for x in curve.bezierPoints if x.pt[0] == time] == []):
continue

value = curve[time]
if (pre != None and pre == value):
length = len(curve.bezierPoints)
curve.delBezier(index - length)
deleted.append([ipo, curve, index])
else:
pre = value
index += 1

return deleted

# ----------------------------------
# delete same IpoCurves from Armatures
# see: deleteSameCurve(ipos, framNums)
#
# return list of deleted for print
# [[[arm1's deleted elements], [arm2's], ... ]]
#
# armatures : Object(.type == 'Armature')
# ----------------------------------
def deleteSameAction(armatures):
deleted = []
frames = []
for arm in armatures:
act = arm.getAction()
ipos = act.getAllChannelIpos().values()
frames = act.getFrameNumbers()
deleted.append(deleteSameCurve(ipos, frames))
return deleted

# ----------------------------------
# execute
# ----------------------------------
print deleteSameAction(armatures)

2007年11月28日水曜日

blender - python マテリアル一掃失敗

blenderのマテリアル管理は、「マテリアルからのリンクをすべて消さない限り、マテリアルが消えない」という仕様ゆえ、結構適当になりがちで、気づいたら使ってないはずのマテリアルがリストに入ってるのではないでしょうか?自分は気づいたら、一番最初にBlenderはじめたころのマテリアルが、現在作ってるモデルに入ってたので苦労して消しました。

これをスクリプトで一掃できるようになったら便利だなー。

ということで調べ始めたのですが、予想通り(?)ダメでした。現在のスクリプト仕様では、Nodeにアクセスできないので、Nodeのリンクがどうしても消せないのです。じゃあ、発想を転換して、直接.blendファイルから一掃すればいいんじゃないか?ということでBlenderのソースコードを初☆漁り。

…1時間経過。ファイルフォーマット周辺見てみたんですが、かなり複雑で(あたりまえか)、再帰繰り返して読み込みがんばってる感じでした。しかし、有名なオープンソースのプロジェクトだけあって、コードがきれい。俺は、C言語の1000行以上のコードは、友人の研究の手伝いで扱った、ゴミみたいな、うねりプログラム@先輩が残して行ったものしか見たことないので、あまりの違いようで、軽く感動。

さて、さらに漁っていると、pythonのファイル群の中に「Node.c/h」を発見。おっ!と思って見てみたら、全体がifdef-endifで括ってあって、パッチ当てないと動かないよ、と書いてあった。今後に期待。

というわけで、気長に待ってたら、そのうち中の人がNode対応してくれそう?な感じだったので、諦めましたorz

以下、使ってないマテリアルからリンクを消すスクリプト(未完成)

import Blender
from Blender import *

scene = Blender.Scene.GetCurrent()
meshes = [ob for ob in scene.objects if ob.type == 'Mesh']

# ----------------------------------
# get unused materials
# return list of Material
# ----------------------------------
def getUnusedMaterials(meshes):
# get all materials
allMats = Material.Get()

# delete used material from allMats
for mesh in meshes:
for mat in mesh.getData().getMaterials():
for m in allMats:
if (m == mat):
allMats.remove(m)
return allMats

# ----------------------------------
# delete links from materials
# !incomplete(node links etc)!
# ----------------------------------
def deleteLinks(materials):
for mat in materials:
mat.clearIpo()
mat.clearScriptLinks()
for i in range(9):
mat.clearTexture(i)


# ----------------------------------
# execute
# ----------------------------------

mats = getUnusedMaterials(meshes)
print mats
deleteLinks(mats)

blender - python ポリゴン数表示

ちょっと微妙に忙しくなってきたので、週末まで小ネタ中心でいきます。
最近Blenderハマってるので、インプットが少ないくせに、できるだけアウトプットして行こうと思ってます。

さて、今回は、ポリゴン数計算スクリプトです。
Blenderは右上に頂点の数、線の数、面の数が表示されます。
通常ポリゴン数とは、三角形の面の数を示すそうです。
面は三角形と四角形のものがあるので、面の数は、正確なポリゴン数ではありません。

というわけで、四角形の面は、三角形2つで出来ているので、四角形の面が見つかったら+2、三角形の面だったら+1するだけですね。

以下スクリプト。

http://render.jp/blender/npolygon.py

import Blender
from Blender import *

scene = Blender.Scene.GetCurrent()
meshes = [ob for ob in scene.objects if ob.type == 'Mesh']

# ----------------------------------
# return polygon number
# meshes : list of Blender.Object
# ----------------------------------
def getPolygonNumber(meshes):
num = 0
for mesh in meshes:
for face in mesh.getData().faces:
n = len(face)
if (n == 4):
num += 2
if (n == 3):
num += 1
return num

# ----------------------------------
# execute
# ----------------------------------
print getPolygonNumber(meshes)

分かりやすくifつかったものの、どうせ面は三角形か四角形しか無いので、
num += (len(face) - 2)
としてもOKですね。

Blenderのテキストエディタで開いてALT+Pで実行すると、コンソールにポリゴン数が表示されるはずです。
やってることは、見てのとおり、全メッシュの面を参照してるだけです。
この程度だと、スクリプトよりブログ書くほうが時間かかります…。
こういう自分用ユーティリティー的なのを大量生産して、後でGUI使ってまとめると便利っすな。

次回、多分「メッシュに使ってないマテリアルを一掃する」スクリプト。

2007年11月22日木曜日

blender - Vista は最悪

mac miniでOSX, ubuntu 7.10 desktop, Windows Vistaのトリプルブート+vmwareしていて、
Vistaをメインで24時間駆動させてます。

今日、ふと、うちのmac mini で blender がまともに動かないのは、Vistaのせいでは?と思い、
ひさびさにOSX(tiger)を起動してやってみると、早い早い!!!
さすが、デフォルトでOpenGLな環境だけあります。体感で4倍くらい違います。

ピクセル/頂点シェーダも、Vistaでは全滅だったんですが、OSXだと普通に動きました!!
(GameBlenderのサンプルが全部まともに動いた)

しかし、やはり、ソフトの数が圧倒的に少なく、デュアルディスプレイもダメ、リモートもVNCだからVistaより遅いし、起動は早いけどアプリの起動が遅いような。。メインで使うことは無いけど、Blender用に使ってみようかな。

ちなみに、新しいレオパードではBlenderまともに動かないらしいので注意。

あと、Game Blenderのスクリプト実行したら、普通に動くけど、なんかmallocエラーが出ました。
なんぞこれ。

2007年11月21日水曜日

blender - 骨入った

骨が…



入った~~~!!!



っと。


JDBCに訳が載ってる、腕と足のリギングですが
、腕の指のところのIKは、UseTipをオフにして、ChainLenの値を変えないとダメみたいです。何のことやらさっぱり分かりませんが、
Blenderのフォーラムに良く出来た完成品と解説があるので、自分みたいな横着者は、ありがたくパクりましょう!お手本を完コピして、次から自分で設定できるようになり、そのうち意味が分かれば万々歳ってことで。

しかし、ボーンに頂点割り当てるほうが、かなり時間かかります。短パンめんどいから足と一緒にしたし、もう髪にボーン入れる元気なし…。

blender - トゥーンレタッチ

トゥーンレタッチマテリアルノードという、おもしろそうなのが、
Blender.jpのフォーラムのチュートリアルコーナーにあがってました。
これは凄い!!!
マテリアルノードがメインのネタですが、コンポジットノードも参考になります。

>頂点カラーを利用した、レタッチ可能なトゥーンシェーダ(?)です。
http://blender.jp/modules/newbb/viewforum.php?forum=4


ということで、最初は何のことか分からなかったんですが、元ネタ辿っていくと
驚愕のムービーが見れるので、気になる方は是非。

------
現在骨入れが激しく分からなくて苦戦してます…。

2007年11月18日日曜日

blender - 鏡音リン(6)

歩行テスト。足がすべるって、このことだったんですね…。
strideとかいうの使ってみようかな…。
それか、もう『空を飛べる』という仕様にしてしまおうか。頭にプロペラっぽいのあるしw

まともに動画作るの初めてなので色々大変なことに。
ボーンとか、かなりやっつけ。
エンコード方法が悪いのか、相変わらずシークできないorz
それと、わざわざ影になってるほうにカメラ向けてしまった。

2007年11月17日土曜日

blender - 鏡音リン(5)

ようやくモデリング終わりました。次はアニメーション作ってニコニコにうpするのが目標…。
現在無意味に徹夜してます。現在42時間くらい起きてます。
動かなかったら(=パソコンやってたら)体力消費しないので、案外イケます。
ただし栄養ある食事と、糖分は必要不可欠です。

週末なので、苦手な骨入れを克服しつつ、簡単なアニメーション作成できればと思ってます。


ちょっと細めのエッジになった。

この鏡音リンは、顔とヘッドフォンと腕の数字以外、全部マテリアルで、subsurf lv1かけた状態で 11000 faceです。見えない部分の体なども入ってます。
テクスチャは出来るだけ描きたくないし、描けないですorz
まぁ趣味だし、鏡音リンがかわいければいいと思う。

2007年11月16日金曜日

blender - 鏡音リン(4)

公開されたラフ画に出来るだけ体型を合わせました。
どう考えてもありえない細さですが、そこそこ再現できたと思います。
素人なりにかなり苦労しました…。
体型はこれで決定ということにします。

あと残ってるモデリングは…、
短パンと服とヘッドフォンとベルトとチェーンとマイク。
結構あるな、、。
髪のテクスチャとか描こうとしてみたけど、やっぱ俺テクスチャ下手過ぎてダメぽ。
もうマテリアルでいいや…。

土日で骨入れと簡単なアニメーション作れたらいいなぁ。

それにしてもblenderはトゥーンが何とも言えないボンヤリした感じになります。
何とかしてLightWaveのUnreal見たいに、パリッとした感じにならんかな…。
と思って色々探してたら凄いの発見。↓コンポジットノードを駆使すればできるっぽい。

Normal と Alpha を掛けてラプラシアンフィルタでエッジを抽出して
ColorRamp で色つきの輪郭線をグレースケールにして
Blur でアンチエイリアスされた輪郭線を生成してるんですねえ。
http://www51.tok2.com/home/msa4kudo/nanoha3dcg/index.php?res=53


今度やってみよう…。→やってみた。

WarabiとBlenderのトゥーン比較。


Warabi最高。ってのは置いといて、
Blenderのマテリアルノードとコンポジットノード併用すると、ここまで行けるのか…かなり感動してしまった。上記掲示板の神な人に感謝。

ちなみに、↓こんな感じでやりました。

2007年11月13日火曜日

blender - game blender - python script intro

今回は、blender GEで、pythonスクリプトを実行してみます。
意外に、導入(introduction)サイトって無いんですよね…。やはり最初はhello pythonでしょう。正直pythonって余り知らないですが、class作れてインタプリタで動的型付けだから、まぁrubyみたいなものでしょう。

まず、おもむろにBlenderでtext editorを開き、newして『print "hello python"』と書き、test.pyという名前で保存します。


次に、text editor上で、alt + p を押すと、先ほどのプログラムが実行され、コンソールに出力されます。


さて、ここからが本番です。GE上で実行するには、何かしらのオブジェクトに関連付けないといけないようです。そこで、emptyを1つ追加します。


次に、以下のように設定。入力(マウスの移動やキーイベントなど)が感知されると、pythonスクリプトに渡す、という設定です。
良くわからなかったらblender wikiのチュートリアルへ
http://wiki.blender.org/index.php/Game_Engine



最後に、3D画面で p を押して、実行し、3秒ほどしたら Esc で終了します。コンソールを見ると、ちゃんと実行されてました。



次回こそはマウス入力でぐりぐり(ry

2007年11月11日日曜日

blender - 鏡音リン(3)

今日は日曜なので、数時間モデリング。
ああでもない、こうでもないと、ひたすら微調整を繰り返し、
気づいたら元に戻ってて、「似てる」と「似てない」の間を行ったり来たり。
本当、顔って難しい。

左:after 右before

テクスチャは後で描くとして、輪郭は、もうこれが限界…。
らぶデス2の素体がいかに神かってことが良くわかった。

2007年11月8日木曜日

blender - 鏡音リン(2)

なんとかここまで。相変わらずローポリ気味。

blender - 鏡音リン製作開始

初音ミクは正直あまり好みじゃなかったんですが、
次のボーカロイド、鏡音リンは、かなりジャストミート(ズボン以外)
だったので、早速作り始めました。