Pythonメモ
これすげぇ。。
3D人さんで紹介されていた、
http://tinyurl.com/6n4vjvq
これを試してみました。
手元にあったモデルです↓
1万ポリゴンぐらい。
破綻してる箇所ありますが。。。。
おもしろいなぁ!
みなさんも是非。
あ、地味に年明け一発目なんで、あけおめですね。。。。
今休暇中なんで、また更新できたらしていきます〜。
では…
http://tinyurl.com/6n4vjvq
これを試してみました。
手元にあったモデルです↓
1万ポリゴンぐらい。
破綻してる箇所ありますが。。。。
おもしろいなぁ!
みなさんも是非。
あ、地味に年明け一発目なんで、あけおめですね。。。。
今休暇中なんで、また更新できたらしていきます〜。
では…
2012年の抱負
2012年にやらないといけない事、やりたい事をまとめてみます。
まぁなんで、こんな事するかというと、
2011年新しくゲーム業界にきて、丸1年が過ぎ、
この1年仕事に関しては色々やってきましたが、
それ以外の部分であまり進化がなかった気がしました。
っていうのも、今年は本当に広く浅くやってたので、ほとんど芽が出てこない感じだったんです。
※良く言えば準備期間、悪く言えば、中途半端でしたね。
それではだめなので、来年こそは芽を!
と思って、やりたいことのジャンルを絞ってこの記事書いてみました。
※仕事に直接関係する事はなるべく外しています。要は趣味レベルです。
ではさっそく下記に記述していきます!↓
1.3DSMAXのパーティクルフローのオペレートをマスター
そもそも今年の9月ぐらいから、少しずつ触ってましたが、
正直まだまだ実践レベルでは無いです。
どう実践レベルではないか?
やりたいことが全然できていない、チュートリアル通りの扱い方しか知らない、
マテリアルの設定があまりにもお座なりな感じになっている。
この辺りでしょうか?
※要は基礎ですね。
これを克服するには、数をやる、派生を作成してみる等、まぁ当たり前な事を徹底にやる感じかと。
MAXの操作等を覚えるのに必死で、肝心な所が完全に抜けていました。情けない。。。。。
なんでまずはオペレートをマスターする所からやり直したいと思います。
なんとか7月までにやりたい事のフローが組めるようになりたいです。
2.RealFlowの研究
これ!これがやりたいんです!!
その為に先月ラーニングエディション買いました!
動物のモーションも込みでああいうシーンを作ってみたいんですね!
なんで、それを実現できるために、アプリの研究(要はチュートリアルとか)をやっていきたいですね。
いずれ仕事につなげればうれしく思っています。
3.Pythonでツール作成
PythonQTでファイル操作系のツールを作ってみたいと思います。
具体的にいうと、ダンデライオンさんの「moview」に似たツールの作成です。
上記で挙げた3DSMAXの効果動画をこういったツールでまとめてみたいんです!
作成まではかなり長い道のりですが、今年内で上記のツールに似た物を作れるようになりたいと思います。
目指せ自宅ファイル(アセット)管理ツール作成。
4.リグを自動作成
まずは昨今巷で話題のGearを触ってみたいと思います。
触るには体験版が必要ですね。。。
去年会社で軽く触ってから全くいじっていないので。。。。
まずはここから触っていき、最終的には色々おいしい所を取ったリグを作成したいです。
含ませたい機能などはすでにリストアップしてるので、それを実現できるようにしないと!
ちなみにこんな楽しいリグも一個ぐらいは組んでみたいなぁと思っています。
wallEいいっすね!
特にベルトの部分が素晴らしい!
いつかエクスプレッションだらけのリグも組んでみたいものです。。
まぁざっとみればわかりますが、大体エフェクト寄りな事が多いですねw
まぁこれだけあれば、来年1年でいろいろ成長できるはず!
ただ少し足りない気がするので、これ以降には
余裕があればやってみたいこと書いてみようかと思います。
※余裕があればで。。。
5.Softimage ICEの検証
ICEはちょいちょい触ってたんですが、なかなか深く手がでなかったんです。
今年は余裕があれば、キネマティクスの方触ってみたいなぁと思います。
どれだけ現状と変わるか、期待ですね。
少し前とは違ってチュートリアル多くなりましたよね!いい感じだ。
6.DSLRの映像作成
えぇ〜これは一眼買ったときから、ずっと考えていました。
素材はいつぱい撮ってるんですが、イマイチ「どうしたいのか?」
がはっきりしていない為、なぁなぁなっていました、
今年はMBPを買う予定なので、それでいろいろやってみたいと思います。
目指せショートショート。
7.unity導入
巷で話題のunityをMBP購入と同時に触ってみたいと思います。
とりあえずモーションと物理演算のビューワーとして使ってみたいですね。
まぁこれは細々とやっていきます。
8.高校数学の復習
まぁこの仕事してて、数学の偉大さをしりましたよ。。
絶対必要って訳じゃないんですが、
細野さんの数学本買ってるでそれ見て、復習したいと思います。
9.ダイエット
えぇこれはこのままです。
現在、生まれてもっとも身がついている状態です。
もはや全身大トロですわ。
なんとかしないとです。
つことで来年中に10kg減でお願いします。
まぁこんな感じです。
あまり数書くと実現できない事が増えそうなんで、これぐらいで。。
ちなみに、Pythonスクリプト、モーション、仕事に対しても勿論勉強していく予定です。
今回上げたのはあくまでも、趣味の範囲っすね。
しかし目標こうやって書くと、ベクトルがしっかりしますな!
いい事です。
まぁそんなこんなで、書いて来ましたが、このブログ年内最終更新です。
2011年バイバイ〜
って事で、御開きとさせてもらいます。
それでは、皆さん良い年始を御迎え下さいね〜。
では。。
まぁなんで、こんな事するかというと、
2011年新しくゲーム業界にきて、丸1年が過ぎ、
この1年仕事に関しては色々やってきましたが、
それ以外の部分であまり進化がなかった気がしました。
っていうのも、今年は本当に広く浅くやってたので、ほとんど芽が出てこない感じだったんです。
※良く言えば準備期間、悪く言えば、中途半端でしたね。
それではだめなので、来年こそは芽を!
と思って、やりたいことのジャンルを絞ってこの記事書いてみました。
※仕事に直接関係する事はなるべく外しています。要は趣味レベルです。
ではさっそく下記に記述していきます!↓
1.3DSMAXのパーティクルフローのオペレートをマスター
そもそも今年の9月ぐらいから、少しずつ触ってましたが、
正直まだまだ実践レベルでは無いです。
どう実践レベルではないか?
やりたいことが全然できていない、チュートリアル通りの扱い方しか知らない、
マテリアルの設定があまりにもお座なりな感じになっている。
この辺りでしょうか?
※要は基礎ですね。
これを克服するには、数をやる、派生を作成してみる等、まぁ当たり前な事を徹底にやる感じかと。
MAXの操作等を覚えるのに必死で、肝心な所が完全に抜けていました。情けない。。。。。
なんでまずはオペレートをマスターする所からやり直したいと思います。
なんとか7月までにやりたい事のフローが組めるようになりたいです。
2.RealFlowの研究
これ!これがやりたいんです!!
その為に先月ラーニングエディション買いました!
動物のモーションも込みでああいうシーンを作ってみたいんですね!
なんで、それを実現できるために、アプリの研究(要はチュートリアルとか)をやっていきたいですね。
いずれ仕事につなげればうれしく思っています。
3.Pythonでツール作成
PythonQTでファイル操作系のツールを作ってみたいと思います。
具体的にいうと、ダンデライオンさんの「moview」に似たツールの作成です。
上記で挙げた3DSMAXの効果動画をこういったツールでまとめてみたいんです!
作成まではかなり長い道のりですが、今年内で上記のツールに似た物を作れるようになりたいと思います。
目指せ自宅ファイル(アセット)管理ツール作成。
4.リグを自動作成
まずは昨今巷で話題のGearを触ってみたいと思います。
触るには体験版が必要ですね。。。
去年会社で軽く触ってから全くいじっていないので。。。。
まずはここから触っていき、最終的には色々おいしい所を取ったリグを作成したいです。
含ませたい機能などはすでにリストアップしてるので、それを実現できるようにしないと!
ちなみにこんな楽しいリグも一個ぐらいは組んでみたいなぁと思っています。
wallEいいっすね!
特にベルトの部分が素晴らしい!
いつかエクスプレッションだらけのリグも組んでみたいものです。。
まぁざっとみればわかりますが、大体エフェクト寄りな事が多いですねw
まぁこれだけあれば、来年1年でいろいろ成長できるはず!
ただ少し足りない気がするので、これ以降には
余裕があればやってみたいこと書いてみようかと思います。
※余裕があればで。。。
5.Softimage ICEの検証
ICEはちょいちょい触ってたんですが、なかなか深く手がでなかったんです。
今年は余裕があれば、キネマティクスの方触ってみたいなぁと思います。
どれだけ現状と変わるか、期待ですね。
少し前とは違ってチュートリアル多くなりましたよね!いい感じだ。
6.DSLRの映像作成
えぇ〜これは一眼買ったときから、ずっと考えていました。
素材はいつぱい撮ってるんですが、イマイチ「どうしたいのか?」
がはっきりしていない為、なぁなぁなっていました、
今年はMBPを買う予定なので、それでいろいろやってみたいと思います。
目指せショートショート。
7.unity導入
巷で話題のunityをMBP購入と同時に触ってみたいと思います。
とりあえずモーションと物理演算のビューワーとして使ってみたいですね。
まぁこれは細々とやっていきます。
8.高校数学の復習
まぁこの仕事してて、数学の偉大さをしりましたよ。。
絶対必要って訳じゃないんですが、
細野さんの数学本買ってるでそれ見て、復習したいと思います。
9.ダイエット
えぇこれはこのままです。
現在、生まれてもっとも身がついている状態です。
もはや全身大トロですわ。
なんとかしないとです。
つことで来年中に10kg減でお願いします。
まぁこんな感じです。
あまり数書くと実現できない事が増えそうなんで、これぐらいで。。
ちなみに、Pythonスクリプト、モーション、仕事に対しても勿論勉強していく予定です。
今回上げたのはあくまでも、趣味の範囲っすね。
しかし目標こうやって書くと、ベクトルがしっかりしますな!
いい事です。
まぁそんなこんなで、書いて来ましたが、このブログ年内最終更新です。
2011年バイバイ〜
って事で、御開きとさせてもらいます。
それでは、皆さん良い年始を御迎え下さいね〜。
では。。
SOFTIMAGEで使用するPythonスクリプト超入門3〜後編〜
続きイキマス!
13.球を作成し、その球に対してランダムのアニメーションを作成。
今回は折角なので、ランダムモジュールを使用してみました。
シーンルートを取得
↓↓↓↓↓↓↓↓
球を作成
↓↓↓↓↓↓↓↓
球のキネマティクスを取得
↓↓↓↓↓↓↓↓
球のロット、トランスに対してFカーブを追加
↓↓↓↓↓↓↓↓
ランダム関数を使用してインアウトでアニメーションを追加
わかりやすく観るために、ファンクション使わずに書いてみました。汗

