あいかわらず、チラ裏スクリプトです
(整理とか、エラー処理とかしてません)
今回の背景はアルファオブジェクト(半透明)
を多用しています
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 件のコメント:
コメントを投稿