2016年9月11日日曜日

Houdiniプロシージャルモデリングテクニカルセミナー 2016/8/27

ゲーム関係

●FX
Texture sheetをつかって出す

●煙からMeshを作って、Normalを出す

●Joint animation、Texture based animation
・TextureにTranslate等の情報をBakeする
・Translate(R,G,B)→Texture(R,G,B)

●列がFrame、行がValue

Substance Designer + Houdini

●Houdini用Substanceプラグイン

●Houdini上でパラメーターを調整できる

●Custom Attributeでパラメーター欄を作れる

●Houdini上でパラメーターをいじると、Textureが再生成される

●Unityにデジタルアセットとして読み込み可能

?Hight map、Roughness map
・http://docs.unity3d.com/jp/current/Manual/StandardShaderMaterialParameterHeightMap.html
・http://www.cgradproject.com/archives/3153


トランジスタスタジオ

●Resumple Node

●Normal Node

●UP vectorとNrmalがあると配置しやすい

●ループ、再帰で木や雷を作る


菊池さん

●Outputを2つにする

●HDA
Houdini Digital Asset

●原点にPoint、発生源にPointを作って、雷を走らせる

●HDAを作る時は、Scalableに作ることが大事
・Scalable→Sourceが複数あっても成り立つ


座談会

●Houdiniに限らず、どんなソフトでもUnit scaleは変えない!

●Houdiniはデータ量に気をつけた方がいい

Nuekセミナーまとめ 2016/8/6

キーイング

・参考
http://cgworld.jp/regular/nuke010.html

●IBK
・Image based keying
http://help.thefoundry.co.uk/nuke/8.0/content/getting_started/tutorial3/image_based_keying.html

・https://compositingmentor.com/2014/07/19/advanced-keying-breakdown-alpha-1-4-ibk-stacked-technique/

●Conpositiong Mentor
https://compositingmentor.com/2014/07/19/advanced-keying-breakdown-alpha-1-4-ibk-stacked-technique/

●A、Bの2点で値を評価するツール
自作らしい。
どういうものだったか忘れてしまった・・・

●dispill、kyelightを使う

●light wrapをとる
髪の毛用、エッジ部分の調整

●logkeyer

●Roto animationをつける時は、copyでoriginalを引っ張ってくる
軽くていいらしい


インテグレーション(なじませ)

●Base compを作っておくといいみたい

●Light wrap、Edge、色収差など

●マイナス値があるとCompしにくい

●Grainがある状態でBlackをとらないと合わない

●Expression NodeでR、G、B合わせたアルファを作る

●Normal passとRelight Nodeを使って、アルファをとる


SQEX Kings graveメイキング

●BBC
色域 D65

●AOV
Arbitrary Output Variables
レンダーパスのこと

http://takumikim.blogspot.jp/2014/01/blog-post.html


座談会

●簡易的なHDR
・Theta s
http://www.ricoh-imaging.co.jp/japan/products/theta_s/

●チェックは「RV」か「Hiero」

●露出アンダーにしても、画がなりたつかチェック

2016年3月22日火曜日

フレーム移動スクリプト

アニメーション作業中にフレームの計算が面倒なので、スクリプト化しました。



●add frame
入力した数字分だけ、フレームがプラス方向に移動します。

●minus frame
入力した数字分だけ、フレームがマイナス方向に移動します。

●start frame
中間フレームを求めるための、始めのフレームをセットします。

●end frame
中間フレームを求めるための、終わりのフレームをセットします。

●intermidiate frame
start frame、end frameで入力されたフレームの中間フレームに移動します。
フレーム間が奇数だった場合は、小数点切り捨ての値になります。
例)start frame「10f」、end frame「19f」の場合、「14f」に移動します。


●スクリプト(Python)
################################################################
#
#    [name]Set various frame
#    [function]add frame, minus frame, culculate intermidiate frame
#    [note]if result value is odd, result value round down.
#
#    [author]Kyohei Ueno(heikyonoeu.blogspot.jp)
#
################################################################

import maya.cmds as mc

###set current frame in start frame###
def setStaFCurFrame():
    curF = mc.currentTime(q=1)
    mc.textFieldButtonGrp('staF_fld',edit=1,tx=curF)

###set current frame in end frame###
def setEndFCurFrame():
    curF = mc.currentTime(q=1)
    mc.textFieldButtonGrp('endF_fld',edit=1,tx=curF)

###set intermidiate frame###
def setIntermidiateFrame():
    staF = float(mc.textFieldButtonGrp('staF_fld',q=1,tx=1))
    endF = float(mc.textFieldButtonGrp('endF_fld',q=1,tx=1))
    intmF = int((endF - staF) / 2)
    intmF_result = int(staF + intmF)
    mc.textFieldButtonGrp('intm_fld',edit=1,tx=intmF_result)
    mc.currentTime(intmF_result)

###add frame###
def addFrame():
    a = float(mc.currentTime(q=1))
    b = float(mc.textFieldButtonGrp('addFrame',q=1,tx=1))
    c = a + b
    mc.currentTime(c)

###minus frame###
def minusFrame():
    a = float(mc.currentTime(q=1))
    b = float(mc.textFieldButtonGrp('minusFrame',q=1,tx=1))
    c = a - b
    mc.currentTime(c)

###window###
if mc.window('setVariousFrame',ex=1):
    mc.deleteUI('setVariousFrame')
 
mc.window('setVariousFrame',t='Set various frame',s=0)
mc.columnLayout()
mc.rowLayout(nc=2)
mc.textFieldButtonGrp('addFrame',l='add frame',bl='set',tx=0,cw3=(60,50,30),bc=addFrame)
mc.textFieldButtonGrp('minusFrame',l='minus frame',bl='set',tx=0,cw3=(60,50,30),bc=minusFrame)

