ラベル Softimage の投稿を表示しています。 すべての投稿を表示
ラベル Softimage の投稿を表示しています。 すべての投稿を表示

2014年3月3日月曜日

Tutorial : Softimage : TECHNICAL DIRECTOR TRAINING 2

TECHNICAL DIRECTOR TRAINING 2

びよんびよんセットアップが99ドルで



メタセコプラグイン だらだら開発期
タブレット、APIの調査中
・・・WindowsAPIの方か

開発機にタブレットが繋いでないので
実験投入が出来ないのが痛い所。

ちょうど開発者が、
メタセコの展望として、
タブレット(端末の意)でモデリングが出来るようにと
ツイートしてたので、
現在、筆圧って取得出来るか伺ってみた。

返事は、
スカルプトツールで内部的には利用してるけど、
プラグインとしては、APIの拡張が必要の事。


うすうす気づいてたんだよね orz


どうやら、筆圧を含むタブレットの情報って
windowsからのメッセージで処理するんだけど、
windows > metaseq > プラグイン なので、
メタセコさんが、仲介してくれないと無理な感じ

やはりWindowハンドルが取れないのが痛い

というわけで、現状メタセコに
筆圧はつかないデス〜


裏技として、グローバルから、メタセコwindowを確定して、
無理矢理データを送れるかもと、思ったり、思わなかったり。
しかし、簡単にはいかなそう。

API拡張をしてもらうしか無いね :p
というわけで、方向性を替えて行きます。


2014年2月4日火曜日

Softimage : Original Script : VVNormal

3年ぶりにスクリプトを修正。
動くようになったので、メモがてら公開

VVNormal : 効果


選択したコンポーネントを正面に向けるようにカメラを移動します。


Sorce


# VVNormal
#
# v0.1 2014 02 04 とりあえず、UserCameraでもOK
# v0.0 2011 06 04 Cameraには対応するもUserCameraだとNG

SIZE_RETIO = 0.4
BASE_CAMLENGTH = 50

from win32com.client import constants as c
import math
app = Application
log = app.Logmessage
debug = True

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


def dlog(in_value):
 if debug:
  log(in_value)


#ポリゴンのノーマルの平均を算出しノーマライズ
def getPolyAverageNormal(oColl, m3): 
 NA = oColl.NormalArray
 Nx = Ny = Nz = 0
 for i in range(len(NA[0])):
  Nx += NA[0][i]
  Ny += NA[1][i]
  Nz += NA[2][i]
 nV = XSIMath.CreateVector3(Nx,Ny,Nz)
 if nV.Length() <= 0.01:
  nV.Set(0,0,1)
 nV.NormalizeInPlace()
 nV.MulByMatrix3InPlace(m3)
 return nV


#Cameraの注視点を取得
def getCamInterestPos(oColl, m): 
 #CameraのInterestを選択したポリゴンのBBoxの中央に
 pnts = oColl.NeighborVertices(1)
 xp = []
 yp = []
 zp = []
 for pnt in pnts:
  pos = pnt.Position
  pos.MulByMatrix4InPlace(m)
  xp.append(pos.X)
  yp.append(pos.Y)
  zp.append(pos.Z)
 xplen = abs( max(xp)-min(xp) )
 yplen = abs( max(yp)-min(yp) )
 zplen = abs( max(zp)-min(zp) )
 inPos = XSIMath.CreateVector3(xplen * 0.5 + min(xp) ,yplen * 0.5 + min(yp) , zplen * 0.5 + min(zp) )
 return inPos

 
