Maya Script Python スキニングウェイトのインポート、エクスポート 3 改造ポイント

今回はスキニングウェイトのインポート・エクスポートスクリプトの改造ポイントを説明したいと思います。
現在公開しているものでは、プログレシブバーが表示はされておりますが、なんだか少しおかしな感じがするかと思います。
その原因は、選択しているメッシュの数をカウントしているからです。

 

頂点をカウントすようにしてしまうと、遅くなるだろう。ということでそのようにしましたが、
そうなると、処理が早いのか遅いのか良くわからない。
なので、コードを公開するのではなく、ここを変更すればいい。というポイントを説明します。
因みに、説明はエクスポートの方で進めます。インポートも基本同じです。

 

まずは9行目

oCount = len(oMeshs)

ここで「oCount」とう変数に選択しているメッシュの総数を入れているので、

oCount = cmds.polyEvaluate(oMeshs,v=1)

と、します。
「polyEvaluate」というコマンドに、リスト(配列)「oMeshs」をフラグ「v(vertex)」を入れることにより、リストに含まれている
メッシュの頂点の数をかぞえることが出来ます。
melでは「-v」だけで問い合わせが可能ですが、Pythonの場合は「=True(もしくは1)」が必要になります。

 

そうしたら、32行目の

cmds.progressBar( gMainProgressBar, edit=True, step=1 )

をカットし、その行自体を削除します。
旧40行目、カットしたので、39行目になるかと思いますが、

oFile.writelines(oWei)

の下の行に、先程カットした文章をペーストします。その時段落の始まりは上の行と同じ(タブ3つ)にしてください。
とりあえず以上で、頂点単位でプログレシブバーが増えるようになります。

 

で、ちょっとした装飾として12行目の

for oMesh in oMeshs:

の文末にカーソルを持ってゆき、改行を行い、

cmds.progressBar( gMainProgressBar, edit=True, status='Now Export...[ '+oMesh+' ]' )

を下の行と同じ段落で追加すると、「Now Export…」の後に現在出力しているメッシュの名前が表示されるようになります。

 

コマンドに使われているフラグ、「v」や「edit」等、省略されたものとそうでないものが混同されておりますが、他意はありません。
前からコピペして使用しているので、そのままなだけです。
後から見て分かりやすくするためには省略しないほうが良いかと思いますが、入力が面倒なので良く省略します。

 

インポート側も同じようにすれば、同じようになります。
リスト内包表記でやる場合は、最終的にリストになるようにすれば大丈夫です。
因みによくよく見返してみると、この内包表現、もう少しだけ短く出来る。
まぁ、どちらにせよ速度は変わりません。それが遅くしている原因でないから。

Maya Script Python スキニングウェイトのインポート、エクスポート 2

改造しました。

import maya.cmds as cmds
import maya.mel

def gkn_skin_weight_export():
	oMeshs = cmds.filterExpand(sm=12)
	if oMeshs == None:
		return
	gMainProgressBar = maya.mel.eval( '$tmp = $gMainProgressBar' )
	oCount = len(oMeshs)
	if oCount == 1 :oCount = 2
	cmds.progressBar( gMainProgressBar, edit=True,beginProgress=True, status='Now Export...', maxValue=oCount )
	for oMesh in oMeshs:
		oShapes = cmds.listHistory(oMesh)
		oShape = cmds.ls(oShapes,type="shape")[0]
		oCls = cmds.ls(oShapes,type="skinCluster")
		if oCls == []:
			cmds.progressBar( gMainProgressBar, edit=True, endProgress=True )
			return
		oCls = oCls[0]
		oJoints = cmds.skinCluster(oCls,q=1,inf=1)
		oJoints = [ x.rsplit("|",1)[1] if x.find("|") != -1 else x for x in oJoints ]
		for oJoint in oJoints:
			if oJoints.count(oJoint) > 1:
				cmds.progressBar( gMainProgressBar, edit=True, endProgress=True )
				cmds.error("Overlap["+oJoint+"]")
		oVtxs = cmds.ls(oMesh+".vtx[*]",fl=1)
		oFileName = cmds.workspace(q=1,fn=1)+r"/gksw"
		oFileName = r"//".join(oFileName.split("/",1))
		cmds.sysFile(oFileName,md=1)
		oMesh = oMesh.rsplit("|",1)[1] if oMesh.find("|") != -1 else oMesh
		oFile = open(oFileName+"/"+oMesh+r".gkw", "w")
		cmds.progressBar( gMainProgressBar, edit=True, step=1 )
		oJoints.append("\n")
		oJoints = ",".join(oJoints)
		oFile.writelines(oJoints)
		for oVtx in oVtxs:
			oWei = [ "{0:}".format(x) if x >= 0.0 else "0.0" for x in cmds.skinPercent(oCls,oVtx,q= 1,v= 1) ]
			oWei.append("\n")
			oWei = ",".join(oWei)
			oFile.writelines(oWei)
		oFile.close()
	cmds.progressBar( gMainProgressBar, edit=True, endProgress=True )
