Maya Script Python レイヤードテクスチャの入れ替え

import maya.cmds as cmds

def texchenge():
	result = "{0:=^100}\n".format("RESULT")
	result += "\n"+"\n"
	for x in cmds.ls( mat=1):
		if x not in ["lambert1","particleCloud1","shaderGlow1"] :
			result += "{0:-<50}{1:->50}\n".format(x,"Material")
			result += "\n"
			oCon = cmds.listConnections( x, connections=1, source=1, destination=0 )
#			for c in oCon :
#				result += "{0:-<50}{1:->50}\n".format(c,"Connections")
#			result += "\n"
			oCoc = [x for x in oCon if x.find(".color") != -1]
			oCoc = cmds.listConnections( oCoc, connections=1, source=1, destination=0 )
			oCol = cmds.ls( oCoc,type="layeredTexture" )
			oCol = cmds.listConnections( oCol, connections=1, source=1, destination=0, plugs=True)
			oColc = [x for x in oCol if x.find(".color") != -1 or x.find("outColor") != -1]
			oCola = [x for x in oCol if x.find(".alpha") != -1 or x.find("outAlpha") != -1]
#			for c in oColc :
#				result += "{0:-<50}{1:->50}\n".format(c,"LayerdTextureColor")
#			result += "\n"
			oNod,oImg = oColc[0::2],oColc[1::2]
			for o1,o2 in zip(oNod,oImg) :
				cmds.disconnectAttr(o2,o1)
				result += "{0:-<40}{1:-<40}{2:->20}\n".format(o1,o2,"OriginalConnection")
			result += "\n"
			oShif = oImg[1:]
			oShif.append(oImg[0])
			for nod,img in zip(oNod,oShif) :
				cmds.connectAttr(img,nod,f=1)
				result += "{0:-<40}{1:-<40}{2:->20}\n".format(nod,img,"ChangeConnection")
			if oCola != [] :
				result += "\n"
				for na,ia in zip(oCola[0::2],oCola[1::2]) :
					oNum = int(na.split("[")[1].split("]")[0])
					if oNum != 0 :
						oNum -= 1
					else :
						oNum = len(oNod)-1
					result += "{0:-<40}{1:-<40}{2:->20}\n".format(na,ia,"AlphaConnection")
					cmds.disconnectAttr(ia,na)
					na = na.split("[")[0]+"["+str(oNum)+"]"+na.split("[")[1].split("]")[1]
					cmds.connectAttr(ia,na,f=1)
					result += "{0:-<40}{1:-<40}{2:->20}\n".format(na,ia,"ChangeAlConnection")
			result += "\n"+"\n"
	result += "{0:=^100}\n".format("")
	print result
texchenge()

カラーノードに刺さったレイヤードテクスチャの順番を切り替えるスクリプトです。
実行するごとに順番が1つずつ変わります。1番が0番になる。という具合です。
そのレイヤードテクスチャにアルファがあれば、それも1つずつずれるようにしました。無意味に長くなった一つの原因です。
そして、もうひとつの原因はリザルトが出力されるようになっています。スクリプトエディタにプリントされます。
コメントアウト部分「#」だけを消すとリザルトが増えます。好きなように改造してください。

 

そのリザルトで使いましたが、文字列フォーマットの仕様がPython3.0で変更されるそうで、一応それに合わせて書いて見ました。

 

使い方は、コードをスクリプトエディタにコピペして実行すれば使えます。その際はスクリプトエディタのタブを「Python」にしてください。
全文選択して中ボタンでドラッグすればシェルフに登録することができます。
あれ、これってレイヤードテクスチャが無かった時の処理がない、、
ある程度色々な状況を想定したつもりでしたが、一番肝心なところを忘れておりました、、

ZBrush4 – お爺さん2

image930l
世間ではZBrush4R2bが出て、毛の表現などが出来るようになったにも関わらず、いまさらのように毛をスカルプトしております。

 

3Dcoatとの連携を試しているのですが、まだうまく行っておりません。
どうも落ちてしまう。もっと色々とテストする必要がありそうです。

 

「ReMesh All」でも、「Dyna Mesh」でも細かい形がうまく転写できない事があるので、
それを3Dcoatで簡単に補うことが出来たら楽しそうだなぁ、等と考えております。

 

