TECHNICAL DIRECTOR TRAINING 2
びよんびよんセットアップが99ドルで
メタセコプラグイン だらだら開発期
タブレット、APIの調査中
・・・WindowsAPIの方か
開発機にタブレットが繋いでないので
実験投入が出来ないのが痛い所。
ちょうど開発者が、
メタセコの展望として、
タブレット(端末の意)でモデリングが出来るようにと
ツイートしてたので、
現在、筆圧って取得出来るか伺ってみた。
返事は、
スカルプトツールで内部的には利用してるけど、
プラグインとしては、APIの拡張が必要の事。
うすうす気づいてたんだよね orz
どうやら、筆圧を含むタブレットの情報って
windowsからのメッセージで処理するんだけど、
windows > metaseq > プラグイン なので、
メタセコさんが、仲介してくれないと無理な感じ
やはりWindowハンドルが取れないのが痛い
というわけで、現状メタセコに
筆圧はつかないデス〜
裏技として、グローバルから、メタセコwindowを確定して、
無理矢理データを送れるかもと、思ったり、思わなかったり。
しかし、簡単にはいかなそう。
API拡張をしてもらうしか無いね :p
というわけで、方向性を替えて行きます。
2014年3月3日月曜日
2014年2月4日火曜日
Softimage : Original Script : VVNormal
3年ぶりにスクリプトを修正。
動くようになったので、メモがてら公開

