LW2015から搭載されたGENOMA2は意外と便利なんです。
でも複数のボーンのプロパティ変更が一度にできないのが不便。特に色が一括で変更できないのが不便すぎ。
という訳で、以前からGENOMA2の仕様がどこかにないか色々と探していたのですが、今になってLWのプラグインフォルダ内のサンプル(plugins/scripts/Python/Layout/Generic/)にある「convert_tags_to_nulls.py」内にヒントを見つけまして。
なんらかのポリゴンタグが埋め込まれてるのは分かっていたものの、タグ名がずっと不明で困っておりましたが、どうやら"GM00"〜"GM10"というタグに入っていることがわかりました。
ということで、ポリゴンタグ情報を読み書きできるPythonで、GENOMA色を一括で変更するスクリプトを作ってみました。
http://handtomouse.sblo.jp/article/184191445.html
今まで使っていたLScriptでは、色々と制約が多く断念していたものも、Pythonだと出来ると分かりましたので、ついでに選択したボーンからウェイトを選択するスクリプトも作りました。
これも昔からずっと欲しかった機能なのですが、むしろ無い訳がない機能だと思いますので、私が知らないだけで他に方法があるのかもしれません。が、まぁPythonのサンプルにはなると思いますので、一応公開しておきます。
しかし、今回初めてPythonを触ってみましたが、配列の扱いが劇的にエレガントですね。
配列処理が必ず絡んでくるCG系のソフトでスタンダートになってる意味がよくわかりました。
カッコがないのも私のように雑に組んでいく人間にはトラブルになりにくくて良いです。
なのにネットで探してもLightwaveのPythonスクリプトが本当に少ない。
結構オススメなので、皆さんも自動処理にぜひ使ってみてほしいと思います。
ただ、ドキュメントが英語のみで、しかもまとまってないんですよねぇ…
とりあえず私は、SDKの文書とLWPY、あとOD ToolsのOliverさんのチュートリアルムービーが参考になりました。
2018年08月17日
ぱいそんなのです。
posted by htmmovie at 13:47| Comment(6)
| CG
素晴らしいスクリプトを公開していただいてありがとうございます。
公開されているスクリプトを元にgenomaのプロパティーをボーンからNULLに変更しようと考えたのですが、LWID_のどの値かなどがわからなくて難儀しております。
そのあたりの情報はどこを調べればわかりますでしょうか?
ご教示いただけたら幸いです。
管理者の栗栖です。
しょぼいスクリプトですが、お役に立っているのであれば良かったです。
GENOMAのタグに関して、ネットには情報はありません。(^^;)
私が以前調べた分には、GM00からGM10までが埋め込まれており、ざっくり以下のようになっているみたいです。
【Genomaタグ一覧】
GM00 未使用?
GM01 ItemInfo
GM02 motion options
GM03 BoneOptions
GM04 ExpressionsChannels
GM05 Script
GM06〜GM09 未使用?
GM10 未使用?
それぞれのタグ内にズラ〜っとパラメーターが並んでいるので、どれがどの値かはスクリプトから読み込んだ数値とGENOMAに設定した値を比べて解析していくしかありません。
が、上記のタグさえ分かっていれば、それほど難しく無いと思います。
以上、お役に立ちましたら。
やはり情報ないのですね・・・
自力で調べてみます^^;
なんとか自力で調べて数値を変えるところまではできました。
しかし値を設定しただけでは、モデラー上での形状は見た目の変更がされないようです。
何かしらのコマンドが必要なようで、目的は半分くらいしか達成できませんでした^^;
ご迷惑とは思いますが、もし同じようなことで悩んでいる人のために修正したコードをはらせていただいてよろしいでしょうか?
不要でしたら消してください。
import sys
import lwsdk
__author__ = "Nao_Kuris"
__date__ = "July 24 2018"
__copyright__ = "Copyright (C) 2018 Hand to Mouse."
__version__ = "1.0"
__maintainer__ = "Nao_Kuris"
__email__ = "www.hand-to-mouse.jp"
__status__ = "Modeler"
__lwver__ = "2015"
class krs_Set_GENOMA_Color(lwsdk.ICommandSequence):
def __init__(self, context):
super(krs_Set_GENOMA_Color, self).__init__()
def fast_poly_scan(self, poly_list, poly_id):
poly_list.append(poly_id)
return lwsdk.EDERR_NONE
# LWCommandSequence -----------------------------------
def process(self, mod_command):
mesh_edit_op = mod_command.editBegin(0, 0, lwsdk.OPSEL_USER)
if not mesh_edit_op:
print >>sys.stderr, 'Failed to engage mesh edit operations!'
return lwsdk.AFUNC_OK
lwMF = lwsdk.LWMessageFuncs()
polys = []
edit_op_result = mesh_edit_op.fastPolyScan(mesh_edit_op.state, self.fast_poly_scan, (polys,), lwsdk.OPLYR_FG, 1)
if len(polys) == 0:
lwMF.info("Error", "No item selected.")
mesh_edit_op.done(mesh_edit_op.state, edit_op_result, 0)
return lwsdk.AFUNC_OK
genoma_info = mesh_edit_op.polyTag(mesh_edit_op.state, polys[0], lwsdk.LWID_('G','M','0','1'))
if genoma_info == None:
lwMF.info("Error", "No GENOMA Tag existing in this item.")
mesh_edit_op.done(mesh_edit_op.state, edit_op_result, 0)
return lwsdk.AFUNC_OK
colorList = ['Black','Dark Blue','Dark Green','Dark Cyan','Dark Red','Purple','Brown','Gray','Blue','Green','Cyan','Red','Magenta','Orange','White']
skColList = ['Black','DkBlu','DkGrn','DkBlu','DkRed','Purple','Brown','Gray','Blue','Green','Blue','Red','Magen','Orang','White']
skTypeList =['Bone','NULL','Joint']
shTypeList =['Normal','Box','Ball','Pyramid','Diamond','Tetra','Ring','Grid','None']
ui = lwsdk.LWPanels()
title = 'Set GENOMA Color v%s' %__version__
panel = ui.create(title)
c0 = panel.popup_ctl('Genoma Color',colorList)
c0.set_int(8)
c1 = panel.popup_ctl('Skelgon Type',skTypeList)
c1.set_int(0)
c2 = panel.popup_ctl('Shape Type',shTypeList)
c2.set_int(0)
if panel.open(lwsdk.PANF_BLOCKING | lwsdk.PANF_CANCEL) == 0:
ui.destroy(panel)
mesh_edit_op.done(mesh_edit_op.state, edit_op_result, 0)
return lwsdk.AFUNC_OK
for poly in polys:
skCol = mesh_edit_op.polyTag(mesh_edit_op.state, poly, lwsdk.LWID_('C','O','L','R'))
genoma_info = mesh_edit_op.polyTag(mesh_edit_op.state, poly, lwsdk.LWID_('G','M','0','1'))
gInfo = genoma_info.split("#")
#before status test view.
print>> sys.stderr, gInfo
cIndex0 = c0.get_int()
cIndex1 = c1.get_int()
cIndex2 = c2.get_int()
gInfo[14] = str(cIndex0+1)
gInfo[2] = str(cIndex1+1)
gInfo[16] = str(cIndex2+1)
#after status test view
print>> sys.stderr, gInfo
genoma_info = "#".join(gInfo)
mesh_edit_op.polTag(mesh_edit_op.state, poly, lwsdk.LWID_('C','O','L','R'),skColList[cIndex0])
mesh_edit_op.polTag(mesh_edit_op.state, poly, lwsdk.LWID_('G','M','0','1'),genoma_info)
mesh_edit_op.done(mesh_edit_op.state, edit_op_result, 0)
return lwsdk.AFUNC_OK
ServerTagInfo = [
( "krs_Set_GENOMA_Color", lwsdk.SRVTAG_USERNAME | lwsdk.LANGID_USENGLISH ),
( "krs_Set_GENOMA_Color", lwsdk.SRVTAG_BUTTONNAME | lwsdk.LANGID_USENGLISH ),
( "Utilities/Python", lwsdk.SRVTAG_MENU | lwsdk.LANGID_USENGLISH )
]
ServerRecord = { lwsdk.CommandSequenceFactory("LW_PySetGenomaCol", krs_Set_GENOMA_Color) : ServerTagInfo }
「ボーンからNullに」という部分だけ見て、LayoutでNullにするという話かと思っておりました。
モデラーでのGENOMA設定をNullにしたいという事だったんですね。
GENOMAの見た目を変えるには「SetAppearance」コマンド(Utility>Additionalに入ってます)を使えば出来ますが、これをスクリプトから行いたいという事だとおもいます。
実は以前GENOMAタグを解析しようとタグの4文字をアルファベットで総当りするスクリプトを作った折、アピアランスが変わった経験がありました。
その時は数字を入れずに試していたので、つまりGENOMAタグと見た目のタグは別という事です。
ちょっと興味が出たので、Pythonで総当りスクリプトを書いて割り出しを行って見ました。
結果としては、アピアランスを設定するタグは「APPR」と判明いたしました。
という事で、
mesh_edit_op.polTag(mesh_edit_op.state, poly, lwsdk.LWID_('A','P','P','R'),"Fsupport/genoma/shapes/ItemNull.lwo")
とやれば、GENOMAボーンの見た目をNullに出来ます。
アピアランスの種類は「SetAppearance」コマンドのリストからコピペしてくれば、好きな形に出来ます。
あと、ひとつお願いですが、当方のスクリプトを改造されて公開される場合、最初にある以下の部分はご自分のお名前と作成された日付に変更してください。
__author__ = "Nao_Kuris"
__date__ = "July 24 2018"
__copyright__ = "Copyright (C) 2018 Hand to Mouse."
__maintainer__ = "Nao_Kuris"
__email__ = "www.hand-to-mouse.jp"
でないと、愁さまの改造されたスクリプトも私が責任者になってしまいますので…
あと、スクリプト名も「krs_Set_GENOMA_Color」のままだと私のスクリプトとコンフリクトするので、別の名前に変えてください。(スクリプトの最初の方と最後の方に名前の部分があります)
よろしくお願いします。
おかげさまで希望のプラグインが作ることができました。
自分ではとてもここまでの情報にたどり着けませんでした。
製作者情報の件、大変失礼いたしました。m(_ _)m
公開の際はご指摘の部分を修正いたしたく思います。