def main():
 dlog("-----main-----")
 userCam = True

 #カメラの取得
 cam = getActiveCamera()
 dlog("CamName : " + str(cam.name))
 cons = cam.Kinematics.Constraints
 log(cons.count)
 for con in cons:
  if con.Type == 'dircns':
   cameraIns = con.Constraining(0)
   userCam = False
   break;
 if app.Selection != None:
  if app.Selection(0).Type != "polySubComponent":
   dlog("PolyMode")
  elif app.Selection(0).Type != "edgeSubComponent":
   dlog("edge")
  elif app.Selection(0).Type != "pntSubComponent":
   dlog("pnt")
  else :
   return
 else:
  return

 oSel = app.Selection(0)
 oSub = oSel.SubComponent
 oObj = oSub.Parent3DObject
 oColl = oSub.ComponentCollection
 m = XSIMath.CreateMatrix4()
 m3 = XSIMath.CreateMatrix3()
 oObj.Kinematics.Global.Transform.GetMatrix4(m)
 oObj.Kinematics.Global.Transform.Rotation.GetMatrix3(m3)
 im = XSIMath.CreateMatrix4()
 im.Invert(m)
 
 #注視点を取得
 inPos = getCamInterestPos(oColl, m)
 
 #Normalを取得
 nV = getPolyAverageNormal(oColl,m3)
 
 oTrans = XSIMath.CreateTransform()
 
 #UserCamでなければ
 if userCam == False:
  cameraIns.Kinematics.Global.Transform = oTrans
  oTrans.SetTranslation(inPos)
 
 #ビューマトリクスから、Xの長さYの長さを算出
 vm = createViewMatrix(nV,inPos)
 m.MulInPlace(vm)
 pnts = oColl.NeighborVertices(1)
 xp = []
 yp = []
 for pnt in pnts:
  pos = pnt.Position
  pos.MulByMatrix4InPlace(m)
  xp.append(pos.X)
  yp.append(pos.Y)
 xLength = abs( max(xp)-min(xp) )
 yLength = abs( max(yp)-min(yp) )

 #カメラの画角より、最適な距離を算出。 inX inY in割合
 camLength = BASE_CAMLENGTH
 if xLength > 0.01 and yLength > 0.01:
  camLength = getCameraLength(cam, xLength, yLength, SIZE_RETIO)
 
 #カメラのポジションに適用
 camPos = XSIMath.CreateVector3()
 nV.ScaleInPlace( camLength )
 camPos.Add(inPos,nV)
 
 if userCam :
  dlog("UserCamera Mode")
  
  #距離の指定
  cam.interestdist.Value = camLength

  oTrans.SetTranslation(camPos)
  oRot = XSIMath.CreateRotation()
  vm.InvertInPlace()
  oTrans.SetMatrix4(vm)
  app.SetValue(cam.FullName + ".kine.global.rotx", oTrans.RotX, "")
  app.SetValue(cam.FullName + ".kine.global.roty", oTrans.RotY, "")
  app.SetValue(cam.FullName + ".kine.global.rotz", oTrans.RotZ, "")
  app.SetValue(cam.FullName + ".kine.global.posx", camPos.X, "")
  app.SetValue(cam.FullName + ".kine.global.posy", camPos.Y, "")
  app.SetValue(cam.FullName + ".kine.global.posz", camPos.Z, "")

 else :
  dlog("CameraMode : Moved")
  oTrans.SetTranslation(camPos)
  cam.Kinematics.Global.Transform = oTrans
  
 dlog("-----finish-----")
 
 return
 
#アクティブなカメラを取得
def getActiveCamera():
 oL = app.DeskTop.ActiveLayOut
 
 #デフォルトビューのチェック
 oV = oL.views("vm")
 abcd = oV.GetAttributeValue("viewportundermouse")
 if oV.Views(abcd).Type == 'Viewer':
  ActiveView = oV.GetAttributeValue("activecamera:" + abcd)
  log(ActiveView)
  if (ActiveView =="User") or (ActiveView =="Top") or (ActiveView =="Front") or (ActiveView =="Right"):
   cam = app.GetValue("Views.View" + abcd + "." + ActiveView + "Camera")
  else:
   cam = app.GetValue(ActiveView)

 #ビューマネージャーにある、オブジェクトビューのチェック 
 num = 0
 for i in range(4):
  if oV.Views(i).Type == 'Object View':
   num += 1
 log("ObjectViewCount : " + str(num))  
 if oV.Views(abcd).Type == 'Object View':
  ActiveView = oV.Views(abcd).GetAttributeValue("Camera")
  ViewName = oV.Views(abcd).FullName
  log(ActiveView)
  log(ViewName)
  if ActiveView == "default":
   cam = app.GetValue("Views.View" + str(num) + ".UserCamera")
  else:
   cam = app.GetValue(ActiveView)
   
 #フローティングのオブジェクトビューの対応 
 for x in oL.Views:
  if x.Type == 'Object View':
   log(x)
   ActiveView = x.GetAttributeValue("Camera")
   if ActiveView == "default":
    cam = app.GetValue("Views.View" + str(num) + ".UserCamera")
   else:
    cam = app.GetValue(ActiveView)
 return cam
 
#画角と長さより焦点からのカメラの距離を算出
def getCameraLength(inCamera, inX, inY, inPercnet):
 cam = inCamera
 x = inX
 y = inY
 aspect = cam.aspect.Value
 fov = cam.fov.Value
 fovtype = cam.fovtype.Value #if 1:Horizontal
 
 fov = XSIMath.DegreesToRadians(fov)
  
 #Xでの算出
 xCos =  ( 0.5 * x ) / math.tan( 0.5 * fov ) 
 #Yでの算出
 yCos = ( 0.5 * y ) / math.tan( 0.5 * fov ) * aspect
 
 if xCos > yCos:
  length = xCos
 else:
  length = yCos
  
 length = length / inPercnet
 return length