「ReMesh All」も「Dyna Mesh」もどちらを使うにせよ、新たなメッシュは解像度をできるだけ低く設定し、
転写する方が、「SDiv」レベルを高く上げられるので良いかと思うのですが、最初の解像度が低いと指などの形状をうまく転写できません。
うーん、ローカルサブディビジョンを使うのもひとつの手なのかなぁ。
とにかくそのあたりを克服できるように実験してみます。
他の人はどうやっているのだろうか。
ZBrushが当然のように使われるようになると、人によってワークフローが大きく変わってくるかと思います。
人のやっている方法が自分にとっていい方法か分からない。その逆もしかり。
だからあまりワークフローが公開されないのだろうか?それとも自分が英語圏の情報を知らないだけなのだろうか?
謎は深まるばかりだ。
まぁ、やってみよう。

ZBrush4 – お爺さん

image929l
久しぶりにスクリーンショットを撮ろうとしたら、使っていたそれ用のツールの使い方を忘れて手こずりました。
更新も久しぶりです。
いや、このくらいがちょうどいいのかも知れない。
慌てずあせらず、そこそこサボらず続けてゆこうと思います。

 

ZBrushを使えば使うほどに思いますが、これは道具ですねぇ。
完全に物量に脳がごまかされているのを感じます。
今回作っているものは、数日かけてはいるのですが、恐らく始めの数時間とその後の変化はそれほどないかと思います。
初めのうちにきちんと時間をとって、ぱっぱと仕上げてしまったほうが恐らくいい結果になったかと思います。それが中々難しい。
とにかく時間をかけてやってみます。

 

リトポに関してですが、頭部のみのようなまとまった形状では、「ReMesh All」でもそれ程問題は無いかと思います。
少し複雑になってくると、「DynaMesh」の方が良いような印象を受けます。
しかし、指などの細かい形状はそれでも無理があるかと思います。要するに大きな形全体に対して、細かい部位があるもの。
そのあたりは3Dcoatと連携するのが良いのでしょうか?3Dcoatは「AppLink」という機能があり、他のツールとの連携が取れるようになっているようです。
とはいっても、ただのスクリプトなので、それ程込み入ったことはできないかと思いますが、ちょっと面白そうです。
modoとの連携を試してみたのですが、現状では、うーん、自分は使わないかなぁ、という感想を抱きました。

 

そう、modoといえば、UVの展開に関して最近分かりましたが、
リラックスを「モード」>「展開」で「反復回数」>「100」くらいで何度か適用した後、
「モード」>「アダプティブ」、「反復回数」>「10」くらいで何度か適用して調整すると、大抵のUVは殆ど歪みがとれてきれいに展開できることを知りました。
それでも綺麗にならない場合はUVを切る場所を変えて同じ手順を踏むと具合が良くなります。
数値を決定し、回数を様子を見ながら行うのが良さそうです。
今度機会があったら、画像入りの解説をします。うーん、こうやって書くとやらないような気がする、、

雑記87 – 訂正

書こう書こう、と思いながらも遅くなってしまいました。
前回の記事で、間違いがあったので修正しました。
言語の発達により、増える色数、という事を書きましたが、増える色はスペクトルと補色の関係により増えてゆく。
というのが正解でした。ちなみに以前はスペクトルだけでした。

 

間違い、ということで最近のホットニュースは、不確定性原理が否定されておりました。
新たな測定方法では、位置と速度を同時に計測することが出来るそうです。
量子コンピュータの実現が迫っているのでしょうか?
基板の上で神経細胞を増殖させることに成功させているので、バイオコンピュータの方が先なのでしょうか?

 

もしそうなったら、と勝手に妄想すると、
パソコンは使えば使うほどに、使っている人にとってより使いやすいものに変化しそうです。
神経細胞の数は変わらなくても、ネットワークの密度が増えることでより性能が上がる。まさしく脳みそです。
道具としての本来の形が再現されそうです。人の使っているパソコンでは作業ができない。なんてこともありそうです。
そのうち意識を持ち初め、パソコンとケンカするようになって、今日はケンカしたから作業が出来ません。なんてことにもなるのかな?

 

まぁ、妄想はそのくらいにするとして、
学問に置ける間違い、以前少し書いたようにも思いますが、現在定説とされているものは、新たな定説が出来ると、崩されます。
要するに仮説なのです。
近代医学の祖とされるヒポクラテスも、元々医者であったデカルトも当時の医療について書いております。
現代の医学からすると、どちらもとんでもなく間違っています。平たく言ってしまうと、嘘を書いております。
両人とも文面からすると、とても誠実な方々だと思います。嘘をつこうと思って書いているのではなく、そう思っているので書いている。のだと思います。
そう考えて、時間軸を反転させると、恐らく数百年後、数千年後の人類が現代の医学を見るとどう思うかが分かるかと思います。
そんな事本気で信じているの?そんな言葉が聞こえてきそうです。

 

