2013年6月1日土曜日

PhotoshopScript : SwitchLayers v01 レイヤーの表示切り替え

相変わらず忙しいので、いつもながらチラ裏です スミマセン
いつかまともなサイトを作りたい物です・・・


今回もPhotoshopのスクリプトです


Photoshopで画像の差分制作を行います

エロではありません。
いや、むしろエロでつかったら俺にください!!!


・・・というわけで、差分のレイヤー表示を簡単に
するべく作ったスクリプトです


説明


命名法則により、表示、非表示を
一括で切り替えるスクリプトです

■Unhide
名前がマッチした場合、表示する

■Hide Group
名前がマッチした場合、非表示にする
※表示に入っている場合は無視されます

■その他
・その他のレイヤーの表示は変更しません
・レイヤーセットの名前が適合した場合、
 それ以下のレイヤーの表示は変更しません


SwitchLayers


//SwitchLayers
// 05 28 2013

//Global
var LEFT = 20
var TOP  = 20
var BUTTON_W = 100
var OFFSET_W = 125
var BUTTON_H = 25
var OFFSET_H = 40

//初期に設定されるグループネーム
var textChkGroupName = "p1,p2,p3,p4,p5,p6,p7,p8,p9";
var gUnHideObjectName = "homhom"
var gHideObjectNameGroup = ["hamham"]


//レイヤーに対するアクションA
function layerActionA( in_Layer ){
    //alert( "ActionA Match " + in_Layer.name )
    in_Layer.visible = true
    }


//レイヤーに対するアクションB
function layerActionB( in_Layer ){
    //alert( "ActionB GMatch " + in_Layer.name )    
    in_Layer.visible = false
    }


//名前検索(グループ)
function chkNameGroup( trget_Name )
{
    for ( var i = 0; i < gHideObjectNameGroup.length; i++)
    {
        if (trget_Name.match( gHideObjectNameGroup[i] ) ){
            return true
            }
        }
    return false
    }


//名前検索
function chkName( trget_Name ){
    //alert(gUnHideObjectName)
    if ( trget_Name.match( gUnHideObjectName ) ){
        return true
        }
    return false
    }


//再帰関数
function getAllLayer(parent){
    //alert(gUnHideObjectName)
 var ChildLayers= parent.layers;
 for (var i = 0; i < ChildLayers.length; i++){
  if (ChildLayers[i].typename == "LayerSet"){
   //レイヤーセットの場合の処理            
             //alert("LayerSet Name = " + ChildLayers[i].name)
             if( chkName( ChildLayers[i].name ) ){
                layerActionA( ChildLayers[i] )
                continue;
                }
                else{
                    //該当する名前がグループのみにあった場合
                    if ( chkNameGroup( ChildLayers[i].name) ){
                        layerActionB( ChildLayers[i] )
                        continue;
                        }
                    }
   //再帰処理
   getAllLayer(ChildLayers[i]);
  }else{
            //通常のレイヤーの場合の処理
           // alert("Layer    Name = " + ChildLayers[i].name)
            if( chkName( ChildLayers[i].name ) ){
                layerActionA( ChildLayers[i] )
                }else{
                    //該当する名前がグループのみにあった場合
                    if ( chkNameGroup( ChildLayers[i].name) ){
                        layerActionB( ChildLayers[i] )
                        }
                }
            }
 }
}


function switchLayers(uDlg){
    //alert("changeViewVis")
    
    //ダイアログからグローバル変数の設定
    gUnHideObjectName = uDlg.unhideName.text
    gHideObjectNameGroup =  uDlg.hideGroupName.text.split(",")
    
    //alert(gUnHideObjectName)
    //for ( var i = 0; i < gHideObjectNameGroup.length;i++)
    //    alert(gHideObjectNameGroup[i])
    
    
    //実作業
    var parent = activeDocument;//作業するドキュメントの参照
    getAllLayer(parent);
    
    
    refresh();
    }