gkn_skin_weight_export()

エクスポートは殆ど変わっていません。重複するジョイントの判定が間違えていたので、正しました。
バグフィックスです。すみません。

import maya.cmds as cmds
import maya.mel
import glob

def gkn_skin_weight_import():
	oMeshs = cmds.filterExpand(sm=12)
	if oMeshs == None:
		return
	oCount = len(oMeshs)
	if oCount == 1 :oCount = 2
	oFiles = glob.glob(cmds.workspace(q=1,fn=1)+r"/gksw/"+"*.gkw")
	if oFiles == []:
		return
	gMainProgressBar = maya.mel.eval( '$tmp = $gMainProgressBar' )
	cmds.progressBar( gMainProgressBar, edit=True,beginProgress=True, status='Now Import...', maxValue=oCount )
	oFiles = [x.split("\\")[1].split(".")[0] for x in oFiles]
	for oMesh in oMeshs:
		oMesh2 = oMesh.rsplit("|",1)[1] if oMesh.find("|") != -1 else oMesh
		if oMesh2 in oFiles:
			cmds.progressBar( gMainProgressBar, edit=True, step=1 )
			oShapes = cmds.listHistory(oMesh)
			oShape = cmds.ls(oShapes,type="shape")[0]
			oCls = cmds.ls(oShapes,type="skinCluster")
			if oCls == []:
				cmds.progressBar( gMainProgressBar, edit=True, endProgress=True )
				return
			oCls = oCls[0]
			cmds.setAttr(oCls+ ".normalizeWeights",0)
			cmds.setAttr(oCls+".envelope",0)
			oVtxs = cmds.ls(oMesh+".vtx[*]",fl=1)
			oFileName = cmds.workspace(q=1,fn=1)+r"/gksw"
			oFileName = r"//".join(oFileName.split("/",1))
			oFile = open(oFileName+"/"+oMesh2+r".gkw", "r")
			oLines = oFile.readlines()
			oJoints = [x for x in oLines.pop(0).split()[0].split(",")if x!=""]
			oJnts = [ x.rsplit("|",1)[1] if x.find("|") != -1 else x for x in cmds.skinCluster(oCls,q=1,inf=1) ]
			for oJoint in oJoints:
				if oJoint not in oJnts:
					cmds.progressBar( gMainProgressBar, edit=True, endProgress=True )
					cmds.error("Not Find["+oJoint+"]")
			if len(oVtxs) == len(oLines):
				cmds.skinPercent(oCls,oVtxs,tv= (zip(oJnts,[0.0]*len(oJnts))))
				[cmds.skinPercent(oCls,oVtxs[i],zri= 1,r= 1,tv= d) for i,d in [[i,[[k,v] for k,v in dict(zip(oJoints,[float(x) for x in oLine.split(",")if x!="\n"])).items()if v!=0.0]] for i,oLine in enumerate(oLines)]]
#				for i,oLine in enumerate(oLines):
#					oDic = dict(zip(oJoints,[float(x) for x in oLine.split(",")if x!="\n"]))
#					oDic2 = {}
#					for k,v in oDic.items():
#						if v != 0.0:
#							oDic2.update({k:v})
#					cmds.skinPercent(oCls,oVtxs[i],zri= 1,r= 1,tv= (oDic2.items()))
				cmds.skinPercent(oCls,nrm=1)
			cmds.setAttr(oCls+".envelope",1)
			cmds.setAttr(oCls+ ".normalizeWeights",1)
			oFile.close()
	cmds.progressBar( gMainProgressBar, edit=True, endProgress=True )
