2013年11月30日土曜日

Unity Editor : カスタムウィンドウをマウス位置に表示(PRO)

UnityEditor上で、
マウスの位置にパレットを表示したい

Unity PROなら以下の作業で可能でした


手順

1.C:\Program Files (x86)\Unity\Editor\Data\Mono\lib\mono\2.0
のなかにある"System.Windows.Forms.dll"ファイルを
Assets/Pluginsの中に放り込む

2.以下のコードでマウスの位置を取得する

int x = System.Windows.Forms.Cursor.Position.X;
int y = System.Windows.Forms.Cursor.Position.Y;


おそらく、WindowsAPIを利用してますので、
Windows限定でないかと思います。
Macの方はわかりません

これと、ショートカットを組み合わせると、
マウスの位置にwindowを出現する事が可能になります。

PRO限定ですが orz


サンプル


using UnityEngine;
using UnityEditor;
using System.Collections.Generic;
using System.Collections;


public class ttCustomTools : EditorWindow
{

 [MenuItem("TERA Tools/ ttCustomTools %t")]
    public static void Open()
    {
        ttCustomTools window = EditorWindow.GetWindow();
  
  //Windows System
  int x = System.Windows.Forms.Cursor.Position.X;
  int y = System.Windows.Forms.Cursor.Position.Y;
  window.position = new Rect( x - 100, y - 20, 250, 50);
   
        window.Show();
    }
 

 
    void OnGUI()
    {
   
  //ボタンと他のスクリプトの起動
  if( GUILayout.Button ("Create SimplePlane") )
  {
   Debug.Log("CreateSimplePlane");
   CreateSimplePlane sp = new CreateSimplePlane();
   sp.Create();
   Debug.Log("CreateSimplePlane  Finish");
  }
  
  if( GUILayout.Button("Create Particle") ){
   Debug.Log ("Create Particle system");
   CreateShurikenParticle sp = new CreateShurikenParticle();
   sp.Create();
  }
    }


参考

how to enable System.Windows.Forms for drag and drop functionality with outside applications


■余談
開発の話か、開発ツールの開発の話かわかりにくいw

開発しにくいですw

2013年11月25日月曜日

Panorama : Nex-c3 + Madoka + TomShot360

巷ではリコーの全周囲撮影がはやってますが、
それを横目で見ながら、独自路線を orz

なるべく低コストかつ、
軽量のHDRパノラマです

TomShot360がついたので試写してみました

構成

・NEX-C3(型落ちのピンクw)
Madoka
TomShot360
・三脚

・PTGUI(合成ソフト)


2ショット


2ショット


画像の補正はしてません、
うーん、2ショットはちょっと厳しいかな~


3ショット


3ショット


いけてますね。まったく問題ないようです。
PTGUIまかせで、画質の補正などもしてみました。

7度の角度がついてますので、
足元も撮影しないと全周囲は無理なのですが、
CGライティング用途では、
地面は個別で作るので、そのままで :p


しかし、軽い!
機動性はバッチリですね
解像度も横サイズは 5696ありますし、
必要十分かもしれません。


おまけ

おまけ


MADOKAで撮影したものを,LightRoomで加工してみました。


空だけならNEX+Madokaで十分よ :p



■余談
Photoshop + Lightroom CCが
月額1,000だったので入った :p

2013年11月21日木曜日

Mari Tips : UV ミラー 超限定的

チラシの裏程度のTip


MARIでのUVミラーの仕方(限定的

1.DCCツールで鏡面のUVを +1しておく

2.Mariで作業。右半分をメインとする。

3.Mariで書き出し。Patchの 最初だけつかう :p ウマー


以上です :p


1.DCCツールで鏡面のUVを +1しておく

DCCなんてカッコいいことをいってますが

Softimageさんです:p

こんな感じのオブジェクト


いつも愛想無しでスミマセン


UVはこんな感じで 左のUVを U +1をしてあります

手作業ではめんどくさいのでスクリプト化してあります。
1.-xのポリを削除
2.+xのポリを鏡面化
3.-xのUVのUを+1
という簡単スクリプトです
ウエイトなどには対応しておりません


#QuickLocalSymmetry
app = Application; log = app.LogMessage

def isPolyXCenterThanZERO(in_Polygon,inPntPositionArray):
 oPoints = in_Polygon.Points
 xMin = xMax = inPntPositionArray[0][oPoints[0].Index]
 
 for i in oPoints:
  if xMin < inPntPositionArray[0][i.Index]:
   xMin = inPntPositionArray[0][i.Index]
  if xMax > inPntPositionArray[0][i.Index]:
   xMax = inPntPositionArray[0][i.Index]
 if ( xMax - xMin ) / 2 + xMin <= 0:
  return True
 return False
 
def getRessPolyIDs(oObj,in_LessThan):

 oGeo =  oObj.ActivePrimitive.Geometry
 oPoints =oGeo.Points
 oPositionArray = oPoints.PositionArray
 oPolys = oGeo.Polygons
 oSub = oPolys.SubComponent
 ressPolyIDs = []
 if in_LessThan:
  for i,oPoly in enumerate(oPolys):
   if isPolyXCenterThanZERO(oPoly,oPositionArray):
    ressPolyIDs.append(i)
 else :
  for i,oPoly in enumerate(oPolys):
   if not isPolyXCenterThanZERO(oPoly,oPositionArray):
    ressPolyIDs.append(i)
   
 
 #-X側のみ選択
 
 return ressPolyIDs
 
def moveUV(oSub,uS,vS,uT,vT):
 oObj = oSub.Parent3DObject
 oGeo = oObj.ActivePrimitive.Geometry
 oPolys = oSub.ComponentCollection
 oSampleIDs = []
 for oPoly in oPolys:
  for sample in oPoly.Samples:
   oSampleIDs.append(sample.Index)
 
 oSampleClusters = oGeo.Clusters.Filter("sample")
 for oCls in oSampleClusters:
  for oProp in oCls.Properties:
   if oProp.Type == "uvspace":
    aUV = oProp.Elements.Array
    aUV = [list( aUV[0] ) ,list(aUV[1]), list(aUV[2])]
    for sID in oSampleIDs:
     aUV[0][sID] = aUV[0][sID] * uS + uT
     aUV[1][sID] = aUV[1][sID] * vS + vT
    #log(str(aUV))
    
    oProp.Elements.Array = aUV
   #log(oProp.Type)
  #log(oCls)

def main():
 #選択オブジェクト
 oSels = app.Selection
 for oObj in oSels:
  #log(oObj.Type)
  if oObj.Type == "polymsh":
  
   #-X側のみ
   lessThan = True
   ressPolyIDs = getRessPolyIDs(oObj,lessThan)
   #log(len(ressPolyIDs))

   oGeo =  oObj.ActivePrimitive.Geometry
   oPolys = oGeo.Polygons
   oSub = oPolys.SubComponent
   if len(ressPolyIDs) > 0:
    
    oSub.ElementArray = ressPolyIDs
    #削除
    app.ApplyTopoOp("DeleteComponent", oSub, "siUnspecified", "siPersistentOperation", "")

   #シンメトリー
   #oPolys = oObj.ActivePrimitive.Geometry.Polygons
   op = app.ApplyTopoOp("SymmetrizePolygon", oObj, "siUnspecified", "siPersistentOperation", "")
   op(0).symmetryreference = 1
   op(0).weldtolerance = 0.001
       
     
   #-X側のUVを選択
   ressPolyIDs = getRessPolyIDs(oObj,lessThan)
   oGeo =  oObj.ActivePrimitive.Geometry
   oPolys = oGeo.Polygons
   oSub = oPolys.SubComponent
   oSub.ElementArray = ressPolyIDs
 
   #UVを移動
   uScale = 1
   vScale = 1
   uOffset = 1
   vOffset = 0
   
   moveUV(oSub,uScale,vScale, uOffset,vOffset)

main()


メニューにボタンを作って登録してます


2.Mariで作業。右半分をメインとする。

mariでの作業に入ります

右半分で作業して
左を捨てればいいだけです

MariのUV状態


このまま、作業できればすごいんですが、
経過状態を確認したいかと思います
そのときは Patchのコピーを使います




こんな感じで1001のUVを1002にコピーすれば左右対称になります :p


これもめんどくさいのでスクリプト化します
1.現在のチャンネル
2.すべてのレイヤー
Udim1001 > Udim1002 にコピペ

import mari
print("mirrorPaint")
ver = 0.01

baseUDIM = 0
targetUDIM = 1

def copyUdimToUdim(baseUDIM,targetUDIM,layer_list):

 copy = mari.actions.get('/Mari/Project/Project Explorer/Quick Copy')
 paste = mari.actions.get('/Mari/Project/Project Explorer/Quick Paste')


 for layer in layer_list:
  # un-select layers
  layer.makeCurrent()
  layer.setSelected(False)
  
  layer.makeCurrent()
  mari.geo.current().patch(baseUDIM).setSelected(True)
  copy.trigger()
  mari.geo.current().patch(baseUDIM).setSelected(False)
  mari.geo.current().patch(targetUDIM).setSelected(True)
  paste.trigger()
  mari.geo.current().patch(targetUDIM).setSelected(False)
  layer.setSelected(False)


def main():

    #startUp
 if mari.projects.current() is None:
  mari.utils.message("Please open a project before running.")
  return False
  
  geo = mari.geo.current()
  if geo is None:
   mari.utils.message("Please select an object to copy from.")
   return False
        
  chan = geo.currentChannel()
  if chan is None:
   mari.utils.message("Please select a channel to copy from.")
   return False
            
  if len(chan.layerList()) == 0:
   mari.utils.message("No layers to copy from!")
   return False


 layer_list = mari.geo.current().currentChannel().layerList()
 copyUdimToUdim(baseUDIM,targetUDIM,layer_list)
 
main()

ほとんど人が他人のコードです :p


メニュー登録などは組み入れてません :p


3.Mariで書き出し。Patchの 最初だけつかう :p ウマー

以上です :p


めんせき

このサイトで拾ったスクリプトなどで
起きたあらゆる事象の責をおいません。


メモ

Mariのコマンドの取得は
copy = mari.actions.get('/Mari/Project/Project Explorer/Quick Copy')

発動は
copy.trigger()

2013年11月19日火曜日

Mari Script : Selection Group

MariのSelectionGroup、
便利なんだけど、選択以外を、
ロック、アンロック、表示、非表示を
トグル出来ないかと調査・・・。

Selection Groupは取得出来ないらしい
(2013 / 11現在

Selection Groups - adding and removing objects.

orz

2013年11月15日金曜日

Tools : moma : Mari <> Modo or Maya


moma


なんてツールがあるらしい。

一瞬Foundryの新しいコネクト機能かと思った。

Mariなどの3DPaintToolの難点が、
最終レンダリングに持って行けない事。

これはいくらShaderをカスタマイズしても
最終結果とは異なる。


その垣根を一気に飛び越えた感じ Modoのレンダリング早い :p


まあ、プロダクションがModoや、
Mayaのそのままでレンダリングする事は無いだろうけど
とりあえず驚いた。


Modo も Mayaも持ってないけど、とりあえずベータ参加
Fondryが作るのも間もないかとは思うが・・・。


コードはほぼPython
解析すればSI用も作れない事は無い!?


ちなみにペイントツールと
レンダーがセットになってるのは
・CINEMA4D
・3DsMAX やね。

2013年11月5日火曜日

Blog : Unity : Oculus : プログラミング不要。Unityを使えば誰でも2時間で作れちゃう。OculusRiftでLiveを体感するLukalive!!

プログラミング不要。Unityを使えば誰でも2時間で作れちゃう。OculusRiftでLiveを体感するLukalive!!

だそうです。Oculus早く欲しいね :p


一方Unityでのエフェクト制作は難易度が高いっす。


■余談
まだまだ、製作中に不足物が出てくる状態。
Shurikenは使いづらいし、
EffectEditerとしては最低かも orz

いや、そもそもEffectEditerではないですよね orz



ばしばしアセットを購入して、
調べるのもありだけど、
現在のアセットWFXでも、
得る所が大きい

WFXの仕様を見てみると、
カスタムシェーダを使いUVScrollを実装していた。
このShaderが、ちょっと特殊でShurikenのパラメータを参照してる。

という事は、色の変異はShurikenで行う事が可能ということ。


ようはShurikenのUVScrollの拡張ですな。

とりあえず、改造程度でお茶を濁してるけど。
ちょっと、Shader周りも本気でとりかからないとヤバいかも


しかし、同じようにUVを移動する、
Texture Tile Anime のスクリプトサンプルは、
Shaderではなく、オブジェクトのUVを直接変更させる
スクリプトが多い。


いったいどっちなのだ( * _ *);;;

お絵描きツールの開発はいったん止めて、
コッチに全力でとりかかるるる orz