function main(){
 
    app.bringToFront();
    //ドキュメントが開かれているかどうか判別
    if (app.documents.length ==0){
        alert("No Docment")
        return;
        //ドキュメントが開かれていない場合処理なし
    }
    var uDlg = new Window('dialog','switchLayers');
    uDlg.bounds = [200,300,580,420];   
    //uDlg.opacity = .9;

    
    uDlg.sText = uDlg.add("statictext",      [ 20, 10, 140, 10 + BUTTON_H], "UnHide (Unique)");
    uDlg.unhideName = uDlg.add("edittext",   [150, 10, 250, 10 + BUTTON_H], "p1");
    
    uDlg.sText = uDlg.add("statictext",      [ 20, 40, 140, 40 + BUTTON_H], "HideGroup(split(','))");
    uDlg.hideGroupName = uDlg.add("edittext",[150, 40, 360, 40 + BUTTON_H], textChkGroupName);
    
    uDlg.btnCancel = uDlg.add("button",      [150, 70, 250, 70 + BUTTON_H], "Close");
    uDlg.btn00 = uDlg.add("button",          [270, 70, 360, 70 + BUTTON_H], "Apply");

    uDlg.btnCancel.onClick = function () {
        //alert("キャンセルされました。");
        uDlg.close();
    }


    //ボタンを押されたときの設定
    uDlg.btn00.onClick = function ()
    {
        //switchLayers(uDlg);
        activeDocument.suspendHistory('switchLayers', 'switchLayers(uDlg)'); //margin(gap);
    }

    uDlg.show()
    
    //alert("finish")
    }

main()


展望


現在、表示レイヤーをtga保存する
ところまでいけました
次は一括出力です。
この手の作業はなるべく自動化しておきたい物ですヨ

2013年5月27日月曜日

PhotoshopScript : 現在のレイヤーをラスタライズする

最近Photoshopの使用率がうなぎのぼりです。

Photoshopのスクリプトは作りにくくてしょうがないので
あまり手を出していなかったんですが。

もうどうにも、めんどくさいので手をだして見ました。

PhotoshopCS6にはレイヤーをラスタライズなんて
機能があるんですが、うちのcs5さんにはありません。
でも、レイヤースタイルがんがん使うよね・・・

というわけで、作ってみた


なんかまだ上手く動かない場合がある・・・。

Rasterization


//現在のレイヤーをラスタライズする
//
// 05 23 2013


function CreateNewLayer( in_Name ){
    newLay = activeDocument.artLayers.add()
    newLay.name = in_Name
    return newLay
    }


function Rasterization(){
    
    //現在のレイヤーを取得
    var Lays = activeDocument.artLayers
    var ActiveLayer = activeDocument.activeLayer

    var tempName = ActiveLayer.name
    ActiveLayer.name = "homhom"
    
    //新しいレイヤーを作成
    newLayer = CreateNewLayer( tempName )
    
    //新しいレイヤーをアクティブレイヤーの下に移動
    newLayer.move(ActiveLayer,ElementPlacement.PLACEAFTER)
    
    //二つのレイヤーをマージ
   activeDocument.activeLayer = ActiveLayer
   activeDocument.activeLayer.merge()

}


function main(){
   Rasterization()
}

main()


参考サイト


ねこまたや

雪待夜

Adobe サイト
LayerIDの取得(あまり役に立たなかったけど)


その他 機能拡張

カスタムパネルの作成
  Adobe Configurator 3.1.1

そらかぜ工場

うたげ カラーピッカー
  Photosopでカラーサークルが使えるプラグイン

2013年5月20日月曜日

Game : Guilty Gear Xrd -SIGN-



Unrealであまりにも理想的な影を出していたのでチェック
いったいどういった調整だろう。

2013年5月16日木曜日

LevelDesign : Modular Level Design for Skyrim



スカイリムのレベルデザイン

スカイリム面白かったです


参考になります! やっぱりパズルよね〜。
でも、自動生成装置を作って利用してると思うのよね

2013年5月15日水曜日

nDo2 : dDo : Tutorial

下書きのまま放置してた


nDo2を購入したが使い方が解らん
マニュアル無いの???

と言う訳でTutorialを調査

nDo2



nDo2 workflow (+udk) UDK



写真からの作成
Texture Creation using nDo2



dDo



本家の基本チュートリアル

dDo - Feature Overview



2時間超え・・・。 Complete dDo Breakdown

dDoチュートリアル

dDo : dDo 5.0

