2013年4月17日水曜日

SoftimageScript : Fillet っぽいなにか



メモです

ちょっと パイプが山の用にあって
その曲がりの角ががが・・・ orz

Filletっぽい何かを作ってお茶を濁します。


FilletLinearCurve

リニアカーブのコントロールポイントを選択し、
実行します

カーブの再描画ですので、ご注意を。

# FilletLinerCurve
#
# リニアカーブの選択したポイントを分割、再描画してくれます
# 正確な円ではありません~ 付け焼刃
#
# v0.1 2013 0417

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

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

#半径と、間に入る頂点数
gRadius   = 1
gDivision = 2


def CreateNewCurve(aPos):
 
 myNewCurve = app.SICreateCurve("",1,0)
 for i in range(len(aPos[0])):
  app.SIAddPointOnCurveAtEnd(myNewCurve,aPos[0][i],aPos[1][i],aPos[2][i],False,0)
 app.SelectObj(myNewCurve)
 return


def l2gArray(aPos,m4):
 v = XSIMath.CreateVector3()
 for i in range(len(aPos[0])):
  v.Set(aPos[0][i],aPos[1][i],aPos[2][i],)
  v.MulByMatrix4InPlace(m4)
  aPos[0][i] = v.X
  aPos[1][i] = v.Y
  aPos[2][i] = v.Z


def alog(aPos):
 log("cnt = " + str(len(aPos)))
 for i in range(len(aPos)):
  log( "V : " + 
  str( aPos[0][i]) + " , " +
  str( aPos[1][i]) + " , " +
  str( aPos[2][i])
  )


def GeiFilletPoint(posA,posB,posC,in_t):

 v1 = XSIMath.CreateVector3()
 v2 = XSIMath.CreateVector3()
 v3 = XSIMath.CreateVector3()
 
 p0 = XSIMath.CreateVector3()
 p1 = XSIMath.CreateVector3()
 p2 = XSIMath.CreateVector3()
 
 v1.Sub(posB,posA)
 v2.Sub(posC,posB)
 
 p1.ScaleAdd(in_t,v1,posA)
 p2.ScaleAdd(in_t,v2,posB)
 
 v3.Sub(p2,p1)
 p0.ScaleAdd(in_t,v3,p1)
 
 return p0
 
 
def addFiletPnts(x,y,z,i,aPos):
 
 #カーブのセグメントを追加 
 #ContorolPoints 0,1,2
 pos00 = XSIMath.CreateVector3(aPos[0][i - 1],aPos[1][i - 1],aPos[2][i - 1])
 pos10 = XSIMath.CreateVector3(aPos[0][i    ],aPos[1][i    ],aPos[2][i    ])
 pos20 = XSIMath.CreateVector3(aPos[0][i + 1],aPos[1][i + 1],aPos[2][i + 1])

 v1 = XSIMath.CreateVector3()
 v2 = XSIMath.CreateVector3()
 
 v1.Sub(pos00,pos10)
 v2.Sub(pos20,pos10)
 
 v1.NormalizeInPlace()
 v2.NormalizeInPlace()

 #new Point 
 pos01 = XSIMath.CreateVector3()
 pos02 = XSIMath.CreateVector3()
 
 #半径分Pos00からの距離
 pos01.ScaleAdd(gRadius,v1,pos10)
 pos02.ScaleAdd(gRadius,v2,pos10)
 
 #分割数分 FilletPositonの追加
 num = gDivision + 2
 
 for i in range(num):
  t = i * 1.0 / (num - 1)
  v = GeiFilletPoint(pos01,pos10,pos02,t)
  x.append( v.X )
  y.append( v.Y )
  z.append( v.Z )


def CreateNewPos(aPos,oSelIDs):

 x = []
 y = []
 z = []
 
 for i in range(len(aPos[0])):
  log(i)
  flg = True
  for j in oSelIDs:
   #最初と最後のポイントは無視(Closeには対応してません
   if i == j and i != 0 and i != len(aPos[0]) - 1:
   
    #選択したポイントであれば
    #log("match")
    flg = False
    
    #カーブのポイントを挿入
    addFiletPnts(x,y,z,i,aPos)
    
  if(flg == True):
   #log("NoMatch")
   x.append( aPos[0][i] )
   y.append( aPos[1][i] )
   z.append( aPos[2][i] )
   
 nPos = [x,y,z]
 
 return nPos
 

def main():
 if app.Selection.Count ==0:
  return
  
 oSel = app.Selection(0)
 if oSel.Type != "pntSubComponent":
  log("Select LinerCurve Control Points")
  return
  
 oSub = oSel.SubComponent
 oCurveList = oSub.Parent3DObject
 if oCurveList.Type != "crvlist":
  log("Select LinerCurve Control Points")
  return
  
 oColl = oSub.ComponentCollection
 oSelIDs = oColl.IndexArray
 oTrans = oCurveList.Kinematics.Global.Transform
 m4 = XSIMath.CreateMatrix4()
 oTrans.GetMatrix4(m4)
 
 #カーブからコントロールポイントのリスト、Posを取得
 oCurve = oCurveList.ActivePrimitive.Geometry.Curves(0)
 aPos = oCurve.ControlPoints.PositionArray
 aPos = [list(aPos[0]),list(aPos[1]),list(aPos[2])]
 
 l2gArray(aPos,m4)
 
 #新しいコントロールポイントのリストを作成
 nPos = CreateNewPos(aPos,oSelIDs)
 
 #新規カーブの作成
 CreateNewCurve(nPos)
 