gkn_skin_weight_import()

そして、インポート。
こちらが大きく変わりました。
インポートした「gkw」データに、重複するジョイント名が存在する場合、加算します。
要するに、ジョイントを削除したい時や、影響を無くしたい時、テキストエディタで「gkw」を編集してジョイント名を既存の別のジョイントに名前を変更すると、加算してくれます。

 

そして、少し高速化。
ゼロの値のウェイトを適用する時に、そのまま「transformValue」で設定するよりも、「zeroRemainingInfluences」フラグを使ったほうが
早いのではないか?
と思い、実験してみたところ、やはり早かった。
なので、その方法を採用しました。前回と同じで、コメントアウト部分がベタ書きです。

 

そういえば、さっき気が付きましたが、今まで記事に掲載したスクリプトで、一部記述がおかしくなっているものがありました。
使っているWordPressというブログツールの仕業なのか、コードを表示するプラグインの仕業なのか分かりませんが、
投稿した記事を再度編集する時に、コード部分の表示がおかしくなります。すみません、気が付きませんでした。
しかも、元のコードがどこにあるのかわからないので、修正もできない。
基本的に小さいコードは取っておかないので、多分無いです。

 

ファイルに保存し、圧縮して貼り付ければ良いのですが、面倒くさいので大きなコードでない限りは嫌です。
もっともそんなに大したものがあるわけではないので、大した問題ではないだろう。

Maya Script Python スキニングウェイトのインポート、エクスポート

DoraMaya
Mayaでよく使われているスキニングウェイトのインポート、エクスポートのmelです。
確かMayaのバグによって2011から正確に動作しないかと思います。
ウェイトの取得で一工夫する必要があったように思います。
忘れました。

 

で、まとめてちゃちゃっと出力したい。と、いう状態になったので、
一部関数をお借りする形で使っておりました。
そうすると、今度はPythonで組んだらどうなるのだろう?という疑問が頭をもたげたので、作ってみました。
UVや頂点の座標は無視です。頂点番号とウェイトの値、ジョイントの名前が保存出来ればいいや。
と、簡略化し、どれくらい早くなるのか楽しみにしながら作ったら、意外とすぐに出来ました。
で、今回も色々と勉強になりました。なるほど、そうやって取ればメッシュノードとシェイプノードを確実に区別できるのですね。

import maya.cmds as cmds
import maya.mel

def gkn_skin_weight_export():
	oMeshs = cmds.filterExpand(sm=12)
	if oMeshs == None:
		return
	gMainProgressBar = maya.mel.eval( '$tmp = $gMainProgressBar' )
	oCount = len(oMeshs)
	if oCount == 1 :oCount = 2
	cmds.progressBar( gMainProgressBar, edit=True,beginProgress=True, status='Now Export...', maxValue=oCount )
	for oMesh in oMeshs:
		oShapes = cmds.listHistory(oMesh)
		oShape = cmds.ls(oShapes,type="shape")[0]
		oCls = cmds.ls(oShapes,type="skinCluster")
		if oCls == []:
			cmds.progressBar( gMainProgressBar, edit=True, endProgress=True )
			return
		oCls = oCls[0]
		oJoints = cmds.skinCluster(oCls,q=1,inf=1)
		oJoints = [ x.rsplit("|",1)[1] if x.find("|") != -1 else x for x in oJoints ]
		for oJoint in oJoints:
			if oJoint not in oJoints:
				cmds.progressBar( gMainProgressBar, edit=True, endProgress=True )
				cmds.error("Overlap["+oJoint+"]")
		oVtxs = cmds.ls(oMesh+".vtx[*]",fl=1)
		oFileName = cmds.workspace(q=1,fn=1)+r"/gksw"
		oFileName = r"//".join(oFileName.split("/",1))
		cmds.sysFile(oFileName,md=1)
		oMesh = oMesh.rsplit("|",1)[1] if oMesh.find("|") != -1 else oMesh
		oFile = open(oFileName+"/"+oMesh+r".gkw", "w")
		cmds.progressBar( gMainProgressBar, edit=True, step=1 )
		oJoints.append("\n")
		oJoints = ",".join(oJoints)
		oFile.writelines(oJoints)
		for oVtx in oVtxs:
			oWei = [ "{0:}".format(x) if x >= 0.0 else "0.0" for x in cmds.skinPercent(oCls,oVtx,q= 1,v= 1) ]
			oWei.append("\n")
			oWei = ",".join(oWei)
			oFile.writelines(oWei)
		oFile.close()
	cmds.progressBar( gMainProgressBar, edit=True, endProgress=True )