去年の年末のクリスマスセールで、
ToolBagとdDoを購入したのですが、
このたびめでたく、ご結婚なされました(ぉ

ということを3D人さんで知りました・・・Oh
Marmoset Skyshop – Quixel’s dDo 5.0と統合!
Unity3Dを採用したリアルタイムイメージベースドラインティングツール!Unity向けシェーダーもリリース予定!


ちょっと意外でしたが、
dDoのビューアーに Marmoset の SkyShop(未発売) を導入というのが正しいみたい


フローとしては、チェーンソウの詳しい
チュートリアルがございました
2時間でございます orz




とりあえずdDo4.5(購入時)を立ち上げたら、
アップデートで5.0になりました。
費用はかからなかったみたい ホッ

で、MAYAでやっていたように
dDoのマテリアルのプリセットfbxを
SI2014で読み込んでみました・・・。
かなり寂しいビューだったので
Hight Quarty Viewに!

パラメータを変えるたびに
コンパイルし待たされる・・・

Hight Quarty View
まだまだ仕事では使えないですね orz


正直、SIのVIewは使えないので、
AutoDeskさんが開発されているFBXViewer待ちですね。


せめてきれいなViewなMAXに持って行こうと思ったけど
SIから転送は出来ませんでした。
MAXさんからの一方通行なのね(Maxのシーンをアップデートはできる) orz

気を取り直して、MAXから送ろうかと思ったけど
今度はエラーで転送できなかった orz

何か設定が悪いのかな。

というわけで、検証までいたりませんでした
こんどこれを試してみます > リンク



チュートリアル2時間は長いよ orz
いや、詳しくてうれしいれす ;p


後日
再起動したら、無事にMAX > SIで来ました。
ただ、ショートカットはMAXになるし、MAXに持っていけるのはICEだけという
本当にSIをプラグインとして利用してました

AutoDeskさん、マジSIをプラグインとして扱ってマス orz
いいソフトなんだけど、値段と、この扱いで人に薦められません・・・ヨ

ユーザー減る一方なんだろうなぁ orz

2013年5月14日火曜日

Softimage Script : ZSortNumbering v0.1

ども、まだまだ修羅場中のTERAです。
あいかわらず、チラ裏スクリプトです
(整理とか、エラー処理とかしてません)


今回の背景はアルファオブジェクト(半透明)
を多用しています

ZSortの場合アルファオブジェクトは
描画順を指定してやらねばなりません、
※最近のIntelAPUでは、力づくで解決してるみたいだけど


まだまだ世の中はオールドテク万歳です。


で、奥から描画するとして、
命名規則で指定する事になりました

・・・数が・・・。
大量にアルファオブジェクトがあると、
めんどくさいのでスクリプト化します


ZSortNumbering


オブジェクト(複数)を選択して実行すると
奥から順に番号を降ってくれます

axxx_ObjectName
最後のナンバリングは消してます


現状PPG無し、カメラの指定は決めうち、など
Toolとして、体をなしてなく、
条件がたくさんですが
とりあえず乗っけておきます。


こういった事案が多数 or 要望があればTool化するかもしれません。


※拡張性として、以下のスイッチがあります
カメラ平面からの距離 <> カメラからの距離
オブジェクトのセンター <> オブジェクトのBBOXセンター
です。
あと、番号の始まりと、頭につける文字の変更とか。

#ZSortNumbering
#
# 選択したオブジェクトをZSort順に命名変更します
# a000_ObjectName
#
# v0.1 0510 2013 とりあえず動いた
#

from win32com.client import constants as c
app = Application; log = app.LogMessage
import re
p = re.compile("[0-9]")

#GlobalValue
PREFIX = "a"
STRRTINGNUMBER = 0
tempCAM ="Camera"
ZDEPTH = True #ZDEPTH or Distance
OBJECTCENTER = False # Switch BBOX

def vLog(v):
 log(str( v.X ) + " , " + str(v.Y) + " , " + str(v.Z) )


def aPosLog(aPos):
 for v in aPos:
  log(str( v.X ) + " , " + str(v.Y) + " , " + str(v.Z) )

#
# bNumDelete
#
def bNumDelete(in_str):
 oName = in_str
 for i in range( len( oName ) ):
  if p.match(oName[-1:]) != None:
   oName = oName[:-1]
  elif oName == "_":
   oName = oName[:-1]
  else:
   break
 return oName

#
# getNumbering
#
def getNumbering(in_digi,in_Start,in_Count):
 num = in_Count + in_Start
 num = str(num).rjust(in_digi,"0")
 return num


#
# getSelectMeshs
#
def getSelectMeshs():

 #-製作中-現在は選択したメッシュのみ
 col = XSIFactory.CreateObject("xsi.collection")
 oMeshs = XSIFactory.CreateObject("xsi.collection")
 col.Unique = True
 oMeshs.Unique = True
 
 oSels = app.Selection
 for oSel in oSels:
  if oSel.Type == "polymsh":
   oMeshs.Add(oSel)
   
 return oMeshs


#
# getCamera
#
def getCamera():
 #カメラ取得は仮
 oCam = app.Dictionary.GetObject(tempCAM)
 
 return oCam


#
# getObjectBBOXPositionArray
# 
def getObjectBBOXPositionArray(inObjects):
 aPos = []
 for oObj in inObjects:
  pos = XSIMath.CreateVector3()
  oTrans = oObj.Kinematics.Global.Transform
  oA = oObj.GetBoundingBox( oTrans );
  pos.Set( (oA[3] - oA[0]) *.5 + oA[0],
     (oA[4] - oA[1]) *.5 + oA[1],
     (oA[5] - oA[2]) *.5 + oA[2] )
  aPos.append(pos)
 return aPos


#
# getObjectPositionArray
#
def getObjectPositionArray(inObjects):
 aPos = []
 for oObj in inObjects:
  pos = XSIMath.CreateVector3()
  oTrans = oObj.Kinematics.Global.Transform
  oTrans.GetTranslation(pos)
  aPos.append(pos)
 return aPos


#
# getMeshZNumber
#
def getMeshZNumber(oCam, oMeshs):
 log("-----getMehsNumber-----")
 aDis = []
 aNum = []
 
 #ObjectPositionArray
 if OBJECTCENTER:
  aPos = getObjectPositionArray( oMeshs )
  
 else:
  aPos = getObjectBBOXPositionArray( oMeshs ) 
 
 #aPosLog(aPos) 
 
 #ZDepth or Distance
 camPos = XSIMath.CreateVector3()
 camAxis = XSIMath.CreateVector3()
 camRot = XSIMath.CreateRotation()
 m3 = XSIMath.CreateMatrix3()
 oCamTrans = oCam.Kinematics.Global.Transform
 oCamTrans.GetTranslation(camPos)
 oCamTrans.GetRotation(camRot)
 camRot.GetMatrix3(m3)
 aM3 = m3.Get2()
 camAxis.Set(aM3[6],aM3[7],aM3[8])
 
 log("")
 log("---camPos---")
 vLog(camPos)
 
 log("")
 log("---camAxis---") 
 vLog(camAxis)
 
 if(ZDEPTH):#ZDepthの場合
  log("-----ZDepth-----")
  d = camPos.Dot(camAxis) #PolyPlane = p・n - d
  #log(d)
  for oPos in aPos:
   dis = ( oPos.Dot(camAxis) - d ) * -1
   aDis.append(dis)
   log(dis)
 else:
  v = XSIMath.CreateVector3()
  for oPos in aPos:
   v.Sub(camPos,oPos)
   dis = v.Length()
   aDis.append(dis)
   log(dis)
 
 aTemp = []
 for i,d in enumerate(aDis):
  bTemp = [d,i]
  aTemp.append(bTemp)
  
 aTemp.sort()
 aTemp.reverse()
 
 log(str(aTemp))
 for i in aTemp:
  aNum.append(i[1])
   
 return aNum

#
# main
#
def main():
 log("-----ASortNumbering")
 
 #GetMeshObject
 oMeshs = getSelectMeshs()
 if oMeshs.Count == 0:
  log("Pls Select Meshs")
  return
  
 #Camera
 oCam = getCamera()
 
 #GetNumber From Depth
 aNum = getMeshZNumber(oCam,oMeshs)
 log(str(aNum))
 
 #Renema
 for i,num in enumerate(aNum):
  oObj = oMeshs(num)
  no = getNumbering(3,STRRTINGNUMBER,i)
  oName = PREFIX + str(no) + "_" + oObj.Name
  oObj.Name = bNumDelete(oName)
main()