2013年5月14日火曜日

Softimage Script : ZSortNumbering v0.1

ども、まだまだ修羅場中のTERAです。
あいかわらず、チラ裏スクリプトです
(整理とか、エラー処理とかしてません)


今回の背景はアルファオブジェクト(半透明)
を多用しています

ZSortの場合アルファオブジェクトは
描画順を指定してやらねばなりません、
※最近のIntelAPUでは、力づくで解決してるみたいだけど


まだまだ世の中はオールドテク万歳です。


で、奥から描画するとして、
命名規則で指定する事になりました

・・・数が・・・。
大量にアルファオブジェクトがあると、
めんどくさいのでスクリプト化します


ZSortNumbering


オブジェクト(複数)を選択して実行すると
奥から順に番号を降ってくれます

axxx_ObjectName
最後のナンバリングは消してます


現状PPG無し、カメラの指定は決めうち、など
Toolとして、体をなしてなく、
条件がたくさんですが
とりあえず乗っけておきます。


こういった事案が多数 or 要望があればTool化するかもしれません。


※拡張性として、以下のスイッチがあります
カメラ平面からの距離 <> カメラからの距離
オブジェクトのセンター <> オブジェクトのBBOXセンター
です。
あと、番号の始まりと、頭につける文字の変更とか。

#ZSortNumbering
#
# 選択したオブジェクトをZSort順に命名変更します
# a000_ObjectName
#
# v0.1 0510 2013 とりあえず動いた
#

from win32com.client import constants as c
app = Application; log = app.LogMessage
import re
p = re.compile("[0-9]")

#GlobalValue
PREFIX = "a"
STRRTINGNUMBER = 0
tempCAM ="Camera"
ZDEPTH = True #ZDEPTH or Distance
OBJECTCENTER = False # Switch BBOX

def vLog(v):
 log(str( v.X ) + " , " + str(v.Y) + " , " + str(v.Z) )


def aPosLog(aPos):
 for v in aPos:
  log(str( v.X ) + " , " + str(v.Y) + " , " + str(v.Z) )

#
# bNumDelete
#
def bNumDelete(in_str):
 oName = in_str
 for i in range( len( oName ) ):
  if p.match(oName[-1:]) != None:
   oName = oName[:-1]
  elif oName == "_":
   oName = oName[:-1]
  else:
   break
 return oName

#
# getNumbering
#
def getNumbering(in_digi,in_Start,in_Count):
 num = in_Count + in_Start
 num = str(num).rjust(in_digi,"0")
 return num


#
# getSelectMeshs
#
def getSelectMeshs():

 #-製作中-現在は選択したメッシュのみ
 col = XSIFactory.CreateObject("xsi.collection")
 oMeshs = XSIFactory.CreateObject("xsi.collection")
 col.Unique = True
 oMeshs.Unique = True
 
 oSels = app.Selection
 for oSel in oSels:
  if oSel.Type == "polymsh":
   oMeshs.Add(oSel)
   
 return oMeshs


#
# getCamera
#
def getCamera():
 #カメラ取得は仮
 oCam = app.Dictionary.GetObject(tempCAM)
 
 return oCam


#
# getObjectBBOXPositionArray
# 
def getObjectBBOXPositionArray(inObjects):
 aPos = []
 for oObj in inObjects:
  pos = XSIMath.CreateVector3()
  oTrans = oObj.Kinematics.Global.Transform
  oA = oObj.GetBoundingBox( oTrans );
  pos.Set( (oA[3] - oA[0]) *.5 + oA[0],
     (oA[4] - oA[1]) *.5 + oA[1],
     (oA[5] - oA[2]) *.5 + oA[2] )
  aPos.append(pos)
 return aPos


#
# getObjectPositionArray
#
def getObjectPositionArray(inObjects):
 aPos = []
 for oObj in inObjects:
  pos = XSIMath.CreateVector3()
  oTrans = oObj.Kinematics.Global.Transform
  oTrans.GetTranslation(pos)
  aPos.append(pos)
 return aPos


#
# getMeshZNumber
#
def getMeshZNumber(oCam, oMeshs):
 log("-----getMehsNumber-----")
 aDis = []
 aNum = []
 
 #ObjectPositionArray
 if OBJECTCENTER:
  aPos = getObjectPositionArray( oMeshs )
  
 else:
  aPos = getObjectBBOXPositionArray( oMeshs ) 
 
 #aPosLog(aPos) 
 
 #ZDepth or Distance
 camPos = XSIMath.CreateVector3()
 camAxis = XSIMath.CreateVector3()
 camRot = XSIMath.CreateRotation()
 m3 = XSIMath.CreateMatrix3()
 oCamTrans = oCam.Kinematics.Global.Transform
 oCamTrans.GetTranslation(camPos)
 oCamTrans.GetRotation(camRot)
 camRot.GetMatrix3(m3)
 aM3 = m3.Get2()
 camAxis.Set(aM3[6],aM3[7],aM3[8])
 
 log("")
 log("---camPos---")
 vLog(camPos)
 
 log("")
 log("---camAxis---") 
 vLog(camAxis)
 
 if(ZDEPTH):#ZDepthの場合
  log("-----ZDepth-----")
  d = camPos.Dot(camAxis) #PolyPlane = p・n - d
  #log(d)
  for oPos in aPos:
   dis = ( oPos.Dot(camAxis) - d ) * -1
   aDis.append(dis)
   log(dis)
 else:
  v = XSIMath.CreateVector3()
  for oPos in aPos:
   v.Sub(camPos,oPos)
   dis = v.Length()
   aDis.append(dis)
   log(dis)
 
 aTemp = []
 for i,d in enumerate(aDis):
  bTemp = [d,i]
  aTemp.append(bTemp)
  
 aTemp.sort()
 aTemp.reverse()
 
 log(str(aTemp))
 for i in aTemp:
  aNum.append(i[1])
   
 return aNum

#
# main
#
def main():
 log("-----ASortNumbering")
 
 #GetMeshObject
 oMeshs = getSelectMeshs()
 if oMeshs.Count == 0:
  log("Pls Select Meshs")
  return
  
 #Camera
 oCam = getCamera()
 
 #GetNumber From Depth
 aNum = getMeshZNumber(oCam,oMeshs)
 log(str(aNum))
 
 #Renema
 for i,num in enumerate(aNum):
  oObj = oMeshs(num)
  no = getNumbering(3,STRRTINGNUMBER,i)
  oName = PREFIX + str(no) + "_" + oObj.Name
  oObj.Name = bNumDelete(oName)
main()

0 件のコメント:

コメントを投稿