gkn_skin_weight_export()

素材、と言ってもいいくらいのコードです。
使い方は、
1.スキニングされたオブジェクトを選択(複数可)
2.上記のスクリプトをMayaのスクリプトエディタにコピペし、実行。
以上です。
すると、カレントのプロジェクトディレクトリに「gksw」というディレクトリを作成します。
すでにある場合は、作られません。
その中に、「メッシュの名前+.gkw」のファイルが出来ます。
テキストエディタで開けるので、内容を編集してもいいし、ファイル名を変えれば頂点数と使われているジョイント名が同じ場合、
違うメッシュにも適用できます。もっともファイル名の変更はしないほうが良いかと思います。

import maya.cmds as cmds
import maya.mel
import glob

def gkn_skin_weight_import():
	oMeshs = cmds.filterExpand(sm=12)
	if oMeshs == None:
		return
	oCount = len(oMeshs)
	if oCount == 1 :oCount = 2
	oFiles = glob.glob(cmds.workspace(q=1,fn=1)+r"/gksw/"+"*.gkw")
	if oFiles == []:
		return
	gMainProgressBar = maya.mel.eval( '$tmp = $gMainProgressBar' )
	cmds.progressBar( gMainProgressBar, edit=True,beginProgress=True, status='Now Import...', maxValue=oCount )
	oFiles = [x.split("\\")[1].split(".")[0] for x in oFiles]
	for oMesh in oMeshs:
		oMesh2 = oMesh.rsplit("|",1)[1] if oMesh.find("|") != -1 else oMesh
		if oMesh2 in oFiles:
			cmds.progressBar( gMainProgressBar, edit=True, step=1 )
			oShapes = cmds.listHistory(oMesh)
			oShape = cmds.ls(oShapes,type="shape")[0]
			oCls = cmds.ls(oShapes,type="skinCluster")
			if oCls == []:
				cmds.progressBar( gMainProgressBar, edit=True, endProgress=True )
				return
			oCls = oCls[0]
			oVtxs = cmds.ls(oMesh+".vtx[*]",fl=1)
			oFileName = cmds.workspace(q=1,fn=1)+r"/gksw"
			oFileName = r"//".join(oFileName.split("/",1))
			oFile = open(oFileName+"/"+oMesh2+r".gkw", "r")
			oLines = oFile.readlines()
			oJoints = [x for x in oLines.pop(0).split()[0].split(",")if x!=""]
			oJnts = cmds.skinCluster(oCls,q=1,inf=1)
			for oJoint in oJoints:
				if oJoint not in [ x.rsplit("|",1)[1] if x.find("|") != -1 else x for x in oJnts ]:
					cmds.progressBar( gMainProgressBar, edit=True, endProgress=True )
					cmds.error("Not Find["+oJoint+"]")
			if len(oVtxs) == len(oLines):
				[cmds.skinPercent(oCls,oVtxs[i],nrm= 0,zri= 1,tv= (zip(oJoints,[float(x) for x in oLine.split(",")if x!="\n"]))) for i,oLine in enumerate(oLines)]
#				for i,oLine in enumerate(oLines):
#					oWei = [float(x) for x in oLine.split(",")if x!="\n"]
#					cmds.skinPercent(oCls,oVtxs[i],nrm= 0,tv= (zip(oJoints,oWei)))
			oFile.close()
	cmds.progressBar( gMainProgressBar, edit=True, endProgress=True )
gkn_skin_weight_import()

で、こちらがインポートです。
ファイル名とメッシュの名前が同じで、かつ頂点数が同じであれば読み込むことが出来ます。
DoraMayaのように頂点の座標や、UV座標で補正する機能はありません。
Maya2011くらいからでしょうか、ウェイトのコピーが付いたので必要ないかと思います。
ウェイトを設定したモデルをそのままの状態で複製しておき、メッシュの編集を行ったモデルにコピーすれば良いかと思います。
使い方は、
1.スキニングされたメッシュを選択し(こちらも複数可)
2.スクリプトを実行
エクスポートされたデータ(gkwファイル)が存在しすれば実行されます。

 