更に時間軸をスケールさせるとまた面白い様に思います。
昨日医者にこう言われた。
なるほど、以前どこかで養老孟司さんが書かれておりましたが、医者仲間の方々は皆さん健康診断を受けないそうです。
要するにあてにならない。
文明が進歩し、情報が氾濫し、生活が豊かになる。本当なのかなぁ、等と思ってしまいます。
恐らく石器時代の人類は20歳~30歳くらいの寿命でした。現代の我々は約80歳、数百年後は何歳でしょうか?
200歳くらいに伸びていたとして、その人達が我々に対して、80歳で死んでしまうなんて可哀想、と言われた所で、「そりゃどうも。」としか答えられない。
恐らく、石器時代の人たちもそうだろうと思います。
周りがそうであれば、そんなもんだと諦める。要は相対的な問題でしか無い。
そして、大きく量が変わると質が変わる。同列にして論じるべきではない。と、思います。

 

さて、そんな事を書きながらZBrushをやっております。
3Dcoatを買ったのですが、何をして良いのか分からず、とりあえずボクセルでスカルプとしてみよう、などとやってみたのですが、ZBrushに慣れてしまうとちょっと辛いです、、
うーん、リトポとペイントで使うべきなのだろうか?もっと本腰を入れて探ってみないと分からない。
ZBrush、久しぶりに触ったら、その軽快さに驚く一方、自分の技術の劣化にも驚きました。元々大したものでもありませんが。
とにかくヤル気が出てきてしまったのでZBrushをやっております。

雑記86 – 線形近似

さて、自分なりに得た知識を自分なりに考え、それを表して見よう、と考えておりました。
上から斬り込むか、下から斬り込むか、そんな事を考えながら学んでいたのですが、どうやらそれは上と下がくっついている。
うーん、じゃあ適当に行きましょう。と、いった感じにこのタイトルを選びました。

 

一般的に自然界と呼ばれる、我々の身の回りの環境は、専門的な表現では非平衡開放系、と呼ばれます。
そして、我々生物は事象に対して因果関係を結び、経験則を得、それにより未来予測を行う。という平衡系に近似して把握してきた。
と、言えるのではないかと思います。
 

それを見てゆくには、人間の脳が他と比べてどうであるか、という事が重要であるかと思います。
鳥類は他の動物に比べ、図形の認識に優れていることを以前書いたかと思います。
流石は元々恐竜であった、といわれるだけあって、その歴史が古いせいかも知れません。
そして、鳩と人間に対して同じ実験をした人がいました。
その実験内容は、まずはじめに被験者(?)である鳩と人間に同じ図形を見せます。
その図形とは3つの点が書かれただけのものです。
その3つの点をつなぎ合わせると三角形ができますが、その三角形は歪な形をしている。というものです。

 

その図形を記憶させた後、今度は何枚かの紙に分けて同じような図形を見せます。
その図形はコンピュータで生成されたもので、正三角形を元に徐々に崩れてゆく3つの点で、最初に見せた図形はその内の中間辺りの中途半端なものです。
そして、図形を見せている間、脳神経細胞の発火状態を計測したそうです。
鳩の実験結果はとても優秀で、初めに見せた図形が提示された時に最も強く反応しました。
しかし、人間では初めに見せた図形よりも、正三角形の図形に強く反応を示したそうです。
 

要するにより抽象化された像に対して人間は強く反応する。
抽象化というのは、5つの丸と5つのりんごをつなぎ合わせる、というような作業で、現代社会に生きる我々にとっては必要不可欠な能力、と言っても過言ではないかと思います。
しかし、人間にとってそんな当然のような能力も実は生得的に備わった能力ではなく、経験により作り上げられた能力であることが分かります。

 

