2011年6月21日火曜日

Tool:OverCoat

OverCoat?
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でソートしたい場合等に対応するには
関数で指定してやれば良い。

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を比較して、値を返す

Anatomy : TeamLabBody

TEAM LAB BODY
現時点では、最高峰の筋肉ーーーだと思う。

2011年6月13日月曜日

Camera : EXILIM EX-Z2300

マクロモードで撮影

常時携帯用として、CASIOのコンデジを購入してみました。

1万ちょい。安くなった物です。
テクスチャ 資料収集用としては十分かな。

しかし、撮影したあとに時間がかかる
内部で補正とかしてるんだろうな〜。

Tool : AutoDesk Homestyler - Free

AutoDesk Homestyler
AutoDeskさんの フリーの間取りツール。メモ

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

2011年6月9日木曜日

Mari : MouseGestures

マニュアルをぺらぺらめくってるとマウスジェスチャーなるものがあった。
バックススラッシュキー"\"押しながら、タブレットで普通に書けばいい。

あいまいでも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 /

以下を削除して再起動

無事、起動時にキャッシュフォルダを選択でき、
単一にすることが出来ました。

アブアブ


さらに

※すべて削除しなくとも

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セッションになるので、平面を作成


平面化しました。

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
#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)

'''

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' の数を数えてから、
フローティングパレットの数を数えてます。

順番どおりなら、フローティングが一番大きな数字になるはずです(汗

#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
//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
出たらしいのでメモ

  1. Ptex - Per-Face Texture Mapping
    メンタレがサポートしてないのでとりあえずパス
  2. Displacement Preview *
    たぶんOpenGL3.0が使えないと無理なのでパス
  3. Snapshots
    いまいちうまく訳せない。一時的に保存しておくとかだろうか?
  4. Environment Mapping
    環境マップをライティングとして使える。コレはよさそう
  5. Tiled textures
    テクスチャと、マスクを組み合わせて、タイルテクスチャを作ることが出来る。
大きな変更はないみたいね~。ただ、環境マップを使ったライティングは、
最終的なライティングを考慮して進めれるのかも。

とりあえず、最新のビデオカードが必要です(w