MARIでのUVミラーの仕方(限定的
1.DCCツールで鏡面のUVを +1しておく
2.Mariで作業。右半分をメインとする。
3.Mariで書き出し。Patchの 最初だけつかう :p ウマー
以上です :p
1.DCCツールで鏡面のUVを +1しておく
DCCなんてカッコいいことをいってますがSoftimageさんです:p
こんな感じのオブジェクト
いつも愛想無しでスミマセン
UVはこんな感じで 左のUVを U +1をしてあります
手作業ではめんどくさいのでスクリプト化してあります。
1.-xのポリを削除
2.+xのポリを鏡面化
3.-xのUVのUを+1
という簡単スクリプトです
ウエイトなどには対応しておりません
#QuickLocalSymmetry app = Application; log = app.LogMessage def isPolyXCenterThanZERO(in_Polygon,inPntPositionArray): oPoints = in_Polygon.Points xMin = xMax = inPntPositionArray[0][oPoints[0].Index] for i in oPoints: if xMin < inPntPositionArray[0][i.Index]: xMin = inPntPositionArray[0][i.Index] if xMax > inPntPositionArray[0][i.Index]: xMax = inPntPositionArray[0][i.Index] if ( xMax - xMin ) / 2 + xMin <= 0: return True return False def getRessPolyIDs(oObj,in_LessThan): oGeo = oObj.ActivePrimitive.Geometry oPoints =oGeo.Points oPositionArray = oPoints.PositionArray oPolys = oGeo.Polygons oSub = oPolys.SubComponent ressPolyIDs = [] if in_LessThan: for i,oPoly in enumerate(oPolys): if isPolyXCenterThanZERO(oPoly,oPositionArray): ressPolyIDs.append(i) else : for i,oPoly in enumerate(oPolys): if not isPolyXCenterThanZERO(oPoly,oPositionArray): ressPolyIDs.append(i) #-X側のみ選択 return ressPolyIDs def moveUV(oSub,uS,vS,uT,vT): oObj = oSub.Parent3DObject oGeo = oObj.ActivePrimitive.Geometry oPolys = oSub.ComponentCollection oSampleIDs = [] for oPoly in oPolys: for sample in oPoly.Samples: oSampleIDs.append(sample.Index) oSampleClusters = oGeo.Clusters.Filter("sample") for oCls in oSampleClusters: for oProp in oCls.Properties: if oProp.Type == "uvspace": aUV = oProp.Elements.Array aUV = [list( aUV[0] ) ,list(aUV[1]), list(aUV[2])] for sID in oSampleIDs: aUV[0][sID] = aUV[0][sID] * uS + uT aUV[1][sID] = aUV[1][sID] * vS + vT #log(str(aUV)) oProp.Elements.Array = aUV #log(oProp.Type) #log(oCls) def main(): #選択オブジェクト oSels = app.Selection for oObj in oSels: #log(oObj.Type) if oObj.Type == "polymsh": #-X側のみ lessThan = True ressPolyIDs = getRessPolyIDs(oObj,lessThan) #log(len(ressPolyIDs)) oGeo = oObj.ActivePrimitive.Geometry oPolys = oGeo.Polygons oSub = oPolys.SubComponent if len(ressPolyIDs) > 0: oSub.ElementArray = ressPolyIDs #削除 app.ApplyTopoOp("DeleteComponent", oSub, "siUnspecified", "siPersistentOperation", "") #シンメトリー #oPolys = oObj.ActivePrimitive.Geometry.Polygons op = app.ApplyTopoOp("SymmetrizePolygon", oObj, "siUnspecified", "siPersistentOperation", "") op(0).symmetryreference = 1 op(0).weldtolerance = 0.001 #-X側のUVを選択 ressPolyIDs = getRessPolyIDs(oObj,lessThan) oGeo = oObj.ActivePrimitive.Geometry oPolys = oGeo.Polygons oSub = oPolys.SubComponent oSub.ElementArray = ressPolyIDs #UVを移動 uScale = 1 vScale = 1 uOffset = 1 vOffset = 0 moveUV(oSub,uScale,vScale, uOffset,vOffset) main()
メニューにボタンを作って登録してます
2.Mariで作業。右半分をメインとする。
mariでの作業に入ります右半分で作業して
左を捨てればいいだけです
MariのUV状態
このまま、作業できればすごいんですが、
経過状態を確認したいかと思います
そのときは Patchのコピーを使います
こんな感じで1001のUVを1002にコピーすれば左右対称になります :p
これもめんどくさいのでスクリプト化します
1.現在のチャンネル
2.すべてのレイヤー
Udim1001 > Udim1002 にコピペ
import mari print("mirrorPaint") ver = 0.01 baseUDIM = 0 targetUDIM = 1 def copyUdimToUdim(baseUDIM,targetUDIM,layer_list): copy = mari.actions.get('/Mari/Project/Project Explorer/Quick Copy') paste = mari.actions.get('/Mari/Project/Project Explorer/Quick Paste') for layer in layer_list: # un-select layers layer.makeCurrent() layer.setSelected(False) layer.makeCurrent() mari.geo.current().patch(baseUDIM).setSelected(True) copy.trigger() mari.geo.current().patch(baseUDIM).setSelected(False) mari.geo.current().patch(targetUDIM).setSelected(True) paste.trigger() mari.geo.current().patch(targetUDIM).setSelected(False) layer.setSelected(False) def main(): #startUp if mari.projects.current() is None: mari.utils.message("Please open a project before running.") return False geo = mari.geo.current() if geo is None: mari.utils.message("Please select an object to copy from.") return False chan = geo.currentChannel() if chan is None: mari.utils.message("Please select a channel to copy from.") return False if len(chan.layerList()) == 0: mari.utils.message("No layers to copy from!") return False layer_list = mari.geo.current().currentChannel().layerList() copyUdimToUdim(baseUDIM,targetUDIM,layer_list) main()
ほとんど人が他人のコードです :p
メニュー登録などは組み入れてません :p
3.Mariで書き出し。Patchの 最初だけつかう :p ウマー
以上です :pめんせき
このサイトで拾ったスクリプトなどで起きたあらゆる事象の責をおいません。
メモ
Mariのコマンドの取得はcopy = mari.actions.get('/Mari/Project/Project Explorer/Quick Copy')
発動は
copy.trigger()
0 件のコメント:
コメントを投稿