初めてのPython


買いました。

 

実は前に図書館で借りて勉強しました。
とても参考になったので、いつかは欲しいなぁ、と思っていました。
ダメ元で古本屋に行ってみると、ありました。

 

自分が買ったのは第二版だったのですが、価格を見ると1250円。
これは買わねば、と、内心小躍りして、レジに持って行くと、「2400円になります。」と言われました。
「えっ、でも1250円って、」と裏表紙をめくって値段を見せたのですが、表紙には2400円の値札が貼られていました。
ついつい、通常の古本屋の気分で値段を見ておりましたが、大手ではどうやら違うようです。
店員さんが慌てて偉い人に聞きに行きました。まぁ、この値段で買えるのならば仕方がないかなぁ、と諦めお金を出していると、
「書き込みがあるので、廃棄処分になります。どうしても、というのであれば、105円でお売りすることになります。」
元々1250円で得られていたものを2400円で売るとは厚かましい。などとは一瞬足りとも思わず。
「是非ください。」と買わせて頂きました。

 

前回読んだ感想ですが、ところどころ重複する部分がありますが、全体的に網羅されているかと思います。
自分が最初に買った本が、「みんなのPython」という本でしたが、これは確かに初歩的なことを全体的に説明はされているのですが、
実際の使い方などがなかったりします。
始めの頃は分からなかった事が最近改めて読んでみると、あぁ、そういうことを言っているのか。と理解ができます。

 

これも人間の脳の生理的なものを考えると当然の事ですが、自分の頭の中で当たり前になったことを何も知らない人に説明するのは難しい。
人間を含めた生物は、物事をできるだけ早く理解するために、要素をパターンで認識する癖があります。
人の顔を覚えているのは、その人の顔のパーツそれぞれを正確に覚えているのではなく、大まかなパターンとして認識しています。
なので、見れば直ぐにその人であることが分かっても、文章にするのは難しい。
そもそも言語化するものではない。

 

言語を説明するのに言語化出来ない。とは何とも皮肉なものです。
やればわかる。

 

それは大変便利な機能ではありますが、思い込み、という面も併せ持ちます。
昔は速読できる人が羨ましい。と思い、自分もそれに挑戦してみました。
しかし、今から考えると、それはパターン認識に当てはめているだけで、部分的な名称などはそれなりに記憶できるのでしょうが、
恐らく全体の繋がりなどは、思い込みで繋げてしまうのだろうと思います。
ゆっくり読むにしろ、速読するにしろ、結局は思い込みというバイアスを持った人間の脳が理解することなので、変わらない。
という言い方もできると思います。
だからどうでもいい。と考えるようになりました。

 

とにかくより深くPythonを勉強できる環境が整いました。
第二版ではありますが、105円では文句の付けようがない。
大変ありがたい買い物をさせて頂きました。

ウェイトエディタの更新 その2

また更新してしまいました。
内部的な変更です。

 

Roundでウェイトを四捨五入する際に、設定されているインフルエンスの数を見るようにしました。
以前はつけていたのですが、無くても良いんじゃないか。
と思い、取っていたのですが、ペイントスムースを使うとやはり数を超えてしまうようです。

 

それと、無意味であろう分岐の削除。
何を思って分岐をさせたのか自分でも良く分かりません。自分で書いておきながら身に覚えがない。
意味のないエラーが発生することがあったので、取ってしまいました。

 

機能を後付にし、言語そのものを習得している最中なので、色々とまずいところがあります。
バグ報告、追加機能、あれば善処します。

雑記94 ケミカルマシンか電子回路か

突然ですが、脳みその話です。

 

脳科学では脳の本質は化学反応にある、という人もいれば、そういったものはコンピュータにおける
回路内での分子の量子的な振る舞いで、それらが違っていても計算は変わらないのと同じように、電子回路である。
という人もいます。

 

脳が薬品によって作用されることは、麻薬や抗鬱剤でも分かります。
近年ではアメリカにおいて、抗鬱剤が効かなくなった患者に対して頭骨越しに磁気を当てることで治療する方法が流行っているそうです。
磁場が発生すれば、電場が発生する。と言うことのようです。

 