mc.setParent('..')
mc.rowLayout(nc=3)
mc.textFieldButtonGrp('staF_fld',l='start frame',bl='set',cw3=(60,50,30),bc=setStaFCurFrame)
mc.textFieldButtonGrp('endF_fld',l='end frame',bl='set',cw3=(60,50,30),bc=setEndFCurFrame)
mc.textFieldButtonGrp('intm_fld',l='intermidiate frame',bl='set',cw3=(95,50,30),bgc=(1,0.443,0),bc=setIntermidiateFrame)

mc.showWindow()

2016年2月21日日曜日

フレーム毎に、選択したオブジェクトや頂点の場所へスフィアを配置するスクリプト

選択したオブジェクトや頂点の場所に、任意のフレーム分スフィアを配置します。
アニメーション作業で、フレーム間の動き幅や、動きがカーブを描いているのか、等の確認ように使いたいと思い作りました。
劣化版「Motion Trail」みたいなやつです。
選択したオブジェクトや頂点の位置情報をフレーム毎に取得しているので、キーが打たれていないものでもスフィアを配置できます。

[修正]2016/02/28 ver1.02
    2016/03/06 ver1.03
    2016/03/09 ver1.04

[注意]
※現状、シーン内に1つしか作ることができません。(グループ名とシェーダー名を固有で記述しているため)
※オブジェクトや頂点を複数選択している場合、動作しません。
※フレームは、小数点に対応していません。
※スフィアを作る時に、位置情報を取得するためにフレームが動きます。なのでシーンが重い場合、動作が遅くなります。
※ご使用の際は自己責任でお願いします。






●registration object

スフィアを配置したいオブジェクトや頂点を選択して、selectボタンを押してください。

●start frame
開始フレーム

●end frame
終了フレーム

●sphere scale
スフィアの大きさを変えます

●R、G、B
スフィアの色を変えます

●Transparency
スフィアの不透明度を変えます

●Ref
チェックを入れると、スフィアをオーバーライドしてReferenceにします

●Create
選択したオブジェクトや頂点の場所に「start frame」「end frame」で入力したフレーム分、スフィアを配置します。
既にスフィアがある状態で押すと、既存のスフィアを消して新しいスフィアを作ります。

●Delete
「Create」で作ったスフィアとグループ、マテリアルを消します


●スクリプト(python)
######################################################################
#    [内容]フレーム毎に選択したオブジェクトや頂点の場所にスフィアを置くスクリプト
#    複数選択には未対応
#    ver.1.04
#
#    Auther:Kyohei Ueno(heikyonoeu.blogspot.jp)
######################################################################

import maya.cmds as mc

###selectボタンを押したときに実行されるスクリプト###
def registrationObject():  
    #もし、何も選択されていなかったら、エラーメッセージを出す
    if not mc.ls(sl=1,fl=1):
        if mc.window('ErrorARONon',ex=1):
            mc.deleteUI('ErrorARONon')
         
        mc.window('ErrorARONon',title='Error',s=0)
        mc.columnLayout()
        mc.text(l='Nothing selected objects',w=200,h=50)
        mc.showWindow()
       
    #もし、現在選択されているオブジェクトが2つ以上なら、エラーメッセージを出す
    elif len(mc.ls(sl=1,fl=1)) >= 2:
        if mc.window('ErrorAROTwo',ex=1):
            mc.deleteUI('ErrorAROTwo')
         
        mc.window('ErrorAROTwo',title='Error',s=0)
        mc.columnLayout()
        mc.text(l='Too many selected objects',w=200,h=50)
        mc.showWindow()
       
    #スフィアを配置したいオブジェクトを登録
    else:
        regSel = mc.ls(sl=1)[0]
        mc.textFieldButtonGrp('regObject',edit=1,tx=regSel)