#ビューマトリックスの作成 
def createViewMatrix(inNormalVect,inInsPos):
 nv = inNormalVect
 m = XSIMath.CreateMatrix4()
 upv = XSIMath.CreateVector3(0,1,0)
 if nv.Dot(upv) > 0.9:
  m.Set(1,0,0,0,   0,0,-1,0, 0,-1,0,0, inInsPos.X, inInsPos.Y , inInsPos.Z , 1)
  m.InvertInPlace()
  return m
 u = XSIMath.CreateVector3()
 v = XSIMath.CreateVector3()
 w = XSIMath.CreateVector3()

 w.Scale(-1 , nv)
 w.NormalizeInPlace()
 
 u.Cross(upv,w)
 u.NormalizeInPlace()
 
 v.Cross(u,w)
 v.NormalizeInPlace()
 
 m.Set(
 u.X , u.Y , u.Z , 0 ,
 v.X , v.Y , v.Z , 0 ,
 w.X , w.Y , w.Z , 0 ,
 inInsPos.X, inInsPos.Y , inInsPos.Z , 1
 )
 m.InvertInPlace()
 return m
 
main()


備考

Softimageは、自分で制作するカメラと、
シーンにあらかじめ配置してあるビュー用のカメラがあります。

ビュー用のカメラは、注視点ようのNullがなかったので、
場合分けが出来てなかったですが。
改良して使えるようにしてみました。

付け焼き刃的に拡張したので、
中身はUNKです orz

2013年9月26日木曜日

Tutorial : Softimage : RIG

有償チュートリアルですが、コレは欲しい。

購入リスト入りですよ :p
ttp://cmivfx.com/store/567-Softimage+Python+Rigging+Warmup

2013年4月17日水曜日

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

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



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


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


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

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

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


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

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

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

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

2013年1月31日木曜日

Memo : C++ : DebugLog

DebugLog

デバックの為のログ マクロを使う

#define DEBUGLOG 1

#if DEBUGLOG
#define debugLog( message ) XSI::Application()LogMessage( message )
#else
#define debugLog( message )
#endif

いままで全部手動でコメントアウトしてたー

2012年4月10日火曜日

SoftimageScript PPGLayout : 小数点以下

UVのPluguinを作っているのですが
PPGにパラメータを追加します

UVは基本0-1間に収めるものですから
その扱いは小数点以下になります

しかし、標準での表示は少数点以下、3位までしか表示です

仮に解像度ぶんUVを移動させようとしたとき
その値は1/1024
小数点以下、3位では足りませんね

うーん、どうしたものかと思ったのですが、
junkiさんに教えてもらいました。

友愛その10。 小数点以下。

こういったオプションがあるのですね〜。
知りませんでした


小数点以下の指定

#Python
oItem = ly.AddItem( "offset" )
oItem.SetAttribute(c.siUIDecimals,5)




できた~
junkiさん、ありがとうございます


ttUVTools
 いろいろボタンは用意してますが
 まだまだあふぉなところが、
 多くて公開にはいたりません orz

2012年1月7日土曜日

Softimage SDK : ToolContext 01

Softimage2012 より ToolContext APIが使えるようになりました。
OpenGLの描画を利用してToolを作れるようになります。


このようなToolをつくりたいのです
というわけで、何が必要かというと

・VC++
・OpenGL

の二つが必要になります。ハードル高いッス


VC++ と OpenGL


いろいろやってOpenGL開発環境を64bitで整えてみました
で、はしょりますがOpenGLで、ここまでできるようになりました(コードはコピペw)


Softimage SDK とエラー


続いてはSoftimageSDKのマニュアルよりToolContextのサンプルをコピペします
で、ビルドするのですが盛大なエラーの数々を
どうやら PickInfoTool がエラーの原因のようです
サンプルを良く見てみると MyPickInfoToolPickInfoTool が混在してます。

Softimage SDKマニュアル