脳神経細胞であるニューロンは3つの部位により構成されています。
大本である細胞体、そこから植物の根のように伸びる樹状突起、そしてこれまた植物の茎のように伸びる軸索。
軸索の先にはシナプスと呼ばれる植物の花のような房が多数付き、別のニューロンの樹状突起に接続される。
接続といっても完全にくっついているわけではなく、少し離れている。
細胞体から発せられた電気信号が軸索を伝わり、シナプスに到達すると、そこにあるシナプス小胞が破裂し、化学物質を放出し、
次のニューロンの樹状突起へと信号が伝わる。
薬を飲むと変化が起こるのはその際に受信される化学物質に変化が起こるからだと思います。

 

記憶がどこに存在するか、長年の謎ですが、ネットワークの構造そのものが持つ部分と化学物質として保存されている部分があるのだと思います。
電気では直ぐに消えてしまう。

 

以前五感について書きました。また補足して書きます。
人の五感は大きく分けて2つに分けられる。触覚、視覚、聴覚という波や圧力という物理量を計測する感覚器と、
味覚や臭覚といった化学反応を検出する感覚器です。
といっても、辛味や苦味の一部は物理量です。だから個人差が激しい。

 

線形で表現可能な物理量はリバースエンジニアリングが容易です。
既に身の回りにある様々なセンサーを見れば分かります。
それに対して化学反応は難しい。しかし最近ではアメリカ軍の開発した爆発物検出器は嗅覚のリバースエンジニアリングだそうで、
東京ドームに水を満たし、その中に角砂糖一つを入れた程度の濃度を検出できるそうです。
 

話がそれました。
味覚と臭覚は大脳辺縁系と呼ばれる、脳の中でも古い方の部位に接続されている。
人間の脳が大きい、といっても新皮質の部分が大きいだけであって、辺縁系は他の動物と大して違わない。
だからそれらの感覚器で受診したものは、新皮質の機能の一つである、言語化が難しい。
人間の嗅覚も実は大したものだそうで、鍛えれば犬に近づけるそうですが、視覚情報に重きを置くので中々そうは行かない。
味覚という点では、面白いことに年によって差が出てくる。
味蕾と呼ばれる味覚器は他の神経細胞と同様、年とともに減少します。
なので、感覚器という点においては子供のほうが優れている。だから子供は甘いモノが好きで、苦いものが苦手なのだろうと思います。
感覚器の減少、脳による情報の蓄積それらが合わさると、苦味や渋みの良さが分かるようになる。

 

ああ、話が戻らなかった。
生命が始めて手に入れた感覚器は嗅覚だと言われております。
要するに我々生命体が始めて外界を知覚したのは化学反応だった。と言う事です。
そしてその検出器の面白いところは、化学物質と検出器は古めの鍵と鍵穴のような関係にあり、同一の化学物質のみを検出するのではなく、
ある程度形があえば、違う物質で合っても鍵穴に入ってしまう。といういい加減さを持っています。
その中でも無臭の化学物質、フェロモンも嗅覚によって知覚されます。統計的な有意性が認められ、ドミトリー効果という名前が付けられた現象は、
同じ職場で働く女性、同じ部屋で生活する女性の月経周期に同期が見られたそうです。
哺乳類そのものがフェロモンを使った通信を行うので、当然といえば当然のようにも思います。
そういえば、養老孟司さんがどこかに書いておりましたが、好き好んで満員電車という同種が同じ空間に集まる哺乳類はそういない。
そのストレスがフェロモンとなって電車に充満する。だから都会の人間は頭がオカシイのだろう。そんな事を書かれていたように思います。

 

電気と化学物質、どっちも都合よく使ったんじゃないかな?
進化の歴史を紐解くと、身近にあるものをその場しのぎで使ってゆく。そんな場面しかありません。
散々書いておいて何ですが、どっちでも良くないか。と思います。