###Createボタンを押したときに実行されるスクリプト###
def createAnimRefObj(arg):
    global staF,endF,sphSiz,curSel,animRefCol_R_val,animRefCol_G_val,animRefCol_B_val,animRefTrp_val
       
    if mc.textFieldButtonGrp('regObject',q=1,tx=1) == '':
        if mc.window('ErrorARONon',ex=1):
            mc.deleteUI('ErrorARONon')
         
        mc.window('ErrorARONon',title='Error',s=0)
        mc.columnLayout()
        mc.text(l='Nothing selected objects',w=200,h=50)
        mc.showWindow()
   
    else:
        #もしsnimRef_gpがあったら、animRef_gp,animRef_lambert,animRef_lambertSGを消す
        if mc.objExists('animRef_gp'):
            mc.delete('animRef_gp')
            mc.delete('animRef_lambert')
            mc.delete('animRef_lambertSG')

        #現在選択されているオブジェクトを登録
        if mc.ls(sl=1):
            curSel = mc.ls(sl=1)[0]
       
        #Createボタンを押したフレームをcurFに入れる
        curF = mc.currentTime(q=1)
     
        #start frame,end frameに何も入力されていなかったら、エラーメッセージを出す
        try:
            staF = int(mc.textFieldGrp('startFrameRefField',q=1,text=1))
            endF = int(mc.textFieldGrp('endFrameRefField',q=1,text=1))
        except:
            if mc.window('ErrorAROFloat',ex=1):
                mc.deleteUI('ErrorAROFloat')

            mc.window('ErrorAROFloat',title='Error',s=0)
            mc.columnLayout()
            mc.text(l='Please frame number integer',w=200,h=50)
            mc.showWindow()
         
        allF = range(staF,endF+1)
     
        #スフィアのサイズ、R、G、B、不透明度をとってくる
        sphSiz = mc.floatSliderGrp('sphereSizeRefField',q=1,v=1)
        animRefCol_R_val = mc.floatSliderGrp('animRefCol_R_Field',q=1,v=1)
        animRefCol_G_val = mc.floatSliderGrp('animRefCol_G_Field',q=1,v=1)
        animRefCol_B_val = mc.floatSliderGrp('animRefCol_B_Field',q=1,v=1)
        animRefTrp_val = mc.floatSliderGrp('animRefTrp_Field',q=1,v=1)

        #registraion object欄のオブジェクトを登録
        regObj = mc.textFieldButtonGrp('regObject',q=1,tx=1)

        #animRef_gpという名のグループを作る
        mc.group(em=1,name='animRef_gp')
 
        #登録したオブジェクトの場所に、指定したフレーム分スフィアを作る
        for i in allF:
            mc.currentTime(i)
            curTra = mc.xform(regObj,q=1,ws=1,t=1)
            mc.polySphere(n='distance_sphere',sx=8,sy=8,r=1.0)
            mc.xform(ws=1,t=curTra,s=(sphSiz,sphSiz,sphSiz))
            aniRefSphere = mc.ls(sl=1)[0]
            mc.parent(aniRefSphere,'animRef_gp',r=1)

        #AnimRefObj用のlambertシェーダーを作って、animrRef_gpにアサインする
        animRef = mc.shadingNode('lambert',asShader=1,n='animRef_lambert')
        mc.hyperShade(animRef,a=1)
        mc.setAttr('animRef_lambert.colorR',animRefCol_R_val)
        mc.setAttr('animRef_lambert.colorG',animRefCol_G_val)
        mc.setAttr('animRef_lambert.colorB',animRefCol_B_val)
        mc.setAttr('animRef_lambert.transparency',animRefTrp_val,animRefTrp_val,animRefTrp_val)

        mc.select('animRef_gp')
        mc.hyperShade(assign = animRef)
     
        #Createボタンを押したフレームに戻る
        mc.currentTime(curF)
        #Createボタンを押した時に選択していたオブジェクトを選択
        mc.select(curSel)

###Deletボタンを押したときに実行されるスクリプト###
def deleteAnimRefObj(arg):
    if not mc.objExists('animRef_gp'):
        if mc.window('ErrorARODel',ex=1):
            mc.deleteUI('ErrorARODel')
        mc.window('ErrorARODel',title='Error',s=0)
        mc.columnLayout()
        mc.text(l='Nothing AnimRefObj objects',w=200,h=50)
        mc.showWindow()
     
    else:
        mc.delete('animRef_gp')
        mc.delete('animRef_lambert')
        mc.delete('animRef_lambertSG')
        mc.checkBox('animRef_RefCB',edit=1,v=0)

###start frame欄の値にファイルの最初のフレームを入れる###
def startFrameRef(arg):
    global staF
    staF = float(mc.textFieldGrp('startFrameRefField',q=1,text=1))

###end frame欄の値にファイルの最後のフレームを入れる###
def endFrameRef(arg):
    global endF
    endF = float(mc.textFieldGrp('endFrameRefField',q=1,text=1))
 
###sphere scale欄に入力されている値でスフィアをスケールする###
def sphereSizeRef(arg):
    global sphSiz
   
    if mc.ls(sl=1):
        curSel = mc.ls(sl=1)[0]
 
    sphSiz = float(mc.floatSliderGrp('sphereSizeRefField',q=1,v=1))
 
    if mc.objExists('animRef_gp'):
        mc.select('animRef_gp',hi=1)
        mc.select('animRef_gp',d=1)

        animeRefGpHi = mc.ls(sl=1)
        for i in animeRefGpHi:
            if mc.objectType(i) == 'transform':
                mc.xform(i,ws=1,s=(sphSiz,sphSiz,sphSiz))

    try:
        mc.select(curSel)
    except:
        mc.select(cl=1)

###スフィアのR値を変更する###
def animRefCol_R(arg):
    global animRefCol_R_val
    animRefCol_R_val = float(mc.floatSliderGrp('animRefCol_R_Field',q=1,v=1))

    if mc.objExists('animRef_gp'):
        mc.setAttr('animRef_lambert.colorR',animRefCol_R_val)
 
###スフィアのG値を変更する###
def animRefCol_G(arg):
    global animRefCol_G_val
    animRefCol_G_val = float(mc.floatSliderGrp('animRefCol_G_Field',q=1,v=1))

    if mc.objExists('animRef_gp'):
        mc.setAttr('animRef_lambert.colorG',animRefCol_G_val)

###スフィアのB値を変更する###
def animRefCol_B(arg):
    global animRefCol_B_val
    animRefCol_B_val = float(mc.floatSliderGrp('animRefCol_B_Field',q=1,v=1))
 
    if mc.objExists('animRef_gp'):
        mc.setAttr('animRef_lambert.colorB',animRefCol_B_val)
     
###スフィアの不透明度を変更する###
def animRefTrp(arg):
    global animRefTrp_val
    animRefTrp_val = float(mc.floatSliderGrp('animRefTrp_Field',q=1,v=1))
 
    if mc.objExists('animRef_gp'):
        mc.setAttr('animRef_lambert.transparency',animRefTrp_val,animRefTrp_val,animRefTrp_val)
     
###スフィアをオーバーライドでリファレンスにする###
def animRef_RefOn(arg):
    if mc.objExists('animRef_gp'):
        mc.setAttr('animRef_gp.overrideEnabled',1)
        mc.setAttr('animRef_gp.overrideDisplayType',2)
     
###スフィアのオーバーライドのリファレンスをとく###
def animRef_RefOff(arg):
    if mc.objExists('animRef_gp'):
        mc.setAttr('animRef_gp.overrideEnabled',0)
        mc.setAttr('animRef_gp.overrideDisplayType',0)