というのも、南アメリカで偶然発見された民族に対して行われた実験でも分かります。
彼らに対して、数字の把握能力をテストした実験がありました。
木の板に一本の線を書き、それを真似してもらう。というものです。
3本目まで難なくこなしておりましたが、それ以降いくら数を増やしても、彼らは3本の線しか書かない。
勝手な推察ですが、恐らく彼らにはそれ以上の数字は意味が無い。3つというのは我々が考える3つと言うよりも無限大の記号に近いのかも知れません。
そもそも村の全員の人の名前と顔を知っていれば、数は必要ない。
「昨日は何人来たの?」という質問は「昨日は誰が来たの?」という質問で事足りる。ということなのだろうと思います。

 

また、太平洋に浮かぶ島々で言語の進化を研究した人がいました。
その中で、文明度の低い言語を使っている民族はより色の数が少なくなっていることに気が付きました。
そして、最も少ない色数は3色で、黒白赤だそうです。(黒と白の順番は不確かです。すみません)そして次に増える色が緑、青、黄色、と続きます。
恐らくこれは人間の視神経であり、明暗を区別する杆状体細胞と呼ばれるものが中心近くにあるから、白黒がはじめに来るのかと思います。
そして、その後の色の順番はスペクトルと補色の関係に相当します。波長が長いほうが見えやすいのでしょうか?
では、色数の少ない民族は青をどのように表現するかというと、薄い赤、だそうです。
我々からすると、そこまで丸めちゃうの。とちょっとビックリしますが、同じ脳を持っている我々も程度の差こそあれ、近似で丸めております。
五十歩百歩、といったところでしょうか。

 

この辺りは、脳の可塑性と臨界期という、ものに関わってきます。
生物学者によっては10万年前の人間を現代に連れてきても、それが子供であれば恐らく現代に対応できるであろう。という人もいます。
それはニューギニア地方で近代化したところから飛行機のパイロットになった人もいる、という事を指して書かれておりました。
脳の臨界期とはある年齢に達するまでにそれを習得しないと、その後その能力を獲得するのが難しい。とされる時期です。だから子供には未来がある。
狼少女、少年と呼ばれる、人間に捨てられ狼に育てられた少年少女が言語能力を中々獲得できないのもそのためだろう、と言われております。
そういえば、同じような事象で全く逆の事もあります。幼い時の病気が元で大脳皮質が殆ど無い、という人がいたそうです。
その方はIQ126で大学で数学の賞も取るほどの頭脳の持ち主だそうですが、MRIを取るまで大脳皮質が無いという事実を知らなかったそうです。

 

20世紀に入り、原爆が投下された後、それまで学問の花形だった物理学(量子力学)が衰退して行き脳科学が盛んになって行くのも分かる気がします。

雑記85 – 2011年お詫び

うーん、去年は尻すぼみになってしまいました。

 

幾つかの要素が関連していることは確かなのですが、もはや色々な事象がスパゲッティの様にこんがらがっているような感じです。
すみません、個人的な感想です。
そんな時は、全体を見ずに一つ一つを丁寧に根気よく解いてゆくのが一番のように思いますので、そうします。

 

まずは言い訳から。
雑記を書く上で自分なりに得た知識を多くの人と共有しても良いんじゃない?くらいの気持ちで始めたかと思います。
そして、軸として養老孟司さんの唯脳論を置いて、展開してゆくことを考えておりました。
しかし、その中でも色々とこんがらがり、分けて書くのが難しくなってしまった。面倒くさくなった。という経緯になります。
更には自明のことであり、無意味なことである。という事と考え合わせると、中々気力が出なくなるものです。

 

そして、もう一つ大きな事としては、雑記中に他の方のサイトの引用などをしております。
自分にとっては、昔から一方的にお世話(読ませていただいて)になっており、気分としては諸先輩の胸を借りる、位に思っておりましたが、
よくよく考えてみると、その方々は自分を知らず、しかも仮名で書いているので、もしかしたらとてつもなく不快な思いをさせてしまったのではないだろうか?
という事に、後になって気が付きました。
その後も、何度かこのようなことを書こうかと思ったのですが、ただのうぬぼれだろう。とこれもまた書けない理由になりました。
なので、年が明けた、という理由にかこつけて、一層の事謝ってしまおう。という気持ちになりました。
もし、不快な思いをさせてしまっていたら、誠に申し訳ありませんでした。

 

記事の内容も、それに続いて更に反転させて提示してみる。という事を考えていたのですが、それすらも書かずじまいになってしまいました。
重ね重ねすみません。
個人的には、特に誰かを批判しよう、という気持ちはなく、物事の普遍性、多様性を探って、それらを考えてみる。
という何の生産性もない事がしたいだけです。
うーん、ちょっとすっきりした気がする。デトックス、というやつでしょうか。

 