※インデントしていないんで、このままコピペではたぶん使えません。.
コピペした後、インデントを再入力してください。
かなり力技です。コード汚いですね。。。
まぁその文見慣れない方には見やすいはず!?
軽く説明しますと、
「import random」でPythonのランダムモジュールをインポートしています。
それを使用して、値をランダム指定し、アニメーションしてるわけです。
ちなみに配列を使ったわけは「SetKeys」を使いたかっただけで、
特に意味はありません。(結構乱暴な処理なんですかね?笑)
「for--Range」でフレームを回しても全く同様の事でできますね。
Jscriptでは
「
ほぼ変わりないですね。
恐らくもっと細かくやっていくとだいぶ変わってくると思います。
今別件で作ってるやつを比較したら、
圧倒的にPythonが楽でした。
14.カレントビューを取得し、新規カメラに表示を変更する。
現在のカレントビューを取得
↓↓↓↓↓↓↓↓
カメラ作成
↓↓↓↓↓↓↓↓
カレントビューを作成したカメラに変更

現状このままだとあまり、多様的ではないですが、
ビューマネージャ等を使用すれば視野は広がるんではないでしょうか?
少し戸惑った所は、カメラビューの戻り値が「A」とかのアルファベットなんですが、
SetViewCameraでは数値でセット所です。
まぁSDKのサンプルとか見たらすぐ分かりましたけど。。
あとJunkiさんの「乳カメラ」をすごく参考にさせて頂きました。
素晴らしいプラグインです。
jscriptでは
これもほとんど違いはないですね。
内部のコマンドを多用してるおかげですね。
15.モデルを選択し、空のモデルを削除する。その際削除するか、確認する。
シーンルートを取得
↓↓↓↓↓↓↓↓
モデルだけを選択
↓↓↓↓↓↓↓↓
選択した分だけ反復処理
↓↓↓↓↓↓↓↓
モデルの中身を取得
↓↓↓↓↓↓↓↓
中身をカウント
↓↓↓↓↓↓↓↓
条件文でカウントを比較
↓↓↓↓↓↓↓↓
中身があれば、ログ表示
↓↓↓↓↓↓↓↓
中身がなければ、そのモデルを削除