#window
if mc.window('animRefObj', ex=1):
    mc.deleteUI('animRefObj')
 
sceStaF = int(mc.playbackOptions(q=1,min=1))
sceEndF = int(mc.playbackOptions(q=1,max=1))
defSphSca = 1.0

mc.window('animRefObj',title='animRefObj',s=0)
mc.columnLayout()
mc.text(l='AnimRefObj Script')
mc.textFieldButtonGrp('regObject',l='registration object',bl='select',ed=0,cw3=(90,150,50),bc=registrationObject)
mc.textFieldGrp('startFrameRefField',l='start frame',tx=sceStaF,cw2=[90,60],cc=startFrameRef)
mc.textFieldGrp('endFrameRefField',l='end frame',tx=sceEndF,cw2=[90,60],cc=endFrameRef)
mc.floatSliderGrp('sphereSizeRefField',l='sphere scale',v=defSphSca,f=1,pre=3,cw3=(90,50,140),min=0.0,max=5.0,cc=sphereSizeRef)
mc.floatSliderGrp('animRefCol_R_Field',l='R',v=1.0,f=1,cw3=(90,50,100),min=0.0,max=1.0,cc=animRefCol_R)
mc.floatSliderGrp('animRefCol_G_Field',l='G',v=0,f=1,cw3=(90,50,100),min=0.0,max=1.0,cc=animRefCol_G)
mc.floatSliderGrp('animRefCol_B_Field',l='B',v=0,f=1,cw3=(90,50,100),min=0.0,max=1.0,cc=animRefCol_B)
mc.setParent('..')
mc.rowLayout(nc=2)
mc.floatSliderGrp('animRefTrp_Field',l='Transparency',v=0,f=1,cw3=(90,50,50),min=0.0,max=1.0,cc=animRefTrp)
mc.checkBox('animRef_RefCB',l='Ref',onc=animRef_RefOn,ofc=animRef_RefOff,v=0)
mc.setParent('..')
mc.rowLayout(nc=2)
mc.button(l='Create',c=createAnimRefObj,w=110,bgc=(1,0.443,0))
mc.button(l='Delete',c=deleteAnimRefObj,w=110,bgc=(0.8,0.8,0.8))
mc.showWindow()

2016年1月24日日曜日

位置、回転、スケール合わせスクリプト

選択しているオブジェクトの位置や回転、スケール、ピボットなどをコピーして、別のオブジェクトにペーストするスクリプトです。

※ご使用の際は自己責任でお願いします。




●Copy
選択しているオブジェクトの情報をコピーします。

●Pivot
選択しているオブジェクトのピボット位置を、コピーしたピボット位置に合わせます。(上手く動作しないかも)

●Translate
選択しているオブジェクトの位置を、コピーした位置に合わせます。

●Translate(ver.FT)
選択しているオブジェクトの位置を、コピーした位置に合わせます。
コピーしたオブジェクトがフリーズトランスフォームされていた場合は、こちらを使ってください。

●Rotate
選択しているオブジェクトの回転を、コピーした回転に合わせます。

●Scale
選択しているオブジェクトのスケールを、コピーしたスケールに合わせます。

●Center Pivot
ピボット位置をセンターにします。

●Freeze Transform
フリーズトランスフォームします。


●スクリプト(python)
import maya.cmds as mc

#copy location,rotation and scale value of selected object
def copySelObjVal(arg):
    global loc,rot,sca,WRP,WSP,locFT
   
    if not mc.ls(sl=1):
        if mc.window('ErrorCPNon',ex=1):
            mc.deleteUI('ErrorCPNon')
           
        mc.window('ErrorCPNon',title='Error',s=0)
        mc.columnLayout()
        mc.text(l='Nothing selected objects',w=200,h=50)
        mc.showWindow()
       
    elif len(mc.ls(sl=1)) >= 2:
        if mc.window('ErrorCPTwo',ex=1):
            mc.deleteUI('ErrorCPTwo')
           
        mc.window('ErrorCPTwo',title='Error',s=0)
        mc.columnLayout()
        mc.text(l='Too many selected objects',w=200,h=50)
        mc.showWindow()

    else:
        selA = mc.ls(sl=1)
        loc = mc.xform(selA,q=1,ws=1,t=1)
        rot = mc.xform(selA,q=1,ws=1,ro=1)
        sca = mc.xform(selA,q=1,r=1,s=1)
        WRP = mc.xform(selA,q=1,rp=1,ws=1)
        WSP = mc.xform(selA,q=1,sp=1,ws=1)
        locFT_tmp = mc.xform(q=1,ws=1,piv=1)
        locFT = locFT_tmp[0:3]

#paste location value of selected object
def pasteSelTraVal(arg):
    global loc,rot,sca,WRP,WSP
   
    if not mc.ls(sl=1):
        if mc.window('ErrorCPNon',ex=1):
            mc.deleteUI('ErrorCPNon')
           
        mc.window('ErrorCPNon',title='Error',s=0)
        mc.columnLayout()
        mc.text(l='Nothing selected objects',w=200,h=50)
        mc.showWindow()
       
    elif len(mc.ls(sl=1)) >= 2:
        if mc.window('ErrorCPTwo',ex=1):
            mc.deleteUI('ErrorCPTwo')
           
        mc.window('ErrorCPTwo',title='Error',s=0)
        mc.columnLayout()
        mc.text(l='Too many selected objects',w=200,h=50)
        mc.showWindow()

    else:
        selB = mc.ls(sl=1)
        mc.xform(selB,ws=1,t=loc)