ウェイトエディタの更新 その2

ウェイトエディタを更新しました。
同じシーンに同じ名前の構造がある時に、リストに表示される名前が長くなるのを回避します。
「LongName」のチェックボックスを入れると長い名前の状態を確認できます。
デフォルトではオフです。
それに伴い、今までジョイント名でウェイトの値を取得していましたが、リストの順番で取得します。
複数のモデルで、インフルエンスが違う場合は意図しないウェイトを編集することになるので注意してください。
逆に違うジョイントの値を同時にいじることが出来ます。もっともそんな使い方はしないと思いますが。

 

部分コピーの機能を入れてみました。
同じ構造で一部のウェイトをまるごとコピーする時に使います。
まず、コピーされる側のコピーされたい頂点を選択し、「Memory」ボタンを押します。
次に、コピー元のメッシュを選択し、コピー先のメッシュを選択したら、「PratCopy」ボタンを押せばコピーできます。
やっていることは、標準機能のウェイトコピーを使っていますが、一部だけに限定するため、
一度ウェイトをコピーしてその後、元のウェイトを入れなおしているだけです。なので遅いです。
アンドゥを使う方法も考えたのですが、うまく行かなかったので手堅い方法を取りました。

 

選んでいる頂点数が膨大になると、編集の処理がとても遅い問題を解決しました。
これも元のmelを参考にしました。
なるほど、同じジョイントで同じ値であれば、頂点はリストで入れても入るのですね。勉強になります。

 

Pythonの本を新たに買いました。
上級者向けです。
まだまだ至らないようです。
マルチスレッドのやり方を見つけました。これで四捨五入も高速化出来るか、と試してみました。
こんな書き方じゃないよなぁ、と思いつつもとにかく実行してみました。
Mayaが落ちました。
今までに見たことのない落ち方をしました。がっくりするよりもMayaを倒したような気になってしまいました。ちょっと嬉しい。
いや、喜んではいられない。マルチスレッド実験してみよう。

ウェイトでディタは、こちら

雑記93

Pythonばかりにうつつを抜かす毎日です。
これはまずい。とZBrushを起動させると、久しぶりにスカルプとしたくなりました。
なっただけで、やってません。

 

今はPythonの正規表現を学んでいます。
その前はMayaのスキン情報のインポート、エクスポートを作ろうか、とPickleを使って試してみました。
とりあえず、ジョイント名、各頂点のウェイト情報、ワールドのX,Y,Z座標、UV座標。
をエクスポートする実験をしましたが、既存のmelよりも遥かに遅い、、
cPickleだからぶっちぎりに早いのだろう。とワクワクしながらやってみましたが、無残にも夢敗れました。
Pickleだと改行が増えるから遅くなるのでしょうか?そもそもPickleを詳しく知らないので分かりません。
ともかくヤル気を無くしました。それで正規表現をやっております。

 

うーん、どうやったらPythonのクラスとOpenMayaを勉強できるのだろうか。
melやMayaのAPIについて書かれた本があるようですが、既に絶版で中古で2万五千円もするようです。
そんなお金があったら、と考えてみますが、思い浮かばない。特に欲しい物がない。
あぁ、Pythonの本がほしいかな。

雑記92 複雑系 その3

最近はPythonをMayaで使うことにハマってしまい、めっきり雑記をかかなくなりました。
久しぶりに気が向いたので書いてみます。

 

どうも複雑系の本を読んでいると、宗教や歴史に当てはめて考えてしまいます。
そして、宗教や歴史の本を読むと脳科学や複雑系を加味して考えてしまい、
脳科学の本を読むと複雑系についての言及が少ないことに少し物足りなさを感じてしまう。

 

どれも一つにして学問にしてしまえばいいのに。そんな印象です。
そういえば、元々科学(サイエンス)というのは明治期にその言葉が入ってきた時に既に分科した学問である。
ということから科学という名前が付いたそうです。
そのまま意訳すると知学という様になるようです。

 

