ども、まだまだ修羅場中の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()