main()


スミマセン、こうでもして書いておかないと
多忙なときは作ったことすら忘れますのでご容赦を

Blog : GameDev : Simon schreibt Blogのゲーム技術ネタ

Simon schreibt Blogのゲーム技術ネタ

OmoriさんのBlogから、Simon schreibtのサイトの紹介,
ゲムの表現の謎解きなど、かなりのネタ解説

必読なのでメモ

Softimage : Modeling : Tutorial : Sloth Robot 3d design – Timelapse video –

ymt3Dさんのブログ 3D人から
リンク>



ふへーこの人SIユーザーだったんだ


気になるところとしては NGON気にしてない。
TextureはKeyLightで作ってるのでUVも気にしてない。


しわはMAYA
メッシュの流れを大きく変えるのに、頂点を選択してのベベル
クロスに最適

限定的なモデリングではあるけれど、
これだけ出来れば、きれいなトポロジも出来るに違いない〜

あと、パーツの蓄え、知識だな〜


後日談
一日Blogを寝かしてたんだけど ツイッターを見る限り

高速モデリングと割り切ってるので、こういう割り方は限定的で、
彼の通常のモデルはきれいなんだそうだ。

あと、SIのモデリングはMAYAなどから見るとうらやましいらしい。

SI のモデリング、いいらしいですよ〜

2013年4月16日火曜日

Softimage Tips テクスチャサポートを残したままフリーズ

Softimage2014も出た事ですが、華麗にスルーしてスクリプトです

Softimage の UV って浮遊しないよね

UVSwimの機能があるのですが、
これって、あまり機能しなくないですか?

いつの間にか、頂点を移動するとUVがくっついてくる。

これは Modeling Freeze をした際
Texture Support もフリーズ、削除されるのが原因です


情報を集めたところ、メーリングリスト、ツイッターから、

コンストラクションヒストリーから、
右クリックでフリーズを選択
すると

Texture Support はフリーズ、削除されないとの事でした。



というわけで、作ってみました。

#Python
app = Application
log = app.LogMessage


def FreezeConstruction(oObj):
 oPri = oObj.ActivePrimitive
 oHis = oPri.ConstructionHistory
 oCol = XSIFactory.CreateObject("XSI.Collection")
 oFlag = False
 for i in oHis:
  if oFlag == False:
   if i.Name == "Modeling":
    oFlag = True
  else:
   oCol.Add(i)
   break
   
 if oCol.Count == 0:
  return

 app.FreezeObj(oCol(0), "", "")

def main():
 oSels = app.Selection
 if oSels.Count == 0:
  return
  
 for oSel in oSels:
  if oSel.Type == "SubCompoent":
   oObj = oSel.SubComponent.Parent3DObject
   FreezeConstruction(oSel) 
  
  if oSel.Type == "polymsh":
   FreezeConstruction(oSel)

main()

モデリングコンストラクション以下の
オペレータのみフリーズするスクリプトです

ボタン化などしたら使い勝手が良いようです


Plugin化とも思ったのですが
現在製作しているツール群に入れようと思ったので
コードのままです orz すみません



近況
資料の入稿が伸びたので多少時間がありました(過去形)

建物の壁をFacerdと言うらしいのですが、
こちらのモデリングを効率化することが、
現在の最優先事項です(した)

というのも FarCry3 の地形エディッタを使ってみたのですが、
これが、パーツをブロックごとに扱い、
背景を制作する手順でした。

その機能の洗練具合に打ちのめされたからではないですが・・・
うそです。勝てないと思いました orz

背景屋さんは使ってみると良いデス
ゲムも最高に面白いデス

あと、アサクリも凄いっすね。
凄いっす。


建物は規格の固まりですので、
なんとか、簡単に出来ないものかと、
余暇で、テスト モデリングをしつつ、
ツールの再整備、C++化など行ってます


ある程度、手順化出来、ツールが大まかな形を見せてきました


正面の写真から、
この程度のモデリングでしたら15分でいけると思います
オブジェクトが単純だものねー


しかし、MAX2014のパースマッチングうらやましい

2013年4月1日月曜日

Softimage OriginalPlugin : CleanPlanePoly

現在の背景、次の資料待ち中なのですが、
プラグインが完成したので公開致します〜

CleanPlanePoly


平面のポリゴンをまとめます

多角ポリゴンが出来ますので、注意が必要ですが、
下絵などのワイヤーフレーム表示見づらい場合は
効果があるかもしれません



ここから > CleanPlanePoly


近況
今回の仕事、なかなかにタイトなのですが、
なんとかこなしてる状態です

UVToolsの説明の方も進めようかと思ったのですが、
プラグインの公開を優先させます〜
その方がモチベが高いので・・・。

