2012年11月28日水曜日

Softimage Script : 背面のポリゴンを作成

やっとネット復帰しました。


背面のポリゴンを作成

旗を作るんですが、ポリゴンが両面必要な仕様でした

違いを作るためにUVでパターンを作ります
最初から両面で作るとUVが面倒ですので
片面ですすめてあとで両面化します

10パターン以上を1000個以上

作業中・・・1000本以上を配置完了

両面化、忘れてた orz < イマココ

そんな時のスクリプトです


Script


#Python
#1128 2012
#選択したオブジェクトの BACKPolyを作成

app = Application; log = app.Logmessage
from win32com.client import constants as c

#ログの表示を消す
cmdLog = app.Dictionary.GetObject( "preferences.scripting" )
cmdLog.cmdlog.value = False

#クラスターを削除するか選択
deleteCluster = Flase #Trueにした場合クラスターは削除されるが、距離が無効になる

#背面ポリゴンの距離
backPolyDistance = -0.02

#裏面ポリゴンの作成ルーチン
def createBackPoly(outCluster):
 oObj = app.Selection(0)
 if oObj.Type != "polymsh":
  return 
 oGeo = oObj.ActivePrimitive.Geometry
 oSub = oGeo.Polygons.SubComponent
 op = app.DuplicateMeshComponent(oSub, "siPersistentOperation", "", "", "", "", "", "", "", "", "", "", "", "", True)
 op = app.ApplyOp("Push", oSub, 3, "siPersistentOperation", "", 0)
 op(0).ampl = backPolyDistance
 nSub = oGeo.Clusters("Polygon_Auto").CreateSubComponent()
 oGeo.Clusters("Polygon_Auto").Name = "BackFace"
 app.ApplyTopoOp(u"InvertPolygon", nSub, "siUnspecified", "siPersistentOperation", "")
 outCluster.Add(oGeo.Clusters("BackFace"))


def getMeshs():
 oColl = XSIFactory.CreateObject("XSI.Collection")
 oColl.Unique = True
 oColl.Items = app.Selection
 return app.SIFilter(oColl.Expand(),c.siPolyMeshFilter)


def main():
 oMeshs = getMeshs()
 oClusterColl = XSIFactory.CreateObject("XSI.Collection")

 #オブジェクトの数繰り返す
 for oMesh in oMeshs:
  app.SelectObj(oMesh)
  createBackPoly(oClusterColl)
  
 #選択しなおし 
 app.SelectObj(oMeshs)
 
 #BackFaceクラスターをを削除
 if(deleteCluster):
  app.DeleteObj(oClusterColl)
  
main()


高速化にあたって

コマンドモデルを多用してるため、
ログの非表示など高速化とかしてます

VBS - JScript の For Loop Performance について
myaraさんのこの記事を参考にしてます、ありがたいこってす。

コマンダーは必見デス

2 件のコメント:

  1. 試してみたらエラーが出ました。
    原因はdeleteCluster = Flase
    の False のスペルミスだったので報告します。

    ブログへのリンクありがとうございます。
    全く更新してないブログですけど・・・。

    返信削除
    返信
    1. おふう、ほんとですね!

      ありがとうございます!
      修正します!

      削除