チラシの裏程度の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()