#paste rotaion value of selected object
def pasteSelRotVal(arg):
    global loc,rot,sca,WRP,WSP
   
    if not mc.ls(sl=1):
        if mc.window('ErrorCPNon',ex=1):
            mc.deleteUI('ErrorCPNon')
           
        mc.window('ErrorCPNon',title='Error',s=0)
        mc.columnLayout()
        mc.text(l='Nothing selected objects',w=200,h=50)
        mc.showWindow()
       
    elif len(mc.ls(sl=1)) >= 2:
        if mc.window('ErrorCPTwo',ex=1):
            mc.deleteUI('ErrorCPTwo')
           
        mc.window('ErrorCPTwo',title='Error',s=0)
        mc.columnLayout()
        mc.text(l='Too many selected objects',w=200,h=50)
        mc.showWindow()

    else:
        selB = mc.ls(sl=1)
        mc.xform(selB,ws=1,ro=rot)

#paste scale value of selected object
def pasteSelScaVal(arg):
    global loc,rot,sca,WRP,WSP
   
    if not mc.ls(sl=1):
        if mc.window('ErrorCPNon',ex=1):
            mc.deleteUI('ErrorCPNon')
           
        mc.window('ErrorCPNon',title='Error',s=0)
        mc.columnLayout()
        mc.text(l='Nothing selected objects',w=200,h=50)
        mc.showWindow()
       
    elif len(mc.ls(sl=1)) >= 2:
        if mc.window('ErrorCPTwo',ex=1):
            mc.deleteUI('ErrorCPTwo')
           
        mc.window('ErrorCPTwo',title='Error',s=0)
        mc.columnLayout()
        mc.text(l='Too many selected objects',w=200,h=50)
        mc.showWindow()

    else:
        selB = mc.ls(sl=1)
        mc.xform(selB,s=sca)

#paste pivot value of selected object
def pasteSelPivVal(arg):
    global loc,rot,sca,WRP,WSP
   
    if not mc.ls(sl=1):
        if mc.window('ErrorCPNon',ex=1):
            mc.deleteUI('ErrorCPNon')
           
        mc.window('ErrorCPNon',title='Error',s=0)
        mc.columnLayout()
        mc.text(l='Nothing selected objects',w=200,h=50)
        mc.showWindow()
       
    elif len(mc.ls(sl=1)) >= 2:
        if mc.window('ErrorCPTwo',ex=1):
            mc.deleteUI('ErrorCPTwo')
           
        mc.window('ErrorCPTwo',title='Error',s=0)
        mc.columnLayout()
        mc.text(l='Too many selected objects',w=200,h=50)
        mc.showWindow()

    else:
        selB = mc.ls(sl=1)
        mc.xform(selB,rp=WRP,ws=1)
        mc.xform(selB,sp=WSP,ws=1)
   
#center pivot
def centerPivot(arg):
    mc.xform(cp=1)
   
#freeze transform
def freezTransformKU(arg):
    mc.makeIdentity(a=1,t=1,r=1,s=1)

#paste loc value for freeze transform object
def pasteTraValFT(arg):
    global loc,rot,sca,WRP,WSP,locFT
   
    if not mc.ls(sl=1):
        if mc.window('ErrorCPNon',ex=1):
            mc.deleteUI('ErrorCPNon')
           
        mc.window('ErrorCPNon',title='Error',s=0)
        mc.columnLayout()
        mc.text(l='Nothing selected objects',w=200,h=50)
        mc.showWindow()
       
    elif len(mc.ls(sl=1)) >= 2:
        if mc.window('ErrorCPTwo',ex=1):
            mc.deleteUI('ErrorCPTwo')
           
        mc.window('ErrorCPTwo',title='Error',s=0)
        mc.columnLayout()
        mc.text(l='Too many selected objects',w=200,h=50)
        mc.showWindow()

    else:
        selB = mc.ls(sl=1)
        mc.xform(selB,ws=1,t=locFT)

#window
if mc.window('copyPaste', ex=1):
    mc.deleteUI('copyPaste')
   
mc.window('copyPaste',title='copyPaste',s=0)
mc.columnLayout()
mc.button(l='Copy',c=copySelObjVal,w=110,bgc=(1,0.443,0))
mc.button(l='Pivot',c=pasteSelPivVal,w=110,bgc=(0.8,0.8,0.8))
mc.button(l='Translate',c=pasteSelTraVal,w=110)
mc.button(l='Translate(ver.FT)',c=pasteTraValFT,w=110)
mc.button(l='Rotate',c=pasteSelRotVal,w=110)
mc.button(l='Scale',c=pasteSelScaVal,w=110)
mc.button(l='Center Pivot',c=centerPivot,w=110,bgc=(0.5,0.5,0.5))
mc.button(l='Freeze Transform',c=freezTransformKU,w=110,bgc=(0.2,0.2,0.2))
mc.showWindow()

2016年1月18日月曜日

アニメーションの軌跡に沿ったカーブを作るスクリプト

アニメーションの軌跡に沿ったカーブを作るスクリプト

●Curveボタン
選択しているオブジェクトのアニメーションに沿った次数1のNurbs curveを作ります。

●Nur to Bez
選択しているNurbs curveをBezier curveに変換します。

●Sel smooth
Bezier curveの選択したcvに対してsmoothをかけます。

●All smooth
選択しているBezier curveにsmoothをかけます。

●Bez to Nur
選択しているBezier curveをNurbs curveに変換します。