これは今までやってきた事をカウントで条件かけただけですね。
特に説明もいらないですね〜。
Jscriptでは
これも特に…
16.空レイヤーを削除する。その際削除するか、確認する。
レイヤーを全てを取得
↓↓↓↓↓↓↓↓
レイヤーに対して反復処理
↓↓↓↓↓↓↓↓
各レイヤーの中身を取得
↓↓↓↓↓↓↓↓
中身をカウント
↓↓↓↓↓↓↓↓
条件文でカウントを比較
↓↓↓↓↓↓↓↓
空だったものは削除する

これ何気に苦労しましたw
レイヤー中身の取得方法がイマイチ掴めなかったんですね。
まさか「.Members」でいけるとは。。。
これは違うな!って思ってはじいてたプロパティでした。。。
ダメですね。。。反省だ。
Jscriptでは、
これもこれも特に…
とりあえずこれだけ。
※本当はコンストの反転とかしたかったけど。。。次回以降に。。
まぁこれだけあれば、ある程度Pythonが慣れてきました。
あとは実践あるのみですね。
って事で、次回は
「4.今ある、VBSやJScriptをPython化」
をやっていきたいなぁ〜と思っています。
では…
13.球を作成し、その球に対してランダムのアニメーションを作成。
今回は折角なので、ランダムモジュールを使用してみました。
シーンルートを取得
↓↓↓↓↓↓↓↓
球を作成
↓↓↓↓↓↓↓↓
球のキネマティクスを取得
↓↓↓↓↓↓↓↓
球のロット、トランスに対してFカーブを追加
↓↓↓↓↓↓↓↓
ランダム関数を使用してインアウトでアニメーションを追加
わかりやすく観るために、ファンクション使わずに書いてみました。汗
########################
App = Application
Log = App.Logmessage
Sel = App.Selection(0)
########################
########################################
#ランダムモジュールをインポート
import random
#現在のIN、OUTフレームを取得
In = App.Getvalue("PlayControl.In")
Out = App.Getvalue("PlayControl.Out")+1 #+1で
Log(In);Log(Out)
########################################
########################################
#配列(リスト)を宣言し、そこにフレームとランダム値をてれこに入れていく。
Flame_pos = []
Flame_rot = []
Flame_scl = []
for i in range(In, Out):
Flame_pos.append(i)
Flame_rot.append(i)
Flame_scl.append(i)
Flame_pos.append(random.uniform(0,100))
Flame_rot.append(random.uniform(0,100))
Flame_scl.append(random.uniform(0,100))
########################################
########################################
#POS、ROT、SCLを各取得
posx = Sel.posx
posy = Sel.posy
posz = Sel.posz
rotx = Sel.rotx
roty = Sel.roty
rotz = Sel.rotz
sclx = Sel.sclx
scly = Sel.scly
sclz = Sel.sclz
########################################
########################################
#POS,ROT,SCLにFカーブを追加
fc_posx = posx.AddFCurve()
fc_posy = posy.AddFCurve()
fc_posz = posz.AddFCurve()
fc_rotx = rotx.AddFCurve()
fc_roty = roty.AddFCurve()
fc_rotz = rotz.AddFCurve()
fc_sclx = sclx.AddFCurve()
fc_scly = scly.AddFCurve()
fc_sclz = sclz.AddFCurve()
########################################
########################################
#配列化した物を使用して、キーイング
fc_posx.SetKeys(Flame_pos)
fc_posy.SetKeys(Flame_pos)
fc_posz.SetKeys(Flame_pos)
fc_rotx.SetKeys(Flame_rot)
fc_roty.SetKeys(Flame_rot)
fc_rotz.SetKeys(Flame_rot)
fc_sclx.SetKeys(Flame_scl)
fc_scly.SetKeys(Flame_scl)
fc_sclz.SetKeys(Flame_scl)
########################################