2013年3月26日火曜日

Original Python Script : 階段

階段を作ることがあって、めんどくさいからスクリプト化


二本のエッジを選択して 実行

エラー処理しておりません



#CreateStaps
#階段状のポリゴンを作成

app = Application; log = app.LogMessage

nbStep = 50

#エッジを2本選択する

def getQuadPosition(oSub):
 quadPos = []
 oObj = oSub.Parent3DObject
 m = XSIMath.CreateMatrix4()
 oObj.Kinematics.Global.TransForm.GetMatrix4(m)
 oCol = oSub.ComponentCollection
 aEdge = oCol(0)
 bEdge = oCol(1)
 a1Pos = aEdge.Points(0).Position
 a1Pos.MulByMatrix4InPlace(m)
 a2Pos = aEdge.Points(1).Position
 a2Pos.MulByMatrix4InPlace(m)
 b1Pos = bEdge.Points(0).Position
 b1Pos.MulByMatrix4InPlace(m)
 b2Pos = bEdge.Points(1).Position
 b2Pos.MulByMatrix4InPlace(m)

 v1 = XSIMath.CreateVector3()
 v2 = XSIMath.CreateVector3()
 v1.Sub(a2Pos,a1Pos)
 v2.Sub(b2Pos,b1Pos)
 
 quadPos.append(a1Pos)
 quadPos.append(a2Pos)
 
 if v1.Dot(v2) > 0: 
  quadPos.append(b1Pos)
  quadPos.append(b2Pos)
  
 elif v1.Dot(v2) < 0:
  quadPos.append(b2Pos)
  quadPos.append(b1Pos)
  
 else :
  return -1
 
 return quadPos

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

def createIndexPosArray(nbStep,qp):
 aPos = []
 s0 = qp[0]
 s1 = qp[1]
 s2 = qp[2]
 s3 = qp[3]
 
 aH = s2.Y - s0.Y
 bH = s3.Y - s1.Y
 aS = aH * 1.0 / nbStep
 bS = bH * 1.0 / nbStep
 
 
 #p1 = XSIMath.CreateVector3()
 #p2 = XSIMath.CreateVector3()
 v1 = XSIMath.CreateVector3()
 v2 = XSIMath.CreateVector3()
 
 v1.Sub(s2,s0)
 v2.Sub(s3,s1)

 aPos.append(s0)
 aPos.append(s1)
 
 for i in range(nbStep):
 
  p1 = XSIMath.CreateVector3()
  p2 = XSIMath.CreateVector3()
  p3 = XSIMath.CreateVector3()
  p4 = XSIMath.CreateVector3()
  
  temp = ( i + 1.0) / nbStep
  #log( temp )
  p1.ScaleAdd( temp ,v1 , s0 )
  p2.ScaleAdd( temp ,v2 , s1 )
  
  p3.Set(p1.X,p1.Y - aS ,p1.Z)
  aPos.append(p3)
  p4.Set(p2.X,p2.Y - bS ,p2.Z)
  aPos.append(p4)
 
  aPos.append(p1)
  aPos.append(p2)
 
 return aPos


def createMesh(aPos):
 oRoot = app.ActiveSceneRoot
 Name = "Step"
 vertex = []
 for v in aPos:
  vertex.append(v.X)
  vertex.append(v.Y)
  vertex.append(v.Z)
 
 mesh = []
 for i in range(len(aPos) / 2 - 1):
  mesh.append(4)
  mesh.append(i * 2)
  mesh.append(i * 2 +1)
  mesh.append(i * 2 +3)
  mesh.append(i * 2 +2)
  
 #log("mesh : "  + str(mesh))
  
 oMesh = oRoot.addPolygonMesh(vertex,mesh,Name)
 
 return oMesh
 
 
def main ():
 log("----------------------------")
 oSel = app.Selection
 oSub = oSel(0).SubComponent
 
 qp = getQuadPosition(oSub)
 if qp == -1:
  return
 
  
 aPos = createIndexPosArray(nbStep,qp)

 #log("aPos")
 #for i,v in enumerate(aPos):
 # vLog(i,v)
 
 oMesh = createMesh(aPos)
 
 

main()

2013年3月15日金曜日

3DPaint : Mari 2.0

MARI 2.0 New Features Promo Tour from Hieronymus Foundry on Vimeo.



Mari2.0が出ましたよー
Photoshop PSDに対応したそうです!
レイヤースタイルには対応してるんだろうか?

メジャーなバージョンアップ内容
ではない気がしますが、
MariはマイナーVerUPでもしっかりと新機能を搭載してきますので
1.0 > 2.0では機能差が大きいと思います。
保守料は安くないですけどねー

Modoも7.0になって値上げしましたが、
もともとFoundryの価格って高めなので、
Mari以下という値段設定も無いかな〜と思ったり。

Modoが安価で優れたソフトすぎたですよ! (たぶん

Modo + Mariの連携を早く見たいものです・・・。
価格が問題だけど


<近況>
ちょっと、忙しすぎてUVプラグインの説明まで手が回りません〜( @ 〜 @ );;;