因みにシーン内に同一の構造体を持つ場合でも使用できます。
で、速度なのですが、書き込みは非常に高速です。
しかし、読み込み、むしろウェイトの適用部分なのでしょうか、とても遅いです。
元のmelよりは早いかと思うのですが、書き込みの早さと比べると、げんなりします。
ウェイトのノーマライズを頂点ごとではなく、クラスタごとにしても代わり映えはしませんでした。
悔しいので、リスト内包表記で書いてみましたが、ほぼ変わりません。
因みにコメントアウトされている部分は、リスト内包表記で書かれているものをベタ書きにしたものです。
コメントアウトされている行の一行上をコメントアウト、もしくは削除し、コメントアウトを解除するとそちらを実行できます。

 

MacやUNIXで動くかは知りません。多分動かないのではないでしょうか?ディレクトリの記述が少し違いますよね、確か。
多分Maya2011以上で使えるのではないでしょうか?2010でも使えるかも知れません。
少なくとも2012、2013では使えます。

 

そのままでも一応使えますが、編集して使いやすいようにしてください。

ZBrush4 ネイティブアメリカンの人

image964l
ここのところスカルプトしております。

 

調子に乗って女性の頭部を作っていたのですが、中々しっくり来なかったので
おじさんにしました。
Crayブラシをメインにスカルプトしている人のビデオに触発されてやってみましたが、どうにもうまくゆきません。
で、CrayTubesに切り替え、モデルもおじさんにしたら、まぁ、楽しい。
 

でも、途中で日が開いてしまったので、このモデルはディテール勉強用に、ということでディテールを足しました。
うーん、なんか違う。ディテールも元をちゃんと見ながらやらないと駄目だ。

 

ああ、R3触りたい。Dynameshでスカルプとしたい。もういい加減に買わないといけない。

 

そういえば、Unityが4になるそうで、、
3の時に本を買ったまま開いてすらもいない、、うーん、困った、、
スクリプトにスカルプトにはまってしまった。

 

そういえば、こちらのツール。
随分前に知って、ダウンロードはしたのですが、使っておりませんでした。
Mayaのプラグインです。
主に、選択機能とUV編集を強化するツールです。
使ってみて、凄さが分かりました。これはMayaでモデリングするときは必須ではないか。そんな感じです。

 

でも、操作がちょっと特殊だったり、機能的にも、もう一声、と言ってしまいたくなるような感じは否めません。
軽く作業するだけならば問題ないかと思いますが、もっと複雑な編集ではmodoに持って行った方が遥かに早い。

 

あ、そういえば、ウェイトエディタを更新しました。
何を変えたのか覚えていません。多分エラーが出る状態をより少なくしたのだと思います。
随分前に修正して、放置しておりました。
エディタ自体は使っていて、特にエラーは出ていません。多分問題ないかと思います。

雑記97 - 化学物質と電気信号

以前脳というものはケミカルマシンか電子回路か、という話を書きました。
それは機能的な話であり、そこで行われていることは化学物質による化学反応と、電気信号の交換である。
ということが出来るかと思います。
それをさらに言い方を変えると、物質と情報、モノとコト、と言い換えることが出来るかと思います。

 

以前そんな事も書いたように思います。
脳内で行われているその現象は、現在社会においても割かし普通に行われているようです。
経済学では、商品ではなく、それを含めたサービス、と言う考え方が一般的かと思います。
物が事になります。

 

それを踏まえて考えると、面白いことがあります。
以前養老孟司さんの言葉で、神経系が免疫系に作用する。ということを書いたかと思います。
要するに、病は気から。と言う事です。
それをもっと簡単に説明できる。
化学反応が起きている。

 

どういった経路かに関わらず、脳内で発生した電気信号なりが体に伝わり、
それが化学反応を促し、体内を循環し、更なる化学反応を促す。それだけだ。

 