※ナーブスカーブをベジェカーブに変換したり、ベジェカーブにスムースをかけたりするボタンがある理由
次数1のナーブスカーブでは、動きの速いオブジェクトだとカーブがカクカクしてしまいます。
カーブを滑らかにするために次数を上げればいいのですが、次数を上げるとカーブがオブジェクトの軌跡を外れてしまいます。
なので軌跡を外れずにカーブを滑らかにするために、一旦ベジェカーブにしてからカーブを滑らかにできるようにしました。
ただ、ナーブスのCV全部にスムースをかけてしまうと、バウンシングボールのようなアニメーションの時の接地部分でカーブが変になってしまいます。そのため、滑らかにしたいCVに対してだけスムースをかけられるように「Sel smooth」ボタンを作りました。

次数1のカーブはカクカク
理想
CV全部にスムースをかけた場合











●スクリプト(python)
#make nurbs curve of select object's animation
import maya.cmds as cmds

def createCurve(arg):
    sel = cmds.ls(sl=1)

    staF = cmds.playbackOptions(q=1,min=1)
    endF = cmds.playbackOptions(q=1,max=1)
    allF = range(staF+1,endF+1)

    cmds.currentTime(staF)
    locStaF = cmds.xform(sel,q=1,ws=1,t=1)
    cmds.curve(d=1,p=locStaF)
    curN = cmds.ls(sl=1)

    for i in allF:
        cmds.currentTime(i)
        loc = cmds.xform(sel,q=1,ws=1,t=1)
        cmds.curve(curN,a=1,p=loc)

def changeBezier(arg):
    cmds.nurbsCurveToBezier( )

def changeAllSmooth(arg):
    curN = cmds.ls(sl=1)
    str_curN = str(curN).replace("[u'",'').replace("']",'')
    degs = cmds.getAttr( '.degree' )
    spans = cmds.getAttr( '.spans' )
    cvs = degs+spans
    cvs_step3 = range(0,cvs,3)
    cvs_step3.pop(0)

    cmds.select(str_curN + '.cv[0]')

    for i in cvs_step3:
        cmds.select(str_curN + '.cv[' + str(i) + ']',add=1)

    cmds.bezierAnchorState(sm=1)
    cmds.select(str_curN)

def changeSelSmooth(arg):
    cmds.bezierAnchorState(sm=1)

def changeNurbs(arg):
    cmds.bezierCurveToNurbs( )
 
#window
if cmds.window('curveTrail', ex=1):
    cmds.deleteUI('curveTrail')
 
cmds.window('curveTrail',title='curveTrail')
cmds.columnLayout()
cmds.button(l='Curve',c=createCurve,w=100)
cmds.button(l='Nur to Bez',c=changeBezier,w=100)
cmds.setParent('..')
cmds.rowLayout(nc=2)
cmds.button(l='All Smooth',c=changeAllSmooth,w=100,bgc=(0.2,0.2,0.2))
cmds.button(l='Sel Smooth',c=changeSelSmooth,w=100,bgc=(0.8,0.8,0.8))
cmds.setParent('..')
cmds.button(l='Bez to Nur',c=changeNurbs,w=100)
cmds.showWindow()

2015年12月21日月曜日

選択したオブジェクトのバウンディングボックスサイズのCubeを作るスクリプト(仮)

選択したオブジェクトのバウンディングボックスサイズのCubeを作るスクリプト。
まだちゃんと検証していないため、きちんと動かないかもしれないので注意!

#create boundingbox script
import maya.cmds as cmds

#select object
sel = cmds.ls(sl=1)

#get rotate value selected object
rot = cmds.xform(sel,q=1,ws=1,ro=1)

#get pivot value selected object
piv = cmds.xform(sel,q=1,ws=1,rp=1)

#rotate value (0,0,0) seleected object
cmds.xform(sel,ro=(0,0,0))

#create boundingbox selected object
x1, y1, z1, x2, y2, z2 = cmds.exactWorldBoundingBox(sel)
cube = cmds.polyCube()[0]

xc = (x2 + x1) / 2.0
yc = (y2 + y1) / 2.0
zc = (z2 + z1) / 2.0

xw = x2 - x1
yw = y2 - y1
zw = z2 - z1

cmds.move(xc, yc, zc, cube)
cmds.scale(xw, yw, zw, cube)

#change cube pivot points
cmds.xform(cube,ws=1,rp=piv)

#rotate selected object and boundingbox
cmds.xform(sel,ro=rot)
cmds.xform(cube,ro=rot)

2015年9月21日月曜日

Mattepaint参考動画

Camera projectionの作品作り用、Mattepaint参考動画集

http://www.cgstudentawards.com/magazine/entry/2014-student-of-the-year-adrien-lambert?utm_content=buffer1d9d6&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer

http://adrien-lambert.com/en/

https://www.youtube.com/watch?v=u2JXvq00wsw

https://www.youtube.com/watch?v=ZjgSm4eJPAM

https://vimeo.com/68342588

https://www.youtube.com/watch?v=GrXdvg8YvAc

https://vimeo.com/61489218

https://www.youtube.com/watch?v=QaxWrh7xAGk

http://www.iamag.co/features/nacho-thomas-digital-matte-painting-environment-reel/

https://vimeo.com/92335003

http://www.francescocorvino.com/breakdown.html

http://alexpopescu.net/?page_id=121

https://www.youtube.com/watch?v=mhGIXBxcuQQ

自分で作ったCamera projection作品。



Camera projection building from Kyohei on Vimeo.

使用ツールは、maya,photoshop,nuke。
一枚の写真から作成。
ビルを回り込ませたかったので、photoshopでビルをレイヤー分け。
mayaでプロジェクション用のカメラと、ビルのプロジェクション用のジオメトリを作る。
プロジェクション用のカメラは、「m2n」というスクリプトでnukeにもっていく。
「m2n」スクリプトは↓で手に入ります。
http://www.creativecrash.com/maya/script/maya2nuke-v2
nuke上でプロジェクション。
nuke上で撮影用のカメラを作って、撮影。
以上です。

2015年8月9日日曜日

