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