そして、それと合わせて考えると面白いことが、物理学でいわれる、エントロピーの増大則だとおもいます。
物を使うと減るのか増えるのか。
物理学的に言ってしまえば、エントロピーの増大則により、使えば物は減る。
しかし、我々の体は鍛えるほどに強くなる。筋肉量が増えてゆく。矛盾している。
だからネゲントロピーやエンテレヒーという考え方を導入してそれを補おうとしたのだと思います。

 

化学物質同士が触媒となり、新たな化学物質を生成し、それが元の化学物質を生成する。
自らの尻尾を噛む蛇のような構造が出来上がる。それが生命の本質的な部分にあるように思います。

 

では、思えばなんでも出来るのか。それの答えは誰でも知っている。物には限度がある。
だから精神力だけでは戦闘機は飛ばせなかったのだし、竹槍ではエノラ・ゲイは落とせなかった。

 

何が体に良くて、何が体に悪いのか、元々生命は外界の化学物質を検出することであらかじめ危険を予測し、
進化をしてきたようです。だから嗅覚と味覚は脳の古い部分に属している。
我々の感覚器はある程度に優れているが、ある程度に劣ってもいる。だから香りに騙される。
今の時代に匂いを嗅いで食べられるものか判断する人はいない。
視覚に頼り、印刷されている賞味期限を参照する。有害なものでも化学物質をまぶしておけば大丈夫だ。
ということになるかと思います。

 

ちょっと話がずれました。
以前読んだ、生物学者の方が書かれた本を思い出しました。
その方は白人で、友人の同じく白人ではあるが、拳法の達人に方がいるようです。
そして、その友人は定期的にコップいっぱいの石油を飲むそうです。
飲んだ後に、いつもどおり訓練に明け暮れる。
なぜ飲むのか、と聞いたそうですが、確か、これも修行のうちで、自分の強さを確認する。とかそんな感じだったかと思います。
その本を書いた人は、自分でも間違えて、石油を一口飲んでしまったそうです。
3日間起きることが出来ず、1週間体調が戻らなかったそうです。
そして、生物学者らしい理由付けとして、鳥にはしばしば自然界にそぐわない、派手な鳥が存在ることと結びつけていました。
捕食されやすい色を身にまとうことで、自身の強さをアピールしている。
そして、人間の行動としては、タバコに当てはめていました。
更に面白いことに、古代マヤ文明では、王は儀式的な浣腸を受ける事があったそうです。
その浣腸は様々な薬物が入っており、現代においては麻薬、と解釈されるものだったとされています。
直腸からの注入により、体内に効率良くそれが行き渡る。自身の強さを見せるためのものであったのだろう。と結論づけていました。

 

最近テレビでは、体にいいものがよく特集されます。
そして、取り上げられたそれらが店頭から消える。
科学的にも医学的にも歴史的にも全く根拠がないにも関わらず、毎度大変だなぁ、と感心するばかりですが、
それで気が済むのであれば、それも効用がる。効くと思って服用していればある程度は効くでしょう。
ただ、やはり物には限度がある。でもやってみなければ分からない。
統計的な有意性と入っても、その中にあなたが入っているとは限らない。
空気中には水の分子が激しく飛び交っていることだと思いますが、ある程度のまとまりにならない限り、雲とは認識できない。

 

鰯の頭も信心から。全くそのとおり。

雑記96

うーん、難しい、、
頼まれているわけではないので、書く必要もないのですが、
散らかしたものは片付けなければいけない。そんな気持ちで書いております。

 

明日生きている保証の無い人間である自分には責任を取ることは出来ないが、
けじめを付けることくらいは、生きている限り出来る。そんな気持ちです。良くわからない。

 

今までさんざん書き散らしておきながら、人に読まれている、という意識がありませんでした。
アクセスカウンターのようなものはあるのですが、見方が良くわからないし、余り信用していない。
しかし、インターネットでやっている限り誰かに見られている。もちろん見ていただくためにやっている。
矛盾している。
あまり意識がないと、便所の落書きに成り下がる。
しかし、意識しすぎると、「ちゃんとしなきゃ」という思いが生じ、より一層できなくなる。
元々ちゃんとするのが苦手だ。

 