AfterEffects ショートカットキー

AfterEffectsのショートカット一覧


  • Enter :名前の変更
  • ctrl + d :複製

  • p : 位置プロパティの表示・非表示
  • s : スケールプロパティの表示・非表示
  • r : 回転プロパティの表示・非表示
  • t : 不透明度プロパティの表示・非表示
  • a :アンカーポイントプロパティの表示・非表示
  • shift + ショートカットキー:複数プロパティの表示・非表示

  • pagedown : 次のフレームに移動(shift押しながらで10フレーム)
  • pageup : 前のフレームに移動(shift押しながらで10フレーム)
  • home : 最初のフレームに移動
  • end : 最後のフレームに移動
  • j : 前のキーフレーム、レイヤーマーカーに移動
  • k :次のキーフレーム、レイヤーマーカーに移動
  • alt + shift + j : 時間設定ダイアログの表示

  • [ : 現在のフレームに選択したレイヤーのin点を移動
  • ] : 現在のフレームに選択したレイヤーのout点を移動
  • alt + [ : 現在のフレームで選択したレイヤーのin点をトリミング
  • alt + ] : 現在のフレームで選択したレイヤーのout点をトリミング
  • i : インジケータを選択したレイヤーのin点に移動
  • o : インジケータを選択したレイヤーのout点に移動
  • b : 現在のフレームにワークエリアのin点を設定
  • n : 現在のフレームにワークエリアのout点を設定
  • 0(テンキー) : ramプレビュー
  • shift + 0(テンキー) : shift + ram プレビュー
  • .(テンキーのピリオド) : オーディオのみプレビュー
  • 数字キー(テンキー) : レイヤーの選択
  • *(テンキー) : レイヤーマーカーの作成

  • @ : パネルの全画面表示
  • F2 : 選択解除
  • F3 : エフェクトコントロールパネルの表示・非表示
  • shift + F3 : レイヤーバーモードとグラフエディタモードの切り替え
  • F4 : スイッチ列とモード列の切り替え
  • shift + F4 : 親列の表示・非表示
  • F10 : フロントビュー
  • F11 : カスタムビュー1
  • F12 : アクティブカメラビュー

  • F9 : イージーイーズ
  • shift + F9 : イージーイーズイン
  • ctrl + shift + F9 : イージーイーズアウト

  • e : エフェクトプロパティの表示・非表示
  • ee : エクスプレッションを追加したプロパティの表示・非表示
  • u : アニメーションされた、もしくは設定を変更したプロパティの表示・非表示
  • uu : アニメーションされた、もしくは設定を変更したプロパティの表示・非表示
  • m : マスクパスプロパティの表示・非表示
  • mm : 全てのマスクプロパティの表示・非表示
  • tt : マスク透明度プロパティの表示・非表示
  • f : マスクの境界のぼかしプロパティの表示・非表示

  • ctrl + n : 新規コンポジションの作成
  • ctrl + k : コンポジション設定
  • ctrl + shift + b : コンポジションの背景色の変更
  • ctrl + y : 新規平面の作成
  • ctrl + shift + y : 平面設定
  • ctrl + r : 定規の表示・非表示
  • ctrl + alt + shift + c : 新規カメラの作成
  • ctrl + alt + shift + L : 新規ライトの作成
  • ctrl + alt + shift + y : 新規ヌルオブジェクトの作成

  • alt + 1 : redチャンネル表示とrgbチャンネル表示の切り替え
  • alt + 2 : greenチャンネル表示とrgbチャンネル表示の切り替え
  • alt + 3 : blueチャンネル表示とrgbチャンネル表示の切り替え
  • alt + 4 : アルファチャンネル表示とrgbチャンネル表示の切り替え

  • shift + - : 描画モードの切り替え

2015年7月1日水曜日

Pendulum Animation その1

今回からは、Pendulumのアニメーションを進めていきます。

●Image


●Model


●Rig



Pendulum Rig from Kyohei on Vimeo.

●Test


pendulumTest t01 from Kyohei on Vimeo.

●Conclusion
・アニメーションは次回から。
・テストで動かした感じだと、思ったよりも難しい。
・今回の目標は
①滑らかに、活き活きと、気持ち良い動き
②フォロースルーとオーバーラップ
③キャラクターの表現(キャラの性格を動きで表現する!)

2015年6月25日木曜日

Juicebox Animation その3

Juiceboxを使ったアニメーションが完成しました。
作業時間は、アニメーション部分だけで約9時間。

●Blocking


Juicebox runningHighJump blocking from Kyohei on Vimeo.

●Finish


juiceboxAnimationRunningHighJump from Kyohei on Vimeo.


●Comment
Good point
・上手くできた!ような気がする。
・助走のところは良い。
・ストローによってキャラクター感を表現できたかな。

Bad point
・ジャンプがいまいちか。もっと、飛ぶために力をためるようにした方がいいかも。
・今更だが、レイアウトが悪い気がする。
 このアングルだと、キャラの動きが手前~奥にしか動かないから、動いている感がない。
 シルエットに変化がないのも、動きが感じられない原因かも。
・時間がかかり過ぎた。今後は作業時間も気にしながらアニメーションをつける。
 ダラダラやるのは、良くない!

・今後はシルエットにも気を配る。
・レイアウトの段階で、どう見えるをもっと考える。

●Next
・次にやるのは、Pendulum。振り子です!

2015年6月21日日曜日

Juicebox Animation その2

今回はプランニングとステージング、レイアウトまで。

●Plan
・走り高跳び
・形状を変えない(カートゥーニーな変形をしない)。
・感情表現をストロー部分で行う。
・キャラクター性を持たせる。

●Staging


●Layout




