2013年11月21日木曜日

Mari Tips : UV ミラー 超限定的

チラシの裏程度のTip


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 件のコメント:

コメントを投稿