本来は雑記を通して今の社会のありよう、現代の矛盾点を見てゆこうと思っていたのですが、
色々と知ってゆくうちに、それらはどうでもいいことであることに気がついてしまう。
しかしそれは、投げやりとか厭世的とか、そういったベクトルではない。
人工の物が悪く、自然の物が良い。そういった事に対しても、根拠がない。ということが分かる。

 

前回の話で言うと、ビタミンCは体に良いのか。という話を出しました。
同じように、納豆は体に良いのか、という事を問いただしてみると分かる。
歴史的な根拠、科学的な根拠、どちらにしても歴史が浅い。
生命が誕生した約35億年前にはそんな物があっただろうか。
人類が誕生した20万年前にはどうであろうか。どちらにしても変わらない。

 

人間の平均寿命、恐らく世界的なもので約60数歳だと思うのですが、
それを直列につなげて考えた人がいます。要するに一人の人が60数歳で死んだら次の人の時代、という感じです。
約800人もつなげると優に5万年、これは解剖学的に現代の人間と変わらない、とされている時代です。
そのうち650人が洞窟ぐらし、しかも日本では、戦国時代はおろか江戸時代でも地方の農家では
竪穴式の住居に住んで地域もあったといわれております。そう考えるとヘタをしたら後ろから数人以外が家屋ではない。
そして、後ろから数えて70人目でようやく意思の疎通が出来るようになり、正確な時間は4人目、電動機は2人目。
なるほど分かりやすい。

 

自分は計算が苦手なので、100歳単位で同じ事を考えていました。現代においては100歳を越える方々が多くいらっしゃる。
そう考えると2人目で既にちょんまげを結っております。
その方々に整列してもらうと、21人目でキリストの顔が見えてきます。もう少し下ればソクラテスさえも見えてくる。
歴史的な根拠、何とも浅はかであることが分かります。
しかし、だからといってそれが全く間違いか、というとそうでもない。それがより面白い。

 

面倒くさくなったので、今日はこの辺にしておきます。

雑記95

どうも雑記が書きづらい。
これも書いておかないとなぁ、と思いつつも面倒くさくなってしまう。
散らかしたのだから、片さないと、と思いつつも片付かない部屋のようだ。

 

書いていることと考えていることの差が大きくなりすぎている。
という点が大きいのだと思います。
とりあえずタイトルを付けずに書いてみます。

 

相変わらず複雑系と脳科学にハマっております。
どちらも知るほどに今までの常識が崩れて行き、とても面白い。
その内の一つを書いてみようかと思います。

 

今の社会の状況、という事を挙げてみます。
年金問題、社会保障、税金、とテレビを付けると必ずこれらが取り上げられています。
かつて古代ローマ帝国の五賢帝後の混乱を見ているようにも思えます。
当時のローマの体制では皇帝以外の役職は選挙で決められておりましたが、
皇帝だけは人々に担ぎ上げられて決められていました。
時には首都ローマから、多くは地方の軍団に担ぎ上げられました。
担ぎ上げられる大きな理由は、既得権益の保守。ということが主です。
なので、取り合いになる。拒絶するためには皇帝を殺すしか無い。
今の政治がコロコロと首相が変わるように当時のローマでもコロコロと皇帝が変わりました。

 

そして、小麦の低価格販売が無償配布になり、その量が増えてゆきます。要するに生活保護です。
必然的に税金は上がり、人々の生活を苦しめる。負のスパイラルが続いてゆく。

 

現代では、それの打開策としてお金を持っている人に対して税金を高く掛けるべきだ。という意見もあります。
なるほど、確かに合理的です。
しかし、面白いことに複雑系ではそうはならない。
富める者はより富む。経済学でもそれを収穫逓増と言い、複雑系では拡散律速凝集と呼びます。
自由化や高所得者に対する高税率がもたらす結果は更なる格差を生じうる。
なので、最も好ましい政策としては全員が均等に痛みを分け合う消費税。ということになるようです。
もちろん、それが全てではないし、今の日本にそれを適用して本当にうまくゆくかも分からない。

 

恐らく分からないことが分からないことに問題がある。
人間の科学は大きく進歩し、様々な形で自然を叙述出来るようになりました。
今から千年以上も前の我々の祖先は、最新の知識を求め唐へと渡りました。
現代の航海術がまだないその時代、彼らは船の進路を占いで決めていました。
そして、甲板も竜骨も無く、一本しか帆を持たないひ弱な船に乗り込みました。
現代の感覚からすると、命知らず。という事になるかと思いますが、実は今でも変わらない。
現代の最新の知識である科学を使って、道なる宇宙へと旅立っている。そして、失敗もしている。

 