前回自己組織化とべき乗則について書いたかと思います。
どちらも非常に興味深い現象です。

 

最も分かりやすいのが砂山モデルだと思います。
コンピュータ上のシミュレーションで行われた実験ですが、有限な架空の平面上にひと粒ずつ砂を落としてゆく、という実験です。
当然の事ですが、平面の大きさに比例して砂山の大きさが決まります。
そして、その砂山の出来方は初めのうちは殆ど変化はないが、グラフにするとある地点で大きく変化が訪れる。
急激に砂山が形成されてゆく。
一度それが形成されると、指数関数的な変化で大きくなり、やがて変化が全くなくなる。
要するに平面の大きさに比例した砂山の大きさになり、その後その形が維持される。
まさしくロジスティック曲線です。

 

そして、大きさの決まった砂山では大きさを維持するために雪崩が起きます。
その雪崩の大きさと頻度を対数グラフに表すとべき乗則が現れる。
毎回落ちてくる砂は一粒でも、それが起こす雪崩の大きさは予測がつかない。ということを意味します。
砂山自体の形を大きく変えてしまうほどの雪崩が起きるか、一粒の砂が落ちて終わるのか分からない。

 

これはまた自己組織化と散逸構造、というものも表しているかと思います。
散逸構造というのは開いた系を表す言葉で、物質とエネルギーの交換を表します。
砂粒という物質が落下することで維持される形である。ということで良いかと思います。
では、閉じた系とはどういうことかというと、砂粒を落とすのをやめて、その砂山を野ざらしにすることだと思います。
現実世界であれば、それは風雨の影響、動物や人間の影響を受け、やがて崩れてゆきます。
物質の交換はないが、外部のエネルギーに影響される状態、であるかと思います。
人間で言えば、死後に野ざらしにした状態で、やがて朽ち果ててゆく。要するにエントロピーは増大し続ける。

 

ここで興味深いのは、その砂山を砂山だと認識する側の問題も存在するのではないか。という疑問です。
要するに脳科学。
空気中には多数の分子が飛び回っています。その中に水の分子も存在します。
それらがある一定量を超えると、水蒸気となり我々が知覚出来る状態になります。
水蒸気がある、という状態においては、我々が知覚できないところでも存在するはずですが見ることが出来ない。
混雑した駅のホームで10人あつまれば、それを一人として知覚することができる。というように考えると同じ事なのだろうと思います。
いるのかいないのか良くわからない。突然消えたり表れたりする。そんなふうに見えたらちょっと面白そうです。

 

話がそれました。
その水蒸気が空にあれば雲となる。地上では留まることを知らないかにみえるそれは、上空では形を留めて動いているように見える。
雲の形が何に見えるか。子供はそんな事を空想します。
自己組織化は対象物で起きる現象か、脳内で起きる現象か。
子供の空想に付き合うことは出来ます。同じ物を見て同じような感想を持つ。
その雲が車に見えることもあるかと思います。しかし、車種や型番を特定されても分からない。
それは同じようなものは見えてはいるが、各個人による経験というバイアスが加わり、微分してゆくと分からなくなる。
もちろん、車種や型番を特定する。というのはネタ的な状況でしょうが、極論として取り出しただけです。
要するに、見ている形に微妙な変化が存在しうること、それを受け取る脳内で更なる変化が存在しうること、が言えるのではないか、と思います。

 

プログラムをやるようになり、感心することが多々あります。
これは日本語を母国語とする人では作ることが出来なかったものではないのだろうか。そんな事を感じます。
プログラムには変数というものが存在します。
これは普段我々が使用する言葉、より厳密に言うのであれば名詞と言っても過言ではないかと思います。

 

例えると、「りんご」という言葉に対するイメージは人それぞれで違います。
現実に存在する物事を表すにしても、人によって差異がある。日常ではそれは補正されて大抵の場合、大同小異となるかと思います。
しかし、それがはじめから形而上的な事を表していたらどうなるか。
近代科学は微分することで物事の近似解を求め、進化してきました。
思想を微分するとどうなるか、歴史的に近いところで言うと、戦後の新左翼運動、要するに学生運動に表れているように思います。
違いに目を向けると、違いしか見えなくなる。違うものを排除する方向性を持っていれば、自然と内ゲバが発生する。

 

