Pythonの勉強をまったく始められないあなたと私に送る8つのタスク
メモ(w
2011年6月28日火曜日
2011年6月27日月曜日
2011年6月21日火曜日
Tool:OverCoat
OverCoat?
siggraph 2011 での発表らしいのですが
ストロークを記録するタイプの3Dペイントツールのようです。
いやあ、これ激重でしょ(w
とは思いますが表現がすごいですね〜。
あと、アーティストが直感的に操れます。
まだ、アニメーションは対応してないようですが、
コレを動かせる日も遠くはないでしょう。
siggraph 2011 での発表らしいのですが
ストロークを記録するタイプの3Dペイントツールのようです。
いやあ、これ激重でしょ(w
とは思いますが表現がすごいですね〜。
あと、アーティストが直感的に操れます。
まだ、アニメーションは対応してないようですが、
コレを動かせる日も遠くはないでしょう。
2011年6月16日木曜日
Mari : PYTHON SCRIPTING FOR MARI
コンソールって、ログとは違うのだね。
いまいち使い方がわからんかった。使ってて慣れるしか無いな〜。
いまだにポリゴンへのアクセスが見つからず。
2011年6月14日火曜日
Python : 多次元配列の要素でのソート
Pythonでの多次元配列の比較
基本の.sort()だと、要素の[0]番目でソートされる。
たとえば、[ [Index,x,y,z], , , ,]ではIndexでソートされる事になる。
たとえば、yでソートしたい場合等に対応するには
関数で指定してやれば良い。
パイソンすげぇと思ったら、普通にJScriptでもあった orz
知らなかっただけ。
lambdaを使う
わざわざ関数を指定するのがメンドクサイ場合、無名関数のlambdaを使うと良い
cmp関数
cmp(a,b)は a,bを比較して、値を返す
基本の.sort()だと、要素の[0]番目でソートされる。
たとえば、[ [Index,x,y,z], , , ,]ではIndexでソートされる事になる。
たとえば、yでソートしたい場合等に対応するには
関数で指定してやれば良い。
def hikaku(x,y): return x[2] - y[2] #ココに、比較したい要素の番号を入れる list = [ [0,0,5,9] , [1,3,4,5] , [2,6,3,5] ] list.sort( hikaku )
パイソンすげぇと思ったら、普通にJScriptでもあった orz
知らなかっただけ。
lambdaを使う
わざわざ関数を指定するのがメンドクサイ場合、無名関数のlambdaを使うと良い
list.sort( cmp = lambda x , y: cmp(x[2],y[2]) )
cmp関数
cmp(a,b)は a,bを比較して、値を返す
2011年6月13日月曜日
Camera : EXILIM EX-Z2300
マクロモードで撮影
常時携帯用として、CASIOのコンデジを購入してみました。
1万ちょい。安くなった物です。
テクスチャ 資料収集用としては十分かな。
しかし、撮影したあとに時間がかかる
内部で補正とかしてるんだろうな〜。
2011年6月12日日曜日
GameDev:Sky
リアルタイムの空の表現も格段にあがってきてまして、
fogとSkyDomeだけでなく
レイリー散乱、ミー散乱を使うようです。
ハイ、さっぱりわかりません。
なので、とりあえずメモだけしておきます。
http://karen.saiin.net/~hayase/hitori/h2004_0817.html
http://game.watch.impress.co.jp/docs/20030916/oni3_2.htm
fogとSkyDomeだけでなく
レイリー散乱、ミー散乱を使うようです。
ハイ、さっぱりわかりません。
なので、とりあえずメモだけしておきます。
http://karen.saiin.net/~hayase/hitori/h2004_0817.html
http://game.watch.impress.co.jp/docs/20030916/oni3_2.htm
2011年6月9日木曜日
Mari : MouseGestures
マニュアルをぺらぺらめくってるとマウスジェスチャーなるものがあった。
バックススラッシュキー"\"押しながら、タブレットで普通に書けばいい。
あいまいでもOKで消しゴムだと E ペンだと Pって、
描いてみたら反応してくれる。
カスタマイズは出来ないけど、これすげー便利。
わりと複雑なので、覚えられないかなと思ったけど、
キーボードに視線を落とさないでいいのでむちゃくちゃ楽
ショートカットの出番減るかも。
バックスラッシュだけじゃなく、
ほかのキーと併用してくれると助かるんだけどなー
バックススラッシュキー"\"押しながら、タブレットで普通に書けばいい。
あいまいでもOKで消しゴムだと E ペンだと Pって、
描いてみたら反応してくれる。
カスタマイズは出来ないけど、これすげー便利。
わりと複雑なので、覚えられないかなと思ったけど、
キーボードに視線を落とさないでいいのでむちゃくちゃ楽
ショートカットの出番減るかも。
バックスラッシュだけじゃなく、
ほかのキーと併用してくれると助かるんだけどなー
Mari : Cache と Projects
Mari
ちょっと失敗
まあ、失敗から学ぼう
■Cacheはプロジェクトファイル
Mariは初回起動時にCacheドライブを設定します。
キャッシュファイルなので一時的なものかと思い
※RamDiskに設定してんですが、
Mariのプロジェクトはすべてここに保存されるみたい
再起動のたびにプロジェクトが全部破棄されるハメに・・・
プロジェクト数が多くなったときどうするかというと、
¥アーカイブという形で任意の位置にバックアップするようです。
忘れたときのダメージがでかすぎるので、
通常のHDD Driveに変更しようと思いました。
■Cacheフォルダの変更
Tools > Cache Location SetupでCacheの位置を変更することが出来る
ファイルが残っていると変更できないようですので、
すべてプロジェクトファイルを消します
複数のキャッシュが指定できるみたいでが、
RamDiskと併用してはいけません orz
ためしに2つ指定してみたのですが、
プロジェクトが保存されなくなりました。
想定外の使い方をしてるのでしょう。
指定しなおせばいいと考え
すべてのプロジェクトを消したのですが
Mariさんがプロジェクトを削除してくださいと警告をだし、
先ほどのWindowが開かなくなってしまいました
■初期設定ファイル
初期設定ファイルを削除することに。
User / username / .mari /
以下を削除して再起動
無事、起動時にキャッシュフォルダを選択でき、
単一にすることが出来ました。
アブアブ
■さらに
※すべて削除しなくとも
ちょっと失敗
まあ、失敗から学ぼう
■Cacheはプロジェクトファイル
Mariは初回起動時にCacheドライブを設定します。
キャッシュファイルなので一時的なものかと思い
※RamDiskに設定してんですが、
Mariのプロジェクトはすべてここに保存されるみたい
再起動のたびにプロジェクトが全部破棄されるハメに・・・
プロジェクト数が多くなったときどうするかというと、
¥アーカイブという形で任意の位置にバックアップするようです。
忘れたときのダメージがでかすぎるので、
通常のHDD Driveに変更しようと思いました。
■Cacheフォルダの変更
Tools > Cache Location SetupでCacheの位置を変更することが出来る
ファイルが残っていると変更できないようですので、
すべてプロジェクトファイルを消します
RamDiskと併用してはいけません orz
ためしに2つ指定してみたのですが、
プロジェクトが保存されなくなりました。
想定外の使い方をしてるのでしょう。
指定しなおせばいいと考え
すべてのプロジェクトを消したのですが
Mariさんがプロジェクトを削除してくださいと警告をだし、
先ほどのWindowが開かなくなってしまいました
■初期設定ファイル
初期設定ファイルを削除することに。
User / username / .mari /
以下を削除して再起動
無事、起動時にキャッシュフォルダを選択でき、
単一にすることが出来ました。
アブアブ
■さらに
※すべて削除しなくとも
User / username / .mari / TheFoundry / CacheLocations.ini
のファイルだけ削除しても起動時にキャッシュドライブを指定できました。
ただし、そのフォルダに何もはいってないことが前提です。
ini ファイルの記述がただのテキストですのでコレを変更するだけでも
良いかもしれませんが、そこまでは確認取ってません。
[CacheRoots]
1\Path=O:/Mari/Mari_Cahe
size=1
■まとめ
状態が悪くなったらとりあえず初期設定ファイルを捨てろ
調子のいいときに初期設定ファイルをバックアップしておけ
ということで
2011年6月8日水曜日
AutoDesk SketchBook Designer 2011
ベクター系ですね。これはちょっと欲しいかも。
いや、その前に液晶タブレットが欲しい。
液晶タブレットの大きい方は、
現在震災の影響で、再販出来ずにいるようです。
まあ、お金ないけどなー
PS.値段調べたら、7万超えてた。
2011年6月5日日曜日
AlignPlane v0.1
選択したコンポーネントを平面にそろえます
※フリーズ前提です
使い方
コンポーネントを選択
PICKセッションになるので、平面を作成
平面化しました。
以前、ツイッターで平面化の話が出たときには???
って感じでしたけど、仕事で必要だったので、作ってみました。
※フリーズ前提です
使い方
コンポーネントを選択
PICKセッションになるので、平面を作成
平面化しました。
JScript
//AlignPlane //2011 05 14 //v0.1 main(); function main(){ if(Selection(0).Count == 0) return var oSel = Selection(0); if(oSel.type == "polymsh"){ //ジオメトリを選択していた場合 oObj = oSel oSub = oSel.ActivePrimitive.Geometry.Points.SubComponent }else if(oSel.Type == "edgeSubComponent" || oSel.Type == "polySubComponent"){ oSub = oSel.SubComponent.ComponentCollection.NeighborVertices( 1 ).SubComponent; oObj = oSub.Parent3DObject; }else if(oSel.Type == "pntSubComponent"){ oSub = oSel.subComponent; oObj = oSub.Parent3DObject; }else{ return false; } FreezeModeling(oObj); Logmessage(oSub) oColl = oSub.ComponentCollection; //そろえるべき平面を作る p0 = XSIMath.CreateVector3(); p1 = XSIMath.CreateVector3(); p2 = XSIMath.CreateVector3(); Pick = pickPosition(); if(!Pick(0))return; p0.set(Pick(1),Pick(2),Pick(3)); Pick = pickPosition(); if(!Pick(0))return; p1.set(Pick(1),Pick(2),Pick(3)); Pick = pickPosition(); if(!Pick(0))return; p2.set(Pick(1),Pick(2),Pick(3)); v1 = XSIMath.CreateVector3(); v2 = XSIMath.CreateVector3(); nv = XSIMath.CreateVector3(); v1.sub(p0,p1); v2.sub(p2,p1); nv.Cross(v1,v2); nv.NormalizeInPlace(); //選択したコンポーネントのインデックスのアレイ IDArray = oColl.IndexArray.toArray(); //Logmessage("IDArray " + IDArray); //オブジェクトの頂点のアレイ Pnts = oObj.ActivePrimitive.Geometry.Points; PosArray = Pnts.PositionArray.toArray(); //ポイント移動用のベクトル mv = XSIMath.CreateVector3(); for(var i = 0; i < Pnts.count; i++){ for(var j = 0; j < IDArray.length; j++){ if(i == IDArray[j]){ //Logmessage("ID " + i + " point is Move") var pPos = L2W(oObj,Pnts(i).Position); var d = nv.Dot( p0 );//ポリ平面は p・n = d var dist = pPos.Dot( nv ) -d; //符号距離は p・n-d mv.Scale( - dist, nv) pPos.addInPlace( mv ); pPos = XSIMath.MapWorldPositionToObjectSpace( oObj.Kinematics.Local.Transform, pPos ); //Logmessage(PosArray[i * 3] + " > " + pPos.x); PosArray[i * 3] = pPos.x; PosArray[i * 3 + 1] = pPos.y; PosArray[i * 3 + 2] = pPos.z; } } } Pnts.PositionArray = PosArray; return true; } //Local to World function L2W(inObj,inVect){ v = inVect; m = XSIMath.CreateMatrix4(); inObj.Kinematics.Global.Transform.getMatrix4(m); v.MulByMatrix4InPlace( m ); return v; }
以前、ツイッターで平面化の話が出たときには???
って感じでしたけど、仕事で必要だったので、作ってみました。
Export2Mari v0.11
選択したオブジェクトを、一気にObj形式で書き出します。
PythonでのPPGも理解できたかな~
※もともと一気に書き出すのはオプションでした orz
修正
Python
PythonでのPPGも理解できたかな~
※もともと一気に書き出すのはオプションでした orz
修正
Python
#Export2Mari v0.11 # 2011 06 08 from win32com.client import constants as c app = Application log = app.Logmessage cp = XSIFactory.CreateObject("CustomProperty") cp.Name = "ExportObjects 2 Mari" cp.AddParameter3('fileDirectory', c.siString) #デフォルトディレクトリ cp.fileDirectory.Value = 'O:\Mari' ly = cp.PPGLayout ly.AddGroup("Export") ly.AddRow() ly.AddItem('fileDirectory','Directory',c.siControlFolder) ly.AddButton("Export") ly.EndRow() ly.EndGroup() app.InspectObj(cp) ly.Language = 'Python' ly.Logic = ''' from win32com.client import constants as c app = Application log = app.Logmessage def Export_OnClicked(): dir = str(PPG.fileDirectory.Value) data = dir + "/" log('Export : ' + data) #log(data) app.ObjExport(data,1, "", "", "", "", "", "", "", "", 0, False, False, "", False) '''
ラベル:
Mari,
SoftimageScript
2011年6月4日土曜日
GetActiveCamera
アクティブなカメラを取得するのに四苦八苦してます。
これはSpaceNaviが対応しないはずだ・・・。
Softimageは基本の4画面をViews "View Maneger"と扱います。
いわゆる、A,B,C,Dですね。
それぞれ、いろいろな表記を持つんですが通常扱われる3Dの画面は、Viewとよばれ、
その名を ViewA, ViewB, ViewC, ViewDとなります。
カメラを取得するなら
GetValue("Views.ViewA.TopCamera")とかになるわけです。
そして、このAは、その中身を入れ替えることが出来ます。
たとえばレンダーツリーとか、テクスチャエディットとかです。
問題はここからなのですが、
'Object View'だとABCDのなかに("Views.View1.UserCamera")になるようです。英字でなくて数字ですね
どうやら、'Object View'を追加していくとこの末尾の数字が加算されていくだけのようです。
そして、フローティングパレットであろうがなかろうが関係ありません。
View1,View2・・・ と続いていきます。 そして、法則は、作った順番、欠番があれば(途中で閉じた)、
そこに生成されます。
そして、目的のビューのアクティブなView Numberが把握できません
GetValue("Views.View" + num + ".UserCamera")
この番号です。
どなたか、ビューからこの番号の取得の仕方が、あればお教えください orz
現在の、付け焼刃の回避策として、
Viewマネージャーにおける 'Object View' の数を数えてから、
フローティングパレットの数を数えてます。
順番どおりなら、フローティングが一番大きな数字になるはずです(汗
これはSpaceNaviが対応しないはずだ・・・。
Softimageは基本の4画面をViews "View Maneger"と扱います。
いわゆる、A,B,C,Dですね。
それぞれ、いろいろな表記を持つんですが通常扱われる3Dの画面は、Viewとよばれ、
その名を ViewA, ViewB, ViewC, ViewDとなります。
カメラを取得するなら
GetValue("Views.ViewA.TopCamera")とかになるわけです。
そして、このAは、その中身を入れ替えることが出来ます。
たとえばレンダーツリーとか、テクスチャエディットとかです。
問題はここからなのですが、
'Object View'だとABCDのなかに("Views.View1.UserCamera")になるようです。英字でなくて数字ですね
どうやら、'Object View'を追加していくとこの末尾の数字が加算されていくだけのようです。
そして、フローティングパレットであろうがなかろうが関係ありません。
View1,View2・・・ と続いていきます。 そして、法則は、作った順番、欠番があれば(途中で閉じた)、
そこに生成されます。
そして、目的のビューのアクティブなView Numberが把握できません
GetValue("Views.View" + num + ".UserCamera")
この番号です。
どなたか、ビューからこの番号の取得の仕方が、あればお教えください orz
現在の、付け焼刃の回避策として、
Viewマネージャーにおける 'Object View' の数を数えてから、
フローティングパレットの数を数えてます。
順番どおりなら、フローティングが一番大きな数字になるはずです(汗
#Python app = Application log = app.Logmessage log("-" * 100) 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) log(cam) getActiveCamera()
2011年6月3日金曜日
ProgressBar : Model Replace
オブジェクトを入れ替えるスクリプトで、その数が1000近くになると、
フリーズしてるのかわからなくなりました。
動いてるかどうかわからなくなるのは不安です。
そこで、現在の進行状況を出す、ProgressBar を導入。
いろいろなところで使えますねぇ。
JScript
フリーズしてるのかわからなくなりました。
動いてるかどうかわからなくなるのは不安です。
そこで、現在の進行状況を出す、ProgressBar を導入。
いろいろなところで使えますねぇ。
JScript
//ModelReplace v1.3 //20110602 親を一致 プログレスバーを設定 //20110509 名前を一致化 //20110205 _ 親子付けに対応 //20110111_作成 //使い方 //入れ替えたいオブジェクトを選択、実行。 //ピックセッションになるので、コピー元の"親"をPICK function main(){ if(Selection.count ==0){ return 0} var oRoot = ActiveSceneRoot; var oSel = Selection; //ピックセッション var oPick = PickObject("SelectObject"); if(oPick(0)== 0){ Logmessage("Cansel") return 0} var oPObj = oPick(2); var nColl = XSIFactory.CreateObject("XSI.Collection"); var oProgressBar = XSIUIToolkit.ProgressBar ; //プログレスバーの設置 oProgressBar.Maximum = oSel.Count ; oProgressBar.Step = 1; oProgressBar.Caption = "RePlace Now!"; oProgressBar.CancelEnabled = false ; oProgressBar.Visible = true; for(var i = 0; i < oSel.count; i++){ var oName = oSel(i).name var oParent = oSel(i).Parent3DObject; oSel(i).name = "tempname";//一時名前 var oTrans = oSel(i).kinematics.Global.Transform; var newObj = SIDuplicate( "B:" + oPObj); if(oParent.Name != newObj(0).Parent3DObject.Name){ ParentObj( oParent, newObj ) } newObj(0).name = oName; newObj(0).kinematics.Global.Transform =oTrans; nColl.Add(newObj(0)) //プログレスバーの数値加算 oProgressBar.Increment() } //元のオブジェクトを削除 DeleteObj(oSel); //新しいオブジェクトの選択 SelectObj(nColl); //プログレスバーのお片づけ oProgressBar.Visible = false ; } main();
2011年6月1日水曜日
Mari1.3
Mari1.3
出たらしいのでメモ
出たらしいのでメモ
- Ptex - Per-Face Texture Mapping
メンタレがサポートしてないのでとりあえずパス
- Displacement Preview *
たぶんOpenGL3.0が使えないと無理なのでパス
- Snapshots
いまいちうまく訳せない。一時的に保存しておくとかだろうか?
- Environment Mapping
環境マップをライティングとして使える。コレはよさそう
- Tiled textures
テクスチャと、マスクを組み合わせて、タイルテクスチャを作ることが出来る。
最終的なライティングを考慮して進めれるのかも。
とりあえず、最新のビデオカードが必要です(w
登録:
投稿 (Atom)