※インデントしていないんで、このままコピペではたぶん使えません。.
コピペした後、インデントを再入力してください。
かなり力技です。コード汚いですね。。。
まぁその文見慣れない方には見やすいはず!?
軽く説明しますと、
「import random」でPythonのランダムモジュールをインポートしています。
それを使用して、値をランダム指定し、アニメーションしてるわけです。
ちなみに配列を使ったわけは「SetKeys」を使いたかっただけで、
特に意味はありません。(結構乱暴な処理なんですかね?笑)
「for--Range」でフレームを回しても全く同様の事でできますね。
Jscriptでは
「
var Sel = GetValue("SelectionList");
var In = Getvalue("PlayControl.In");
var Out = Getvalue("PlayControl.Out")+1 ;
var Total = Out-In
Logmessage(Total);
var Flame_pos = new Array();
var Flame_rot = new Array();
var Flame_scl = new Array();
for ( i=0 ; i<Total ; i++){
Flame_pos.push(i);
Flame_rot.push(i);
Flame_scl.push(i);
Flame_pos.push(Math.random()* 100 );
Flame_rot.push(Math.random()* 10 );
Flame_scl.push(Math.random()* 5 );
}
Logmessage(Flame_pos);
////////////////////////////////
//トランス等追加
for ( i=0 ; i<Sel.Count ; i++)
{
posx = Sel(i).kinematics.Local.posx;
posy = Sel(i).kinematics.Local.posy;
posz = Sel(i).kinematics.Local.posz;
rotx = Sel(i).kinematics.Local.rotx;
roty = Sel(i).kinematics.Local.roty;
rotz = Sel(i).kinematics.Local.rotz;
sclx = Sel(i).kinematics.Local.sclx;
scly = Sel(i).kinematics.Local.scly;
sclz = Sel(i).kinematics.Local.sclz;
}
////////////////////////////////
//Fカーブ追加
fc_posx = posx.AddFCurve();
fc_posy = posy.AddFCurve();
fc_posz = posz.AddFCurve();
fc_rotx = rotx.AddFCurve();
fc_roty = roty.AddFCurve();
fc_rotz = rotz.AddFCurve();
fc_sclx = sclx.AddFCurve();
fc_scly = scly.AddFCurve();
fc_sclz = sclz.AddFCurve();
////////////////////////////////
//配列にキー
fc_posx.SetKeys(Flame_pos);
fc_posy.SetKeys(Flame_pos);
fc_posz.SetKeys(Flame_pos);
fc_rotx.SetKeys(Flame_rot);
fc_roty.SetKeys(Flame_rot);
fc_rotz.SetKeys(Flame_rot);
fc_sclx.SetKeys(Flame_scl);
fc_scly.SetKeys(Flame_scl);
fc_sclz.SetKeys(Flame_scl);
」
ほぼ変わりないですね。
恐らくもっと細かくやっていくとだいぶ変わってくると思います。
今別件で作ってるやつを比較したら、
圧倒的にPythonが楽でした。
14.カレントビューを取得し、新規カメラに表示を変更する。
現在のカレントビューを取得
↓↓↓↓↓↓↓↓
カメラ作成
↓↓↓↓↓↓↓↓
カレントビューを作成したカメラに変更
################################################################################
################################################################
App=Application;Log=App.LogMessage
################################################################
#カメラを作成し、取得
Root = App.ActiveSceneRoot
CamRig = Root.AddCameraRig("Camera","Add_Camera")
Cam = CamRig.children(0)
Cam.name = "New_Camera"
Log(Cam)
View = App.GetFocusedViewport( ) #アクティブなカメラを取得
Log(View)
if (View == "A"): #戻り値を数値に変更
View = 0
elif (View == "B"):
View = 1
elif (View == "C"):
View = 2
elif (View == "D"):
View = 3
Log(View)
App.SetViewCamera(Cam, View) #カメラを設定
################################################################################