●Conclusion
・飛んだ時のジュースボックスの重さ、ジュースボックスのキャラクター性を表現できるかが勝負!
・前回は尺が長かったので、今回はなるべく尺を短くする。10秒は最低超えないようにする!

2015年6月19日金曜日

Juicebox aimation その1

今回からは、Juiceboxを使ったアニメーションを作っていきます。

●Model










●Rig


●Animation test


●Conclusion
・ようやくジュースボックスのモデルとリグが完成しました。
・時間かかり過ぎ、スケジュールが大分遅れてしまった。
・前回までの、ボールやピルのリグよりも難しかった。
・今回は接地面が一点ではなく、面だったので前後や左右に動く時に、ピボットが底面の中心にあると沈んでしまう。そこを沈まないようにするのが大変だった。
・それを解決するために、ドリブンキーを今回のリグに使いました。
・また前回まではモデルの形を変えるのに、Nonlinear Deformerを使っていましたが、今回からはボーンによるスキニングとブレンドシェイプを使いました。

●Next
・次はいよいよこのリグを使ってアニメーションを作っていきます。
まずは、どういう動きをさせるかプランニングから。

2015年6月7日日曜日

parapara スクリプト ver.2

以前作った、MayaのGhost機能をまとめた「parapara」スクリプトに手を加えてみました。

●Window


●Description video
※Not sound. 音声ありません。


●Description
・Ghost number :表示するゴーストの数です。
・frame per step :何フレーム毎のゴーストを表示するかの数です。
・Create Ghost :選択したオブジェクトのゴーストを作ります。
・Delete GhostAll :シーン内のゴーストを全て消します。
・Global Prefs :キーフレームが打っていないところもゴーストを表示します。
・KeyframesOnly :キーフレームが打ってあるところだけゴーストを表示します。

●Notes
・コントローラーを使ってアニメーションをつけているオブジェクトに対しては、上手く機能しません。
・ゴーストは選択したオブジェクトに対して作られるので、コントローラを使ってアニメーションをつけている場合、そのコントローラのゴーストが作られるからです。

●Summary
・Notesに書いたとおり、コントローラを使ってアニメーションをつけている場合使えないのが最大の問題。
・説明ビデオに音声が無くてすいません。説明ビデオのためにヘッドセット買おうかな。

●Script
/*parapara script
*/

global proc GhostsPara()
{
    int $val;
    $val = `intSliderGrp -q -value paraSlider`;
    updateGhostData 2 $val;
}

global proc GhostsParaNum()
{
    int $num;
    $num = `intSliderGrp -q -value numSlider`;
    updateGhostData 0 $num;
    updateGhostData 1 $num;
}

global proc CrateGhost()
{
   intSliderGrp -e -value 1 numSlider;
   intSliderGrp -e -value 1 paraSlider;
   updateGhostData 0 1;
   updateGhostData 1 1;
   updateGhostData 2 1;
   CreateGhost;
}

global proc DeleteGhostAll()
{
   intSliderGrp -e -value 1 numSlider;
   intSliderGrp -e -value 1 paraSlider;
   unGhostAll;
}

global proc ChangGlobalPrefs()
{
    string $sel[] = `ls -sl`;
    string $shapeSel[] = `listRelatives -s`;
    setAttr ($shapeSel[0] + ".ghostingControl") 0;
}

global proc ChangKeyframesOnly()
{
    string $sel[] = `ls -sl`;
    string $shapeSel[] = `listRelatives -s`;
    setAttr ($shapeSel[0] + ".ghostingControl") 4;
    
    float $startRange = `playbackOptions -q -min`;
    float $endRange = `playbackOptions -q -max`;
    setAttr ($shapeSel[0] + ".ghostRangeStart") $startRange;
    setAttr ($shapeSel[0] + ".ghostRangeEnd") $endRange;
}

{
if(`window -exists parapara`)
deleteUI parapara;

window parapara;
showWindow parapara;

columnLayout;

intSliderGrp -label "Ghost number" -field true
             -value 1
             -minValue 1
             -maxValue 10
             -fmx 100
             -cc"GhostsParaNum()" numSlider;

intSliderGrp -label "frame per step" -field true
             -value 1
             -minValue 1
             -maxValue 30
             -fmx 100
             -cc"GhostsPara()" paraSlider;
            
setParent ..;

//ゴーストの作成、削除
rowLayout -numberOfColumns 3;

text -label "                           ";
            
button -label "Create Ghost"
       -command "CrateGhost()";
                  
button -label "Delete GhostAll"
       -command "DeleteGhostAll()";
       
setParent ..;

//ゴーストの表示の仕方変更
rowLayout -numberOfColumns 3;

text -label "Ghosting Control";          
       
button -label "Global Prefs"
       -command "ChangGlobalPrefs()";
       
button -label "KeyframesOnly"
       -command "ChangKeyframesOnly()";
       
setParent ..;

}

2015年6月6日土曜日

Pill animation その3

Pill animationができました。

●Movie



●Memo
・上手くできた気がする!
・目的だった、アンティックとキャラクター性は上手く入れられたかな。
・ピルがジャンプする前に、「向こう岸の距離と穴の深さにビビるが、ジャンプすることを決める」という演技をさせたつもりだが、伝わらないかも。
・ビビる動作が入ってないからか。2度見と、じっと下を見つめるだけじゃ足りないかも。
・考えている動作の間の取り方が難しい。
・59~70f、130~148fの動きがリニアっぽい。
・ステージングの段階で直すべきだったけど、穴が大きすぎた。
・そしてやっぱり尺が流すぎる!

●Next
・次はジュースボックスを使ったアニメーションを作る。
・ジュースボックスは、今回のようにモデルをあまりSquash and Stretchをさせずにアニメーションさせる。