そういえば、仏教では、カルマの負荷によって集まる五積集体である実体は輪廻を繰り返す。と言われております。
その時に同じ物が集まればそれは同じものなのか。という問に大して、
蝋燭の火を消し、再び点けた蝋燭の火は似通って入るが別のものである。という答えを出しております。
これもまさしく観測者の脳内での自己組織化の問題と、対象物の自己組織化が存在している、と言う事が出来るかと思います。

 

久しぶりで詰め込み過ぎた感じです。しかも落ちがない。
また気が向いたら書いてみます。

ウェイトエディタの更新

昨日に引き続き、今日も地味に更新しておりました。

 

昨日の更新では、ジョイントのリストを表示する際に無意味に頂点をループで回していたので、
遅くなっていたところを直しました。
そうしたら、少し不具合が出たのでそれを直しました。
大分高速化出来ました。

 

そして、ウェイトの四捨五入が早くなりました。
前まで各頂点ごとに設定されているウェイト情報をひとつひとつ計算していましたが、
よくよく考えれば、取り出さなくてもリストの合計を見て計算すれば良いじゃないか。というアイデアが浮かび、
実装してみました。
14秒くらいかかっていたものが6秒くらいになりました。
コードもすっきりしました。気持ちもすっきりしました。

Maya Script Python 整数と浮動小数点でのプログラムの実行時間の計測

time
ウェイトエディタを更新しました。
コピペの機能の追加、ジョイント数が多い時にウィンドウが大きくなりすぎる問題を解決しました。

 

その他細かいところをちょくちょく直しました。
一番気になる部分が、ウェイトの四捨五入です。
絶対もっとスマートになると思うのですが、今の自分には出来ません。
せめてもう少し早くならないものか、と色々と考えてみましたが、浮動小数点で計算しているのを整数にしたら
少しは増しになるのではないか?と思いやってみました。

 

今回貼りつけたスクリプトは、Mayaのスクリプトエディタに貼り付け、
オブジェクトを選択すれば実行されます。単一オブジェクトのみの対応です。
で、やっていることは、ウェイトの四捨五入です。

 

2つの関数を走らせ、実行するので頂点数が多くなるとそれなりに大変です。
結果的には同じ事なのですが、片方は浮動小数点(float)で計算をし、もう片方は値を100倍して整数(int)に変更してから計算しています。
実行すると二度同じ事をし、終わるとダイアログに実行速度が表示されます。

 

いくつかやってみましたが、殆ど変わりませんでした、、
若干整数の方が早くなる場合(一秒以下)が多かったので、エディタには整数版を付けておきました。
プログレスバーを取ってしまえば14秒が13秒くらいになったりするのですが、これがないとフリーズしているのか計算しているのかわからないので付けておきました。

 

うーん、悔しい。
なんかもっとスマートな計算方法は無いものだろうか。
それとも、そこまで求めるならばC++で作ってコンパイルしろ、ということなのだろうか。
敷居が高いなぁ、、

Maya Script Python スキニングウェイト情報のコピペ その2

import maya.cmds as cmds
import re

f = lambda x : x.rsplit("|",1)[1] if x.find("|") != -1 else x
oDic = {}