現状このままだとあまり、多様的ではないですが、
ビューマネージャ等を使用すれば視野は広がるんではないでしょうか?
少し戸惑った所は、カメラビューの戻り値が「A」とかのアルファベットなんですが、
SetViewCameraでは数値でセット所です。
まぁSDKのサンプルとか見たらすぐ分かりましたけど。。
あとJunkiさんの「乳カメラ」をすごく参考にさせて頂きました。
素晴らしいプラグインです。
jscriptでは
「
Root = ActiveSceneRoot;
CamRig = Root.AddCameraRig("Camera","Add_Camera");
Cam = CamRig.children(0);
Cam.name = "New_Camera";
Logmessage(Cam);
View = GetFocusedViewport( );
Logmessage(View)
if (View == "A"){
View = 0
}
else if (View == "B"){
View = 1
}
else if (View == "C"){
View = 2
}
else if (View == "D"){
View = 3
}
Logmessage(View)
SetViewCamera(Cam, View);
」
これもほとんど違いはないですね。
内部のコマンドを多用してるおかげですね。
15.モデルを選択し、空のモデルを削除する。その際削除するか、確認する。
シーンルートを取得
↓↓↓↓↓↓↓↓
モデルだけを選択
↓↓↓↓↓↓↓↓
選択した分だけ反復処理
↓↓↓↓↓↓↓↓
モデルの中身を取得
↓↓↓↓↓↓↓↓
中身をカウント
↓↓↓↓↓↓↓↓
条件文でカウントを比較
↓↓↓↓↓↓↓↓
中身があれば、ログ表示
↓↓↓↓↓↓↓↓
中身がなければ、そのモデルを削除
################################################################
App=Application;Log=App.LogMessage
################################################################
Root = App.ActiveSceneRoot
Find = Root.FindChildren("*","#model","",0) #モデルだけを取得
Log(Find.GetAsText())
for i in Find:
Child = (i).Children
Log(Child.Count)
if (Child.Count == 0): #モデルの中身をカウント
App.DeleteObj(i)

これは今までやってきた事をカウントで条件かけただけですね。
特に説明もいらないですね〜。
Jscriptでは
「
var Root = ActiveSceneRoot
var Find = Root.FindChildren("*","#model","",0)
Logmessage(Find.GetAsText())
for ( i=0 ; i<Find.Count ; i++)
{
Child = Find(i).Children;
Logmessage(Child.Count);
if (Child.Count == 0){
DeleteObj(Find(i));
}
}
」
これも特に…
16.空レイヤーを削除する。その際削除するか、確認する。
レイヤーを全てを取得
↓↓↓↓↓↓↓↓
レイヤーに対して反復処理
↓↓↓↓↓↓↓↓
各レイヤーの中身を取得
↓↓↓↓↓↓↓↓
中身をカウント
↓↓↓↓↓↓↓↓
条件文でカウントを比較
↓↓↓↓↓↓↓↓
空だったものは削除する
#レイヤを取得し、空の物を削除
################################################################
App=Application;Log=App.LogMessage
################################################################Hako = XSIFactory.CreateObject("XSI.Collection")
Root = App.ActiveProject.ActiveScene
Layers = Root.Layers #レイヤーを取得
for i in Layers:
N = i.Members #レイヤーの中身を取得
Log(N.Count)
if(N.Count == 0 ):
Hako.add(i)
Log(Hako)
App.DeleteObj(Hako)

これ何気に苦労しましたw
レイヤー中身の取得方法がイマイチ掴めなかったんですね。
まさか「.Members」でいけるとは。。。
これは違うな!って思ってはじいてたプロパティでした。。。
ダメですね。。。反省だ。
Jscriptでは、
「
var Hako = XSIFactory.CreateObject("XSI.Collection");
var Root = ActiveProject.ActiveScene;
var Layers = Root.Layers;
Logmessage(Layers.GetAsText());
for ( i=0 ; i<Layers.Count ; i++)
{
var N = Layers(i).Members;
Logmessage(N.Count);
if(N.Count == 0 )
{
Hako.add(Layers(i));
}
}
Logmessage(Hako);
DeleteObj(Hako);
」
これもこれも特に…
とりあえずこれだけ。
※本当はコンストの反転とかしたかったけど。。。次回以降に。。
まぁこれだけあれば、ある程度Pythonが慣れてきました。
あとは実践あるのみですね。
って事で、次回は
「4.今ある、VBSやJScriptをPython化」
をやっていきたいなぁ〜と思っています。
では…
SOFTIMAGEで使用するPythonスクリプト超入門3〜中編〜
多忙の為、前回から少し間が空きましたが、再開します。
前回は6個簡単な物を作成したので、その続きを。
※長くなったので、二回に分けています〜
7.選択したオブジェクトのクラスターの内容を全て取得し、
名前を連番で変更。
このコードは他にも色々多用できるので、一つのやり方として、覚えておくといいかもです。
考え方は下記の感じだと思います。
オブジェクトを選択 (複数対応の以下を反復処理)
↓↓↓↓↓↓↓↓
プリミティブを取得
↓↓↓↓↓↓↓↓
クラスターを取得
↓↓↓↓↓↓↓↓
クラスター中身をコレクションとして取得
↓↓↓↓↓↓↓↓
反復処理でコレクションの名前を取得
↓↓↓↓↓↓↓↓
リネーム(連番で)
コマンド的には以前書いたやつの編集版みたいなものになっています。
↓↓↓↓↓↓↓↓

※インデントしていないんで、このままコピペではたぶん使えません。.
コピペした後、インデントを再入力してください。
特に注意点は無いと思いますが、あげるとすれば、
前回でも上げた「enumerate(Cls)」です。
これは反復処理に対して、インデントを付加するものです。
カウントアップに使用できます。
あと前回では名前の変更を
「App.SetValue(str(oNull)+".name", "○○○", "")」
みたいにSetValueで変更していましが、
今回の記述で変更できる事を知り、それに変更しています。
ちなみにJscriptでは↓
「
」
まぁ特に説明も要りませんね。
では次
8.シーン内のテクスチャープロジェクションを選択し、現在使用されていないモノを削除する。
これは使用されてプロジェクションさえ取得できれば、問題無く処理できますね。
選択を取得
↓↓↓↓↓↓↓↓
プリミティブを取得
↓↓↓↓↓↓↓↓
クラスターを取得
↓↓↓↓↓↓↓↓
クラスター中身をコレクションとして取得
↓↓↓↓↓↓↓↓
テクスチャーオート?を取得
↓↓↓↓↓↓↓↓
テクスチャプロジェクション選択
↓↓↓↓↓↓↓↓
使用されているプロジェクションを取得
↓↓↓↓↓↓↓↓
使用されていないモノを削除