そして、今後の方向性ですが、年末に意を決して3D-coatを購入しました。
それの習得をしてゆきたいと思います。
そして、Pythonです。やはり、リスト内包表記やlambda関数、面白いですねぇ。手品を見ているようです。
いやぁ、本当にやらなくてはいけないことはそれじゃないんだけどなぁ、と思いながらも興味のあることから手をつけてゆきます。
そんな感じですが、今年も宜しくお願い致します。

PyScripter

PyScripterというものを見つけました。
Pythonの本を買ってちょっと本格的に勉強しようと思ったら、その本で紹介されておりました。

 

どこかで見た名前だ。と思っていたら、modomodeのTakumiさんが既に紹介されておりました。
当時は、自分にとっては縁のない高度なものだろう。と決めつけておりましたが、なるほどPythonを組むにはとても便利そうです。
プロンプトを使わないでもPyScripterからデバッグができます。
ただ、純粋にエディタとなると、やはりサクラエディタの方が軽快で、自分には向いているようです。

 

そういえば、3Dcoatがキャンペーン中で、2万円しない値段で買うことができます。
ZBrushを買おうとお金を貯めておりましたが、どうも3Dcoatを買ってしまいそうです、、
ペイント機能、ダイナミックサブディビジョン、リトポにUV編集、色々と使ってみたい機能がもりだくさんです。

 

スクリプトに3Dcoatにと、そんな事をしている場合じゃないだろう。
とは思うのですが、興味があることをやるのが一番、そう自分に言い聞かせてふらふらしております。

 

うーん、自分も人の役に立つようなスクリプトを作らなければ。

雑記84 – ローマ時代の建築と現代の建築から

以前建築の事について書いたので、ローマ時代の建築との比較から現代を見てゆきたいと思います。
塩野七生さんが書く所によると、ローマの建築の原点というべきものは、ローマの領土がその周辺地域に限られた時に既にできていたことを指摘しております。
当時執政官だったアッピウスは窪地で水の豊富なローマにわざわざ水道橋を引き、塩を取るために街道を整備した事がそれである。と書かれております。

 

先日偶然テレビを見ていると、偶然ローマの建築を特集しているものを見ることが出来ました。
そこでは、ローマが絶頂期に差し掛かったネロの時代を中心に描かれておりました。
皇帝ネロといえば、塩野さんの書き方だと、目立ちたがり屋の情緒不安定な青年、という印象を受けます。
彼は自ら楽曲を作り、市民を集めてコンサートを開いたりもしました。
芸術家を自認し、建築にも色々と口出ししていたようです。
そんな彼が暴君と呼ばれる理由は、彼の考案した建築計画にあり、ローマの中心地に巨大なドムス(個人宅)の建設にあったことを指摘されていたかと思います。
その予定地が突然の火事により消失し、住民を立ち退かせる必要が無くなりました。
市民の間からは皇帝が意図的に起こした火事ではないか、という噂が立ち、それまで人気者でチヤホヤされていたネロは
市民たちの反応に戸惑い、その火事を当時まだ圧倒的な少数派であり、異端であったキリスト教徒に押し付け、彼らを虐殺しました。
そして、その後キリスト教徒により暴君と綽名されるようになった。
歴史上もっと人を殺した人がいるだろうに、たった100人そこらで暴君と呼ばれるには少し可哀想だ。と塩野さんは書かれていたかと思います。

 

塩野さんはネロに対して、外交と経済面に関して十分に皇帝としての責務を果たした。と評価されていたかと思います。
しかし、どうやらネロは建築に対してもそれなりの政治手腕を見せたようで、テレビの特集では、
当時火事の絶えなかったローマを作り替えるために、車道を広くし、歩道に現代のアーケードのような柱廊を設置するよう義務付けたそうです。
そして、ローマ周辺から採取されるセメントが大いに使われるようになったのも、この頃のようです。

 

当時の都市部にはドムスという個人邸宅は余程の金持ちしか持つことが出来なかったそうで、大半の人はインスラと呼ばれる集合住宅で暮らしていました。
インスラの一回部分はテナントになっており、工房や商店が入っていたようです。
二階以上が住居となり、階を上がるごとに建築はお粗末なものになり、住んでいる人もそれに比例して所得が下がったそうです。
考えてみれば当然の事ですが、火事などの災害時に最も危険なのは上の階で、エレベーター等が無い時代、最も不便なのも上の階です。
現在では全く逆の事が言えるかと思いますが、先の震災でその当然さが浮き彫りになりました。
行政は建物の一階部分しか責任を持たないそうで、特に高層マンションの最上階に住んでいる方などは場所によっては大分大変だったかと思います。

 