選択したコンポーネントを正面に向けるようにカメラを移動します。
シーンにあらかじめ配置してあるビュー用のカメラがあります。
ビュー用のカメラは、注視点ようのNullがなかったので、
場合分けが出来てなかったですが。
改良して使えるようにしてみました。
付け焼き刃的に拡張したので、
中身はUNKです orz
動くようになったので、メモがてら公開
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
ラベル:
OriginalScript,
Softimage
2013年9月26日木曜日
Tutorial : Softimage : RIG
有償チュートリアルですが、コレは欲しい。
購入リスト入りですよ :p
ttp://cmivfx.com/store/567-Softimage+Python+Rigging+Warmup
購入リスト入りですよ :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 のモデリング、いいらしいですよ〜
リンク>
ふへーこの人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。 小数点以下。
こういったオプションがあるのですね〜。
知りませんでした
できた~
junkiさん、ありがとうございます
ttUVTools
いろいろボタンは用意してますが
まだまだあふぉなところが、
多くて公開にはいたりません orz
PPGにパラメータを追加します
UVは基本0-1間に収めるものですから
その扱いは小数点以下になります
しかし、標準での表示は少数点以下、3位までしか表示です
仮に解像度ぶんUVを移動させようとしたとき
その値は1/1024
小数点以下、3位では足りませんね
うーん、どうしたものかと思ったのですが、
junkiさんに教えてもらいました。
友愛その10。 小数点以下。
こういったオプションがあるのですね〜。
知りませんでした
小数点以下の指定
#Python oItem = ly.AddItem( "offset" ) oItem.SetAttribute(c.siUIDecimals,5)
できた~
junkiさん、ありがとうございます
ttUVTools
いろいろボタンは用意してますが
まだまだあふぉなところが、
多くて公開にはいたりません orz
ラベル:
Python,
SDK,
Softimage,
SoftimageScript
2012年1月7日土曜日
Softimage SDK : ToolContext 01
Softimage2012 より ToolContext APIが使えるようになりました。
いろいろやってOpenGL開発環境を64bitで整えてみました
で、はしょりますがOpenGLで、ここまでできるようになりました(コードはコピペw)
続いてはSoftimageSDKのマニュアルよりToolContextのサンプルをコピペします
で、ビルドするのですが盛大なエラーの数々を
どうやら PickInfoTool がエラーの原因のようです
サンプルを良く見てみると MyPickInfoTool と PickInfoTool が混在してます。
Softimage SDKマニュアル
PickInfoTool と MyPickInfoTool これって同じものを指すんじゃね? サンプル間違ってんじゃね?
素人まるだしですが、PickInfoTool を MyPickInfoTool に変更したら、エラーは出なくなりました
どこか間違ってるかもしれませんが(汗
もう一度ビルドをするのですが、今度は次のエラーが
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
正月の間に何とかしたかったんだけど無理ーーー
OpenGL環境の構築
・OpenGL(GLUT)サンプルプログラム on Windows7
このサイトのやり方でVC++2010で64Bit用にビルドした
OpenGLのサンプル
・GLUTによる「手抜き」OpenGL入門
このサイトでサンプルを作成
以下、調査予定のサイト
・OpenGLおよびシェーダ言語試用記(Visual C++ 2010 Expressの場合)
・Visual C++ 2010でOpenGLを使う
・VC++2010でOpenGL使ったりしたい(Windows7で) ・ベジエ曲線を整数の加減算だけで描画する方法
OpenGLの描画を利用してToolを作れるようになります。
例
このようなToolをつくりたいのです
というわけで、何が必要かというと
・VC++
・OpenGL
の二つが必要になります。ハードル高いッス
VC++ と OpenGL
いろいろやってOpenGL開発環境を64bitで整えてみました
で、はしょりますがOpenGLで、ここまでできるようになりました(コードはコピペw)
Softimage SDK とエラー
続いてはSoftimageSDKのマニュアルよりToolContextのサンプルをコピペします
で、ビルドするのですが盛大なエラーの数々を
どうやら PickInfoTool がエラーの原因のようです
サンプルを良く見てみると MyPickInfoTool と PickInfoTool が混在してます。
Softimage SDKマニュアル
PickInfoTool と MyPickInfoTool これって同じものを指すんじゃね? サンプル間違ってんじゃね?
素人まるだしですが、PickInfoTool を MyPickInfoTool に変更したら、エラーは出なくなりました
どこか間違ってるかもしれませんが(汗
もう一度ビルドをするのですが、今度は次のエラーが
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ではボーンは見つかりませんでした。
そっちのほうも試したかったんだけど。
インポート時の調整
- 向き、横に寝てたので立てたw
これは書き出し時に Yup 右手系が指定できたので問題なし - Path
テクスチャのパスが正しく参照してなかったので、調整。
これも書き出しフォルダが同じだとあまり考えなくていいかも
Softimageの View > General > External Files Maneger で
一気に調整 - マテリアル
Transparencyが0.001とか入ってるのでチェックをはずし、
アルファが必要なものはSpriteにする※Sprite問題あった気がする - ビューの調整のために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
・先ほど作ったTextureMapを選択
・プロパティにて、Photoshopで作った画像を選択
Pushオペレーターを適用
・Gridを選択
・Deform > Push
プラグを選択し、先ほどのテクスチャMapに接続
仕上げに高さを設定
Amplitude に 300を入力
テクスチャの色が0(黒)-1(白)になり、これにAmplitudeかけたものが高さとなります
CEへ、エクスポートをしたり、
SoftimageにCEの道路をインポートしたりしましたが、問題はないようです。
というか、テクスチャを利用した地形の作成って初めてしました(汗
ICE使う必要なかったですね。
8bit 256階調しかないので精度はさほど期待できませんが、
利用できそうですね。
ラベル:
CityEngine,
Softimage
2011年7月21日木曜日
CityEngine:Import
1Softimage = 1m
.Objでインポート可能
SI側で、ポリゴンごとにオブジェクト化する必要がある。
スクリプトで、ポリゴンを分割する。
メッシュ形状
CEで作られるメッシュ形状は非常にシンプル。角度がついてないところにポイントはない。
したがって、通常のXSIなどで作られたメッシュでは都合が悪いかもしれない。
例:左がポイントを整理してないもの。 右が整理したもの
CE上ではそのままEtrudeされるため、ポイントのある位置がそのままエッジになってしまい、
それがビルの境目と認識されてしまう。
SI側で、ポイントを整理するのは面倒なので、
ブロックごとに書き出してCE側で、分割するほうが吉
.Objでインポート可能
SI側で、ポリゴンごとにオブジェクト化する必要がある。
スクリプトで、ポリゴンを分割する。
メッシュ形状
CEで作られるメッシュ形状は非常にシンプル。角度がついてないところにポイントはない。
したがって、通常のXSIなどで作られたメッシュでは都合が悪いかもしれない。
例:左がポイントを整理してないもの。 右が整理したもの
CE上ではそのままEtrudeされるため、ポイントのある位置がそのままエッジになってしまい、
それがビルの境目と認識されてしまう。
SI側で、ポイントを整理するのは面倒なので、
ブロックごとに書き出してCE側で、分割するほうが吉
ラベル:
CityEngine,
Softimage
2011年7月11日月曜日
登録:
投稿 (Atom)
