ざっくり説明すると、まずは使用している(消さない)プロジェクションを取得し、
その後、選択のクラスターを取得。
カレントUVを条件分で篩にかけて、使用されていないものを削除しています。
そして、使用されているプロジェクションは
「Material」→「CurrentUV」で取得しています。
その後その名前を基準に、選択以下のテクスチャーオートを取得し、
その中のプロジェクションを取得。
それらの名前と使用されているプロジェクションを比較し、
同名の物以外消去しています。
Jscriptでは
特にこれも問題ないですね。
9.シーン内のポイントオートを選択し削除
これは上記の物を少し変更するだけでいけますね。
オブジェクトを選択 (複数対応の以下を反復処理)
↓↓↓↓↓↓↓↓
プリミティブを取得
↓↓↓↓↓↓↓↓
クラスターを取得
↓↓↓↓↓↓↓↓
クラスター中身をコレクションとして取得
↓↓↓↓↓↓↓↓
ポイントオートのみ取得
↓↓↓↓↓↓↓↓
ポイントオートを削除

なんとなくフリーズモデリング入れてます。
あまり意味はないのかな?
クラスターでフィルターをかけ、
タイプのポイントを取得しています。
あとはそれを消去するだけです。
Jscriptでは↓
10.オブジェクトに対して、エンベロープを実行させる。
この手のスクリプト実は触ったことなかったんで、少し楽しかったです。
オブジェクトを選択
↓↓↓↓↓↓↓↓
モードをアニメーションに変更
↓↓↓↓↓↓↓↓
ピックでターゲットを指定
↓↓↓↓↓↓↓↓
エンベロープを実行
↓↓↓↓↓↓↓↓
エンベロープ適応

まずはシーン内にエンベロープを実行するオブジェクトと、ターゲットのオブジェクトを作成してください。
それをベースに説明いたします。
まずは「Pickobject()」でエンベロープのターゲットを指定し、
それを文字列に変換し、エンベロープを適応しています。
特に目立ったことはしていませんが、PickobjectはSDKをよく見てみると面白いかもです。
jscriptでは↓
シンプル!いいねJS。。。。
11.さらにコンポーネントを取得し、ウェイト値を変更させる。
上記のシーンのウェイト値の変更を行います。
オブジェクトを選択(今回は単品処理)
↓↓↓↓↓↓↓↓
エンベロープオブジェクトを選択
↓↓↓↓↓↓↓↓
コンポーネントを取得
↓↓↓↓↓↓↓↓
配列に格納
↓↓↓↓↓↓↓↓
値を編集

いままでやってき構文を使用すれば問題なく、作成できると思います。
ポイントのインデックスを取得するには「SubComponent」で取得し「ElementArray」で配列に格納しています。
その後エンベロープウェイトを取得し、「SIModifyFlexEnvWght」で編集を行っています。
Jscriptでは
12.シーンのタイムレンジを指定のフレームに変更。
現在のインフレームを取得
↓↓↓↓↓↓↓↓
現在のアウトフレームを取得
↓↓↓↓↓↓↓↓
配列を作成(後に使用)
↓↓↓↓↓↓↓↓
インプットボックスを出し、インアウトをコンマで入力
↓↓↓↓↓↓↓↓
コンマでインとアウトをリストに追加
↓↓↓↓↓↓↓↓
配列に従ってインアウトフレームにセットする

シンプルに作成しました。
まずはインプットボックスで、指定するフレームのInOutを入力。
その後コンマで区切って配列に格納しています。
↑いらないのかな?
その後入力した「文字列」を「Int」で「数値」に変換し
タイムをセットしています。
Jscriptでは
やはり配列の書き方が少し違いますね。
最近は慣れましたが。。。。
少し長くなりそうなんで、一旦ここで切ります。
では…
前回は6個簡単な物を作成したので、その続きを。
※長くなったので、二回に分けています〜
7.選択したオブジェクトのクラスターの内容を全て取得し、
名前を連番で変更。
このコードは他にも色々多用できるので、一つのやり方として、覚えておくといいかもです。
考え方は下記の感じだと思います。
オブジェクトを選択 (複数対応の以下を反復処理)
↓↓↓↓↓↓↓↓
プリミティブを取得
↓↓↓↓↓↓↓↓
クラスターを取得
↓↓↓↓↓↓↓↓
クラスター中身をコレクションとして取得
↓↓↓↓↓↓↓↓
反復処理でコレクションの名前を取得
↓↓↓↓↓↓↓↓
リネーム(連番で)
コマンド的には以前書いたやつの編集版みたいなものになっています。
↓↓↓↓↓↓↓↓
################################################################
#選択のクラスタをリスト表示
################################################################
App=Application;Log=App.LogMessage;Sel=App.GetValue("SelectionList")
################################################################
Log(Sel)
for i in Sel:
Cls = (i).ActivePrimitive.Geometry.Clusters #クラスターを取得(コレクション)
for j,k in enumerate(Cls): #enumerateでインデックスを付加
Log(j)
Log(k)
k.name = "Cluster_"+str(j) #文字列をくっつけて名前を変更
################################################################