PickInfoToolMyPickInfoTool これって同じものを指すんじゃね? サンプル間違ってんじゃね?
素人まるだしですが、PickInfoToolMyPickInfoTool に変更したら、エラーは出なくなりました
どこか間違ってるかもしれませんが(汗 


もう一度ビルドをするのですが、今度は次のエラーが
1>ToolContext.obj : error LNK2019: 未解決の外部シンボル __imp_glRasterPos2i が関数 "public: class XSI::CStatus __cdecl MyPickInfoTool::Draw(class XSI::ToolContext &)" (?Draw@MyPickInfoTool@@QEAA?AVCStatus@XSI@@AEAVToolContext@3@@Z) で参照されました。
1>ToolContext.obj : error LNK2019: 未解決の外部シンボル __imp_glColor3d が関数 "public: class XSI::CStatus __cdecl MyPickInfoTool::Draw(class XSI::ToolContext &)" (?Draw@MyPickInfoTool@@QEAA?AVCStatus@XSI@@AEAVToolContext@3@@Z) で参照されました。

どうやら、 OpenGL のライブラリーを正しく参照できてないのかな?
しかし、OpenGL のサンプルでは、あらためてインクルードフォルダを指定する必要はなかったのですが。

いろいろやってみたのですが、解決しませんでした、というわけで、現在停滞中です orz


正月の間に何とかしたかったんだけど無理ーーー


Memo


OpenGL環境の構築
OpenGL(GLUT)サンプルプログラム on Windows7
 このサイトのやり方でVC++2010で64Bit用にビルドした

OpenGLのサンプル
GLUTによる「手抜き」OpenGL入門
 このサイトでサンプルを作成

以下、調査予定のサイト
OpenGLおよびシェーダ言語試用記(Visual C++ 2010 Expressの場合)
Visual C++ 2010でOpenGLを使う
VC++2010でOpenGL使ったりしたい(Windows7で)ベジエ曲線を整数の加減算だけで描画する方法

2011年9月28日水曜日

SpeedTree6 : Import Softimage




トライアルの制限として、FBXでエキスポートするとメッシュが壊れるので、
検証が出来ない、どうにかならんの~?
と、サポートにたずねたところ、

「Samples/Trees フォルダに、ちょうど出力したFBXがあるぜ HAHA!」(超意訳

と返事が来たので、早速Softimageにインポートしてみました。


結論から言うと、無事にインポートできました、
ポイントキャッシュ? でアニメーションも出来ます。

このSampleではボーンは見つかりませんでした。
そっちのほうも試したかったんだけど。


インポート時の調整
  1. 向き、横に寝てたので立てたw
    これは書き出し時に Yup 右手系が指定できたので問題なし
  2. Path
    テクスチャのパスが正しく参照してなかったので、調整。
    これも書き出しフォルダが同じだとあまり考えなくていいかも

    Softimageの View > General > External Files Maneger で
    一気に調整
  3. マテリアル
    Transparencyが0.001とか入ってるのでチェックをはずし、 
    アルファが必要なものはSpriteにする※Sprite問題あった気がする
  4. ビューの調整のためにOpenGLの設定を適切なものに変更するぐらいです。

    マテリアルは、このサイズで5-6個、面倒になったら、
    スクリプトで一括処理の必要があるかもしれません

適当にレンダリング


というか、FBXで問題あったらゴラー(怒
していいとおもう

2011年7月28日木曜日

Softimage Tips : HeightMap で地形を作成

テクスチャを利用して、Softimage と、CityEngineで同じ地形のメッシュを作成します。
※下位VerのCEでは、地形のエクスポートが出来ないため
  必要になりそうです。



■PhotoshopなどでHeightMapを作成
・4000pix  x  2000pix 1Pix = 1mと見立てます


■Softimageで地形を作成する
Gridを作成、4000x2000 400x200に分割 10m間隔に



TextureMapを作成
・Property > TextureMap > xz 


 HeightMapを指定
・先ほど作ったTextureMapを選択
・プロパティにて、Photoshopで作った画像を選択

Pushオペレーターを適用
・Gridを選択
・Deform > Push


プラグを選択し、先ほどのテクスチャMapに接続




仕上げに高さを設定
Amplitude に 300を入力
テクスチャの色が0(黒)-1(白)になり、これにAmplitudeかけたものが高さとなります


CEへ、エクスポートをしたり、
SoftimageにCEの道路をインポートしたりしましたが、問題はないようです。

というか、テクスチャを利用した地形の作成って初めてしました(汗
ICE使う必要なかったですね。

8bit 256階調しかないので精度はさほど期待できませんが、
利用できそうですね。



2011年7月21日木曜日

CityEngine:Import

1Softimage = 1m

.Objでインポート可能
SI側で、ポリゴンごとにオブジェクト化する必要がある。
スクリプトで、ポリゴンを分割する。

メッシュ形状
CEで作られるメッシュ形状は非常にシンプル。角度がついてないところにポイントはない。
したがって、通常のXSIなどで作られたメッシュでは都合が悪いかもしれない。

例:左がポイントを整理してないもの。 右が整理したもの

CE上ではそのままEtrudeされるため、ポイントのある位置がそのままエッジになってしまい、
それがビルの境目と認識されてしまう。

SI側で、ポイントを整理するのは面倒なので、
ブロックごとに書き出してCE側で、分割するほうが吉