def gkn_weight_paste() :
	if oDic != {} :
		oSel2 = cmds.ls( sl= 1, o= 1, fl= 1 )
		oVtx2 = cmds.filterExpand( sm= 31 )
		oOname = cmds.textField( "Original", q= 1, tx= 1 )
		oCname = cmds.textField( "Change", q= 1, tx= 1 )
		for s in oSel2 :
			oSkt2 = cmds.listHistory( s )
			oCls2 = cmds.ls( oSkt2, type= 'skinCluster' )[0]
			oDic2 = dict([ (x,0.0) for x in cmds.skinCluster( oCls2, q= 1,inf= 1 ) ])
			for v in oVtx2 :
				s = s.rsplit("|",1)[1] if s.find("|") != -1 else s
				v = v.rsplit("|",1)[1] if v.find("|") != -1 else v
				if v.split( "." )[0] == "".join( s.split( "Shape" ) ) :
					for j,val in oDic.items() :
						if oOname != "" and oCname != "" and oDic2.has_key(re.sub( oOname, oCname ,j ,1 )):
							oDic2[re.sub( oOname, oCname ,j ,1 )] = val
						else :
							oDic2[j] = val
					cmds.skinPercent( oCls2, v, nrm= 0 , transformValue= ( oDic2.items() ) )

if cmds.window( "weight_copy_pasteUI", q= 1, ex= 1 ) :
	cmds.deleteUI( "weight_copy_pasteUI" )
wtool = cmds.window( "weight_copy_pasteUI", title= "Gkn Weight Copy Paste", w= 100, h= 100 )
cmds.columnLayout( adjustableColumn= 1 )
cmds.frameLayout( mh= 10, mw= 10, lv= 0 )
cmds.rowLayout( nc= 5, adj= 3, cw5= ( 50, 50 , 10 , 50 , 50 ) )
cmds.text( l= "Original")
cmds.textField( "Original",w= 50 )
cmds.text( l= "" )
cmds.text( l= "Change")
cmds.textField( "Change",w= 50 )
cmds.setParent('..')
cmds.rowLayout( nc= 4, adj= 2, cw4= ( 50, 10 , 50 , 50 ) )
cmds.button( l= "Clear", w= 80, c= ("cmds.textField( 'Original', e= 1, tx= '' )\ncmds.textField( 'Change', e= 1, tx= '' )"))
cmds.text( l= "" )
cmds.button( l= "Copy", w= 80, c= (
"oSel = cmds.ls( sl= 1, o= 1 )[0]\n"+
"oSkt = cmds.listHistory( oSel )\n"+
"oCls = cmds.ls( oSkt, type= 'skinCluster' )[0]\n"+
"oVtx = cmds.filterExpand( sm= 31 )[0]\n"+
"oJnt = [ f(x) for x in cmds.skinPercent( oCls, oVtx, query= 1, transform= None ) ]\n"+
"oWei = cmds.skinPercent( oCls, oVtx, query= 1, value= 1 )\n"+
"oWei = [ x for x in oWei if x > 0.0 ]\n"+
"oDic = dict( zip( oJnt, oWei ) )"))
cmds.button( l= "Paste", w= 80, c= ("gkn_weight_paste()"))
cmds.setParent('..')
cmds.showWindow( wtool )

複数ある筒状のメッシュのウェイトを編集する際に、一つの筒を編集して、他のメッシュにコピーできたら楽だな。
という不精な思いで作りました。
スクリプトを実行すると、ウィンドウが表れます。「Original」と書かれている所にリネームしたい文字を入力します。例:「A」
「Change」と書かれている所にリネーム後の文字を入力します。例:「B」
ウェイト情報を持った単一の頂点を選択し、「Copy」ボタンを押します。
ペーストしたい単一、もしくは複数の頂点を選択し、「Paste」を押すとリネームされた情報がペーストされます。

 

リネームに正規表現を使ってみました。同じ単語には一度しか反応しません。
コピーする時はウェイト情報の入ったインフルエンスの名前しか取得しません。
ペーストする際は、選択されたメッシュのインフルエンスを参照し、同じインフルエンスもしくはリネームして同じ名前になるインフルエンスが
無い限りはペーストできません。
それ以外のインフルエンスには強制的にゼロが割り振られるので、1を超えることは無いかと思います。
コピー元のウェイト情報の合計が1以下の場合は問題があるかと思います。その場合はコピー前に丸めておいてください。

 