※インデントしていないんで、このままコピペではたぶん使えません。.
コピペした後、インデントを再入力してください。
特に注意点は無いと思いますが、あげるとすれば、
前回でも上げた「enumerate(Cls)」です。
これは反復処理に対して、インデントを付加するものです。
カウントアップに使用できます。
あと前回では名前の変更を
「App.SetValue(str(oNull)+".name", "○○○", "")」
みたいにSetValueで変更していましが、
今回の記述で変更できる事を知り、それに変更しています。
ちなみにJscriptでは↓
「
Sel = GetValue("SelectionList");
for (i=0;i<Sel.count; i++)
{
Cls = Sel(i).ActivePrimitive.Geometry.Clusters
for ( j=0 ; j<Cls.count ; j++)
{
Logmessage(j);
Cls(j).name = "Cluster_"+(j);
}
}
」
まぁ特に説明も要りませんね。
では次
8.シーン内のテクスチャープロジェクションを選択し、現在使用されていないモノを削除する。
これは使用されてプロジェクションさえ取得できれば、問題無く処理できますね。
選択を取得
↓↓↓↓↓↓↓↓
プリミティブを取得
↓↓↓↓↓↓↓↓
クラスターを取得
↓↓↓↓↓↓↓↓
クラスター中身をコレクションとして取得
↓↓↓↓↓↓↓↓
テクスチャーオート?を取得
↓↓↓↓↓↓↓↓
テクスチャプロジェクション選択
↓↓↓↓↓↓↓↓
使用されているプロジェクションを取得
↓↓↓↓↓↓↓↓
使用されていないモノを削除
################################################################
App=Application;Log=App.LogMessage;Sel=App.GetValue("SelectionList")
################################################################
Hako = XSIFactory.CreateObject("XSI.Collection") #ファクトリーオブジェクトを作成
for i in Sel:
Mat = i.Material #選択している物のマテリアルを取得
CuUV = Mat.CurrentUV #カレントUVで使用しているUVを取得
CuUV_Name = CuUV.name #名前を取得し、比較対象にする
Log(CuUV) #↓テクスチャーオートを取得
Cls = i.ActivePrimitive.Geometry.Clusters.Filter("sample","","Texture_Coordinates_AUTO*")
for j in Cls:
Uvp = j.properties #プロジェクションを取得(コレクション)
Log(Uvp.GetAsText())
for k in Uvp:
Uvp_Name = k.name
if (Uvp_Name == CuUV_Name): #ここでカレントUVと取得したコレクションを比較
Log(k)
else:
Hako.Add(k)
Log(Hako.GetAsText())
App.DeleteObj(Hako)
###################################################################

ざっくり説明すると、まずは使用している(消さない)プロジェクションを取得し、
その後、選択のクラスターを取得。
カレントUVを条件分で篩にかけて、使用されていないものを削除しています。
そして、使用されているプロジェクションは
「Material」→「CurrentUV」で取得しています。
その後その名前を基準に、選択以下のテクスチャーオートを取得し、
その中のプロジェクションを取得。
それらの名前と使用されているプロジェクションを比較し、
同名の物以外消去しています。
Jscriptでは
「
Sel = GetValue("SelectionList")
Hako = XSIFactory.CreateObject("XSI.Collection");
for ( i=0 ; i<Sel.count ; i++){
Mat = Sel(i).Material;
CuUV = Mat.CurrentUV;
CuUV_Name = CuUV.name;
LogMessage(CuUV);
Cls = Sel(i).ActivePrimitive.Geometry.Clusters.Filter("sample",null,"Texture_Coordinates_AUTO*");
for ( j=0 ; j<Cls.count ; j++){
Uvp = Cls(j).properties;
Logmessage(Uvp.GetAsText());
for ( k=0 ; k<Uvp.count ; k++){
Uvp_Name = Uvp(k).name;
if (Uvp_Name == CuUV_Name){
LogMessage(Uvp(k));
}
else{
Hako.Add(Uvp(k));
}
}
}
}
LogMessage(Hako.GetAsText())
DeleteObj(Hako)
」
特にこれも問題ないですね。
9.シーン内のポイントオートを選択し削除
これは上記の物を少し変更するだけでいけますね。
オブジェクトを選択 (複数対応の以下を反復処理)
↓↓↓↓↓↓↓↓
プリミティブを取得
↓↓↓↓↓↓↓↓
クラスターを取得
↓↓↓↓↓↓↓↓
クラスター中身をコレクションとして取得
↓↓↓↓↓↓↓↓
ポイントオートのみ取得
↓↓↓↓↓↓↓↓
ポイントオートを削除
#############################################################
App=Application;Log=App.LogMessage;Sel=App.GetValue("SelectionList")
#############################################################
for i in Sel:
Cls = i.ActivePrimitive.Geometry.Clusters.Filter("pnt") #フィルターでポイントだけ取得
Log(Cls.GetAsText())
App.FreezeModeling(i, "", "") #なんとなくフリーズモデリングしてます
Log(Cls.GetAsText())
App.DeleteObj(Cls)