占いとは恐らく、ある種の統計であるかと思います。科学もある種の統計です。
そして、どちらも人の脳みそを経由しているのでバイアスが掛かっていることには違いがない。
それは身近な物を参考にすると分かりやすい。
ビタミンCは体にいい。それを自問自答してみると分かりやすい。
テレビで言ってたから。そう書いてあるから。くらいの答えしか見つからない。
それは科学ではない。

 

では、統計とは何か、簡単に言ってしまうと、空に浮かぶ雲の一つを取り出し、
それのおおまかな形を求めること。と例えることが出来るように思います。とてもあやふやですが、、
そして、その行為に対して言えることは、雲の形は日によって違うし、場所によっても違う。ということでしょうか。
しかしまた、雲の写真とバナナの写真を見せられて、「雲はどっち?」と聞かれたら、聞いている人の頭を疑う。
パターン認識の話になる。

 

どれほど科学技術が優れようが、明日の天気は明日にならないと分からない。
100年の歴史を積もうが150億年の宇宙の歴史を予測することは出来ない。
やってみなければ分からない。それが分からないから、やる前からあーだのこーだの、と言うことになるのだろう。
政治家も大変だなぁ、と思いながらも、平和だなぁ。とも思います。何ともめでたい。

3Dcoat リトポロジー

image955l
Mudboxに持っていったモデルと同じ物を3Dcoatに持ってゆきました。
ボクセル化しないでリトポしたほうが良いそうですが、バージョンの問題なのか、うまくいく時といかない時があったので、
ボクセルでインポートしました。
そして、画像にあるようにX軸で対称化をして、ある程度のラインを引いて、リトポします。
Mudboxもobjの読み込みが早かったのですが、3Dcoatも早いです。
Mayaやmodoが遅すぎるのでしょうか?良く分かりません。
ラインの引き方はいい加減で、ここにこんな感じでセグメントが入ってくれると良いかなぁ、などと思いながら、
後は適当にやっちゃってください。と投げっぱなしです。
image956l
で、出来たのがこれです。
素晴らしい。十分です。今まで手作業でポチポチやっていたのが悲しくなるくらいです。
それをZBrushに持ってゆきました。
元のモデルをロードして、「PolyMesh3D」をアクティブにしてインポートです。
そして、元のモデルにサブツールとしてアペンドしました。
image957l
わぉ、ずれています。
エクスポートする時に、値をリセットしたのがいけないのでしょうか?これも良く分かりません。
とりあえず、調整します。
image958l
「Transform」から「S.Povot」で上下を合わせ、
image958l
TransPoseで前後を合わせます。
image959l
「Deformetion」の「Size」で大きさを合わせます。
image960l
「ProjectAll」を掛けてフィットさせてゆきます。
image961l
とりあえず、5くらいまでサブディビジョンレベルを上げてみました。
image963l
こんな感じです。

Mudbox2013 その4

image952l
さて、「ReMesh All」をしたものです。自分の環境ではDynameshは使えませんので。

 

サブディビジョンレベルを2つくらい上げて「ProjectAll」をかけます。
image954l
で、これをMudboxに持ってゆきます。
image950l
こんな感じです。

 

そして、「サブディビジョン レベルを再構築」をかけると、
image951l
こうなりました。
違う角度から見た画像です。
image953l
上のZBrushのものと同じような角度です。
うーん、同じだ。トポロジーが。

 

しかし、形状が違うように見えます。陰影のせいでしょうか?
後頭部のあたりは随分凹んだように思います。

 

それはともかくと、
objにそういった情報が含まれているのでしょうか?よくわかりませんが、トポロジーが再現されています。
Dynameshの様に三角が入るとどうなるのでしょうか?それくらい問題なく行けそうな気がします。
しかし、2.5Dを使っているわけではないと思いますが、この早さは何なのでしょうか。
modoも頑張って再現して欲しいところです。
といっても、ZBrushのスカルプトに慣れてしまったので今更違うツールでスカルプとする気にはなれませんが。

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

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

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