作っていて思ったのですが、ペーストはグローバルの変数を見ればいいのだから関数でも良いんじゃないか。ということで関数化しました。
その後、コピーも変数に関数を入れてしまえば、動作自体は関数でいいんじゃないか。と関数化してみましたが、出来ました。
しかしこのスクリプトではそれをしていません。
ボタンコマンドで、複数のコマンドを書くときには「\n」を書いてコマンドを列挙すると実行できる。ということを備忘録的に書いておきたかったためです。
ただ、それでは「for」文を回すことが出来なかったので、リスト内包表記とラムダ関数、三項演算子を使うことで同じことができました。
今まで長ったらしく書いていたものが簡単に書けました。

 

Python3では標準で辞書内包表記が出来るそうですが、それ以前ではできないが同じ事は出来る。ということも知りました。
それを使って、ペーストするメッシュのインフルエンスで新たな辞書を作成し、値にゼロを設定し、必要なところだけコピー元の辞書と
置き換えているので、合計が1を超えることが無くなった。
三項演算子、正しくは条件演算子というそうですが、便利ですねぇ、他の言語と書き方が違うようですが、自分はPythonしか知りません。
コピーもペーストも関数化出来たので、以前作ったエディタに組み込んでみました。
そのエディタですが、選択したメッシュに設定されているインフルエンスを参照してウィンドウの大きさが変わるのですが、
骨の数が多すぎると画面からはみ出てしまうことが判明し、その部分を修正中です。
インターフェイスは面倒臭い。

Maya Script Python ウェイトのコピーその2

import maya.cmds as cmds

oJnt2 = []
oSel = cmds.ls( sl= 1, o= 1 )[0]
oSkt = cmds.listHistory( oSel )
oCls = cmds.ls( oSkt, type= "skinCluster" )[0]
oVtx = cmds.filterExpand( sm= 31 )[0]
oJnt = cmds.skinPercent( oCls, oVtx, query= 1, transform= None )
for oJ in oJnt :
	if oJ.find("|") != -1 :
		oJ = oJ.rsplit("|",1)[1]
	oJnt2.append( oJ )
oWei = cmds.skinPercent( oCls, oVtx, query= 1, value= 1 )
oWei = [ x for x in oWei if x > 0.0 ]
oDic = dict( zip( oJnt2, oWei ) )
print "{0:-^60}".format( "CopyWeight" )
for k, v in oDic.items() :
	print "{0:_<30}{1:_>30}".format( k, v )
print "\n\n"

以前記事で書いたウェイトのコピーペーストの違うバージョンです。
コピーする際に設定されているインフルエンス全ての値を取得するのではなく、
値が入っているものだけコピーします。
なので、コピー元のオブジェクトに設定されているインフルエンスと、
コピー先のオブジェクトに設定されているインフルエンスが違っても無理やりペーストします。
なんだかまずいような気もしますが、一応動作確認はしました。
ただ、保証はしません。
無理矢理でもいいからとにかくコピーしたい、という時に使ってみたら使えました。
 

そういえば、Pythonは変数に何でも入れられてしまいます。
型の宣言が無いので、入れ替えも自由です。
ふと思ったのですが、独学で体系だった勉強をしていないので、自分の作るものは変数の名前の一貫性が殆どありません。
同じ処理をするのにコピーして使うと、使えない場合が多いのです。今さらながらに困った、、

 

よくよく考えてみれば、英語などのラテン系の言語では複数形が存在し、sを付けることでそれを表す。
なるほどただの文字列とリスト(配列)でsの有無でそれらを判別するようにすれば、分かりやすい。
もちろんsである必要はないが、それを使わない理由もない。
日常使う言語に思考が左右される。当然といえば当然の事を理解しました。

 

さらには、そういった言語では単体を示すのにaなどの文字を当てます。
プログラムでは必要ありませんが、日常ではあればそれなりに役に立つのだと思います。
しかしまた、それがあるせいで言葉に縛られる。なるほど一神教が普及するわけだ。と妙に納得してしまいます。
これからは変数の名前に気をつけよう。

アニメーションが親切に解説されております

レンダリング、ライティングの基本が分かります

図版が見やすい美術解剖書です