なんとなくフリーズモデリング入れてます。
あまり意味はないのかな?
クラスターでフィルターをかけ、
タイプのポイントを取得しています。
あとはそれを消去するだけです。
Jscriptでは↓
「
Sel = GetValue("SelectionList")
for ( i=0 ; i<Sel.count ; i++){
Cls = Sel(i).ActivePrimitive.Geometry.Clusters.Filter("pnt",null,"Point_AUTO*");
Logmessage(Cls.GetAsText());
DeleteObj(Cls);
}
」
10.オブジェクトに対して、エンベロープを実行させる。
この手のスクリプト実は触ったことなかったんで、少し楽しかったです。
オブジェクトを選択
↓↓↓↓↓↓↓↓
モードをアニメーションに変更
↓↓↓↓↓↓↓↓
ピックでターゲットを指定
↓↓↓↓↓↓↓↓
エンベロープを実行
↓↓↓↓↓↓↓↓
エンベロープ適応
#############################################################
App=Application;Log=App.LogMessage;Sel=App.GetValue("SelectionList")
#############################################################
Log(Sel(0))
Pick = App.PickObject() #ピックセレクション
Root = App.ActiveSceneRoot
Pick_Obj = Root.findChild(Pick(2)) #ピックオブジェクトを取得
Pick_name = Pick_Obj.name #名前を取得
Log(Pick_name)
App.ApplyFlexEnv(str(Sel(0))+";"+str(Pick_name),"", 2)

まずはシーン内にエンベロープを実行するオブジェクトと、ターゲットのオブジェクトを作成してください。
それをベースに説明いたします。
まずは「Pickobject()」でエンベロープのターゲットを指定し、
それを文字列に変換し、エンベロープを適応しています。
特に目立ったことはしていませんが、PickobjectはSDKをよく見てみると面白いかもです。
jscriptでは↓
「
Sel =Selection(0);
Pick = PickObject();
Root = ActiveSceneRoot;
Pick_Obj = Root.findChild(Pick(2));
Pick_name = Pick_Obj.name;
Logmessage(Pick_name);
ApplyFlexEnv(Sel+";"+Pick_name, null, 2);
」
シンプル!いいねJS。。。。
11.さらにコンポーネントを取得し、ウェイト値を変更させる。
上記のシーンのウェイト値の変更を行います。
オブジェクトを選択(今回は単品処理)
↓↓↓↓↓↓↓↓
エンベロープオブジェクトを選択
↓↓↓↓↓↓↓↓
コンポーネントを取得
↓↓↓↓↓↓↓↓
配列に格納
↓↓↓↓↓↓↓↓
値を編集
#############################################################
App=Application;Log=App.LogMessage;Sel=App.GetValue("SelectionList")
#############################################################
pnts = Sel(0).ActivePrimitive.Geometry.Points
subcmp = pnts.SubComponent
Log( subcmp.ElementArray )
Env = Sel(0).ActivePrimitive.Geometry.Clusters.Filter('pnt','','EnvelopWeightCls*')
EnvProp = Env(0).properties.find("envweights") #ウェイトだけ取得
App.SIModifyFlexEnvWght(str(EnvProp), str(Sel(1)), str(Sel(0))+".pnt[1]", 0, 100.0, "")
Log(EnvProp)

いままでやってき構文を使用すれば問題なく、作成できると思います。
ポイントのインデックスを取得するには「SubComponent」で取得し「ElementArray」で配列に格納しています。
その後エンベロープウェイトを取得し、「SIModifyFlexEnvWght」で編集を行っています。
Jscriptでは
「
var Sel=GetValue("SelectionList");
var pnts = Sel(0).ActivePrimitive.Geometry.Points
var subcmp = pnts.SubComponent;
var PntArray = new Array(subcmp.ElementArray);
var Env = Sel(0).ActivePrimitive.Geometry.Clusters.Filter('pnt','','EnvelopWeightCls*');
var EnvP = Env(0).properties.find("envweights");
Logmessage(EnvP);
SIModifyFlexEnvWght(EnvP, Sel(1), Sel(0)+".pnt[1]", 0, 100.0, "");
」
12.シーンのタイムレンジを指定のフレームに変更。
現在のインフレームを取得
↓↓↓↓↓↓↓↓
現在のアウトフレームを取得
↓↓↓↓↓↓↓↓
配列を作成(後に使用)
↓↓↓↓↓↓↓↓
インプットボックスを出し、インアウトをコンマで入力
↓↓↓↓↓↓↓↓
コンマでインとアウトをリストに追加
↓↓↓↓↓↓↓↓
配列に従ってインアウトフレームにセットする
########################
App = Application
Log = App.Logmessage
Sel = App.Selection(0)
########################
#↓インプットボックスでタイムを入力
Flame = App.XSIInputBox(u"コンマで区切って「インアウトの順で」\n記述してください。","Flame_Change","." )
List = Flame.split(".") #スピリット(コンマ)で区切っています。
Log(str(List))
IntIn = int(List[0]) #Intで数値化
IntOut = int(List[1])
App.SetValue("PlayControl.In", IntIn, "")
App.SetValue("PlayControl.Out", IntOut, "")

シンプルに作成しました。
まずはインプットボックスで、指定するフレームのInOutを入力。
その後コンマで区切って配列に格納しています。
↑いらないのかな?
その後入力した「文字列」を「Int」で「数値」に変換し
タイムをセットしています。
Jscriptでは
「
var oFlame = XSIInputBox("コンマで区切って「インアウトの順で」\n記述してください。","Flame_Change","." ) ;
var Array = oFlame.split(".");
Logmessage(Array);
IntIn = (Array[0]);
IntOut = (Array[1]);
SetValue("PlayControl.In", IntIn, "");
SetValue("PlayControl.Out", IntOut, "");
」
やはり配列の書き方が少し違いますね。
最近は慣れましたが。。。。
少し長くなりそうなんで、一旦ここで切ります。
では…