当時のローマの生活を現代に例えるならば、キャンプ場を思い浮かべるといい。という人もいます。
トイレ風呂はなく、外食する習慣が多かったようなので、台所が無い住居もあったようです。ただ、台所はあっても現代のように優先はされません。
料理をするのはあくまでも奴隷の役目です。
汚物を窓から捨てることを禁止する法律もあったことから、公共のトイレに行くのが面倒で窓から投げ捨てていた人もいたのだろうと思います。

 

話がそれました、それたついでに当時のローマの生活を見てみたいと思います。
当時のローマは日本のように、性に対して緩やかで、シャーマニズムが生きる場所で良く見受けられる、生殖器に対する崇拝がありました。
商店の店頭には、青銅などで作られた男性器を模した物がまとまってぶらさがっていたようで、それを鳴らすと縁起が良い。とされていたようです。
そして、それは「ティンティンナーブラ」と呼ばれていたそうです。思わず下ネタか、と突っ込んでしまいそうな名前です。おかしな偶然もあるものです。
そして、食堂によっては、そこで働く奴隷の女性が気に入れば、別室で違うサービスも受けることができたそうです。
ものの価値が違うので、現在のお金の価値と比較することはとても難しいことですが、大体小麦粉一キロ分の値段、がその時の料金だったそうです。
100円から200円と言ったところでしょうか。そうなると犯罪率も経るのかなぁ、などと考えると中々深い問題を秘めています。

 

うーん、随分下品な方向になってしまいました、、建築の話は全く関係ない。
そういえば、前回紹介した「構造デザイン講義」では、911の時に破壊された貿易センタービルについても書かれていました。
その当時、マスコミも報道していましたが、あれだけのものがあれだけ容易く壊れるものか。と自分も考えておりました。
しかし、建築家の中には良くあれだけもったものだ。という人もいるそうです。
というのも、超高層ビルというのは、中央にスティール製のエレベーターシャフトが最も重要であり、
それはスティール製、ということもあり、300度の熱で簡単に変形してしまう。
要するに超高層ビルというのはバラックを積み上げただけのものだ。という人もあるそうです。
なるほど文明が大きくなると大変なものだ。と、そんな文明に生き、思います。

Maya Script Python スキニングウェイトの四捨五入 その2

import maya.cmds as cmds
import maya.mel

def RoundWeight():
	oSel = cmds.ls( selection=True )
	oShp = oSel[0]
	gMainProgressBar = maya.mel.eval( '$tmp = $gMainProgressBar' )
	oVcount = cmds.polyEvaluate( oSel, v=True )
	oSkt = "findRelatedSkinCluster " + oShp + ";"
	oCls = maya.mel.eval( oSkt )
	oMxc = cmds.getAttr( oCls+".maxInfluences" )
	cmds.setAttr( oCls + ".normalizeWeights", 0 )
	oVtx = cmds.ls( oShp + ".vtx[*]", fl=True )
	cmds.progressBar( gMainProgressBar, edit=True,beginProgress=True, status='Now Rounding...', maxValue=oVcount )
	for v in range( len( oVtx ) ) :
		w2 = 0.0
		oWei = cmds.skinPercent( oCls, oVtx[v], ib=0 ,query=True, value=True )
		oJnt = cmds.skinPercent( oCls, oVtx[v], query=True, transform=None )
		while 0.0 in oWei: oWei.remove(0.0)
		oDic = dict(zip(oJnt,oWei))
		i = len(oDic)
		for j,w in sorted(oDic.items(), key=lambda x:x[1]) :
			if i > oMxc : w = 0.0
			w = float( '%.2f' %w )
			if i != 1 :
				w2 += w
				if w2 > 1.0:
					w = w2 - w
			else :
				w = 1.0 - w2
			oDic[j] = float( '%.2f' %w )
			i -= 1
		cmds.skinPercent( oCls, oVtx[v], nrm = False , transformValue=( oDic.items() ) )
		cmds.progressBar( gMainProgressBar, edit=True, step=1 )
	cmds.setAttr( oCls + ".normalizeWeights", 1 )
	cmds.progressBar( gMainProgressBar, edit=True, endProgress=True )

