ニュートラルじゃないやつ一歩前に出ろ。
.
リグのコントローラとかって、初期状態の TRS が 000, 000, 111 であることが望ましいですね。 リセットすればデフォルトポーズに戻る、みたいなね。 XSI 村出身の人間は、これを 「ニュートラル状態」 「ニュートラルポーズの状態」 と言ったりしますね。
XSI の Set Neutral Pose。 素晴らしい機能だったね。 Maya さまにはこれが無いんだよなあ。 Freeze じゃないですよ。 ニュートラルポーズは可逆性のものです。 アトリビュートとして、ニュートラルになるためのオフセット値を保持しているというものです。 Maya さまの Freeze は基本的に不可逆じゃないですか。
それに、Maya帝國の人々はなんでもかんでもこの Freeze をしたがる傾向があるように思えますね。 チュートリアルビデオとかで、 「値が入っていてはいけない。 必ずフリーズして、かつヒストリ削除」 っていつも言ってるもん。
ヒストリ削除はもちろんいいとして、フリーズの方は時と場合に依りますよねえ。 それフリーズしてしまったら、傾きの数値とか分かんなくなるじゃねえかーーーーっ てのが多い。
この無条件フリーズ教の教義は間違っていると俺は思う。 残しておかなければいけない数値も多い。 だからニュートラル状態にしたい時はトランスフォームノード(グループノード)などを親に挟むなどの方が良い場合も多い。 俺は自作の ぬるぬる というツールでやったり、 ys さんのスヴァらしき SiSideBar にモロその機能があるのでそれを使ったりしてます(そういえば、この機能は俺が ys さんにリクエストして搭載してもらったんだっけ? どうだったっけ?)。
で、本題はそれじゃなくて、ええと、ニュートラルになったかどうかのチェッカが欲しかったのですよ。
リグ作業とかやってて、最後に、各コントローラがちゃんとニュートラルの状態になっているかどうかをチェックするツールね。 別にどうということはない、選択したオブジェクトの TRS がニュートラルになってるかどうかを次々に調べてくれるだけのスクリプトです。
いつものように屋良マーティンくんに教えてもらったりしながら書いてみたんですが、こんなんで合ってますかね? 一応、正しく機能しているようには見えるんですが、おかしいところあったら、どなた様でも、なにとぞ教えて下さい。
Python:
# -*- coding: utf-8 -*-
#
# jjjStandForthNonNeutralGuys.py
# ニュートラルじゃないやつ一歩前に出ろ。
#
# オブジェクト(複数可)を選んで実行。ニュートラルじゃないやつだけ選択に残る
import pymel.core as pm
import sys
##########################
def roundVal( inList ):
retList = []
for i in inList:
retList.append( round( i, 10 ) )
return retList
##########################
sels = pm.selected()
motherFuckers = []
if len(sels) != 0:
for obj in sels:
if obj.nodeType() == "transform" or obj.nodeType() == "joint" :
t = roundVal( pm.xform( obj, q=1, translation=1, objectSpace=1, relative=1 ) )
r = roundVal( pm.xform( obj, q=1, rotation=1, objectSpace=1, relative=1 ) )
s = roundVal( pm.xform( obj, q=1, scale=1, objectSpace=1, relative=1 ) )
if not ( t == [0,0,0] and r == [0,0,0] and s == [1,1,1] ):
motherFuckers.append( obj )
pm.warning( obj + u" -- お前一歩前に出ろ。 : " + str(t) + ", " + str(r) + ", " + str(s) )
pm.select( motherFuckers, r=1 )
if len( motherFuckers ) == 0 : sys.stdout.write( u"ニュートラルじゃない野郎はいませんですた。" )
else : pm.warning( u"ニュートラルじゃない野郎を選択しますた。 : " + str( len( motherFuckers ) ) )
ダウンロード jjjStandForthTheNonNeutralGuys.py (1.3K)
こういうことでいいのかなあ。
各オブジェクトの TRS値を取得するのに xform コマンドを使っていますが、relative フラグがほんとに要るのかどうかとか、実はよく分かってません(汗
あと、TRS を持たないオブジェクトを選んでいたらエラーになるので、 nodeType を調べて "transform" か "joint" だったら処理するようにしているつもりなんですが、この2つ以外に TRSを持っている種類のオブジェクトってありますでしょうか? これ実は前から知りたかった。
Light とか Camera は、transform で引っかかってくれるからこれでいいんだけど、joint は TRS 持っているのに、nodeType の分類は transform ではないんんですよね。 joint の他にもそういうタイプのもの、あるかなあ? と思って。 どなた様でも、知っていたらなにとぞ教えて下さい。
さあこのスクリプトを使って、ニュートラルにし忘れているコントローラを見つけよう。 全員きっちりニュートラルになれば、こいつのリグ作業はたぶん終わり。 またひとつクソリグを作ったぜ。 けけけけけけけけ。
リグには2種類しかない。 リグとクソリグだ。
世の中にあふれるクソリグを集めて1冊の本にしたい。 世界クソリグ大全。 愛情あふれるクソリグの解説を書きたい。 俺自身も立派なクソリガーになって、俺のクソリグをその1ページに入れるんだ。 けけけけけけけけ。
.
| 固定リンク
コメント
Floating Point Number (google による:浮動小数点数) は厄介ですね。
数値は二進法に変化んされるから基本的にFloating Pointはだいたい小数点は無限にあると考えれば良いです。
例えば、よくある問題:
b = 0.1
c = 0.2
a = b+c
print a
#0.3
しかし、Pythonは勝手に数値を丸めて表示しているだけなので
print a == 0.3
# False
radians から angle に変換されると更に変な小数点が入ってしまうので、角度を計算する時に要注意です。
正確なfloatingの数値が必要な場合は色々な複雑なやり方がありますが、
僕には必要ないのでいつもRoundで丸めているだけです。
Roundだけで何か不便なことがあるかは分からないけど。
投稿: myara | 2018年5月15日 (火) 12時57分
>print a == 0.3
># False
へえ~ こうなるんだ。ちょっとびっくりしたw 俺なにも知らないんだなw
現在フレームとかスタートとかエンドとか、フレームに関するスクリプトを書くときも、Maya でも XSI でもいつも round しないと半端になるなあ、と思っていたんだよね。 0.1 と 0.2 を足してぴったり 0.3 にならない仕組みは理解してないけど、そういうもんだと思って、round することにします。マーティンいつもありがとん。久しぶりに呑みに行きたいですね。ピスコとか。
投稿: 潤樹 | 2018年5月15日 (火) 13時41分