性懲りもなくまだやっております。
pymelの恩恵が殆ど無いため、Pythonに戻しました。
Pymelだと最初の読み込みに少し時間がかかるようです。一度読みこめば速度は変わらないのですが、
恩恵を預っているスクリプトでもないし、ということでPythonに書きなおしました。

 

しかし、相変わらず美しくないソースだ。全然Pythonらしくない。
本を買って勉強するべきか、迷っております。
一応新たな試みとして辞書を使って見ました。他の言語で言う連想配列というやつです。
そして、最も大きな試みとして行った修正があります。
melバージョンのスクリプトを使っていても思ったのですが、細かい値がどうも納得が行かない。
今回自分でそれを参考に作ってみて分かりました。
ウェイトの値の大きさに関係なく、頂点の順番で処理しているから細かいところで誤差が出るのだと思います。(憶測)
なので今回はジョイントのリストとその値のリストをディクショナリにまとめ、値を参照して小さい順にソートして処理をしております。(多分)
まだそれ程デバッグしたわけではないので、確信はありません。済みません。

 

もっと良い方法あるのかなぁ?
とりあえず今度の目標は、できるだけ処理を関数化して、内包表記を使って処理を早くしてみる事かと思っております。
いやぁー、そんな事している場合でもないなぁ、、

追記と修正2011/12/10
すみません、、まともにチェックしていませんでした。
以前のままだとインフルエンスの数を超えてしまう場合があります。
修正版ではインフルエンスの数を超えたものは小さいもの順に削除されるようになりました。
あと、チェックスクリプトも更新しておきます。こちらはもっとまともに動いていない、、

Maya Script Pymel スキニングウェイトの四捨五入

from pymel.core import *
import maya.mel

def RoundWeight():

	oSel = selected()[0]
	gMainProgressBar = maya.mel.eval( '$tmp = $gMainProgressBar' );
	oVcount = polyEvaluate( oSel, v=True )

	oCls = maya.mel.eval( 'findRelatedSkinCluster ' + oSel + ' ;' )
	setAttr( oCls + ".normalizeWeights", 0 )
	oVtx = ls( oSel + ".vtx[*]", fl=True )
	progressBar( gMainProgressBar, edit=True,beginProgress=True, status='Now Rounding...', maxValue=oVcount )
	for v in range( len( oVtx ) ) :
		oW2 = []
		w2 = 1.0
		oWei = skinPercent( oCls, oVtx[v], ib=0 ,query=True, value=True )
		oJnt = skinPercent( oCls, oVtx[v], query=True, transform=None )
		while 0.0 in oWei: oWei.remove(0.0)
		for i,w in enumerate( oWei ) :
			w = float( '%.2f' %w )
			if i != (len(oWei) -1) :
				w2 -= w
				if w2 < 0:
					w = w + w2
			else :
				w = w2
			oW2.append( float( '%.2f' %w ) )
		oLst = zip( oJnt, oW2 )
		skinPercent( oCls, oVtx[v], nrm = False , pruneWeights=0.009, transformValue=( oLst ) )
		progressBar( gMainProgressBar, edit=True, step=1 )
	setAttr( oCls + ".normalizeWeights", 1 )
	progressBar( gMainProgressBar, edit=True, endProgress=True )

Pymelで書いて見ました。といっても、殆どその効用はありません。
ただ、それとは別に今回はきちんと動くようにしました。

 

元々melで書かれていたものを改めてみると、理解できなかった分岐が理解できるようになっていました。
その分岐があるから、一つの頂点のウェイトを合計して1になるのですね。勉強になりました。誠にありがとうございます。
進歩していないように思えても、少しは進歩しているようです。まだまだ先は程遠いいですが、、
もっとスマートな書き方があるかと思いますが、現状ではこのくらいしか出来ません。
使いやすいようにカスタマイズしてください。そしてできれば教えて下さい。

 

このスクリプトはオブジェクトを選択し、実行するとスムーススキニングの値を小数点以下二位までの桁で四捨五入してくれます。
float( ‘%.2f’ %w )の2を1に変更すれば多分小数点以下1位で四捨五入します。試しておりません。

 

いやー、しかし良かった。作ったものがきちんと動くと気持ちの良いものです。
ただ、殆ど人様が作ったものを参考にしているので、有難い限りです。

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

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

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