2020/08/29

Perforce: 複数のワークスペースを更新するバッチ

batを叩けば全部更新。

@echo off

set P4PORT=x.x.x.x:xxxx
set P4USER=user
set P4PASSWD=password

echo %P4PORT%
echo %P4USER%
echo %P4PASSWD%

echo %P4PASSWD%|p4 login

p4 info

set P4CLIENT=workspaceA
echo %P4CLIENT%
p4 sync //dirA/...#head

set P4CLIENT=workspaceB
echo %P4CLIENT%
p4 sync //dirB/...#head

set P4CLIENT=workspaceC
echo %P4CLIENT%
p4 sync //dirC/...#head

pause

2020/04/22

UE4 : SequencerのFBXインポートオプション

SequencerのFBXインポートオプションのデフォルトを変更したい場合は以下を設定。

iniファイル設定
Engine/Saved/Config/Windows/EditorSettings.ini
一番下に以下を追記

[/Script/MovieSceneTools.MovieSceneUserImportFBXSettings]
bMatchByNameOnly=False
bForceFrontXAxis=False
bCreateCameras=False
bReduceKeys=False
ReduceKeysTolerance=0.0001


2020/04/21

UE4 : Python 忘備録

Unreal Pythonで良く使うやつ列挙
------------------------------------------------------------------------------------------

import unreal

# コンテンツブラウザの選択取得
assets = unreal.EditorUtilityLibrary.get_selected_assets()

------------------------------------------------------------------------------------------
# フォルダに入っているアセット取得
assets = unreal.EditorAssetLibrary.list_assets(path)

------------------------------------------------------------------------------------------
# アセットが存在するか
unreal.EditorAssetLibrary.does_asset_exist(path)

------------------------------------------------------------------------------------------
# world取得
world = unreal.EditorLevelLibrary.get_editor_world()

------------------------------------------------------------------------------------------
# 開いているSequencerを閉じる
unreal.LevelSequenceEditorBlueprintLibrary.close_level_sequence()

------------------------------------------------------------------------------------------
# Animation Sequenceをインポート
lTask = []
task = unreal.AssetImportTask()
task.automated = True
task.destination_path = destination_path
task.filename = filename
task.replace_existing = True
task.save = True
task.options = unreal.FbxImportUI()
task.options.import_animations = True
task.options.skeleton = skeleton
task.options.mesh_type_to_import = unreal.FBXImportType.FBXIT_ANIMATION
lTask.append(task)
unreal.AssetToolsHelpers.get_asset_tools().import_asset_tasks(lTask)

------------------------------------------------------------------------------------------
# Level Sequence作成
sq = unreal.AssetToolsHelpers.get_asset_tools().create_asset(
                asset_name,
                package_path,
                unreal.LevelSequence,
                unreal.LevelSequenceFactoryNew())

# フレームレート設定
sq.set_display_rate(unreal.FrameRate(integer))

# インアウト設定(フレーム)
sq.set_playback_start(integer)
sq.set_playback_end(integer)

# ビューレンジ(秒)
sq.set_view_range_start(float)
sq.set_view_range_end(float)

# ワークレンジ設定(秒)
sq.set_work_range_start(float)
sq.set_work_range_end(float)

# Level Sequenceを開く
unreal.LevelSequenceEditorBlueprintLibrary.open_level_sequence(sq)

# カレントフレーム設定
unreal.LevelSequenceEditorBlueprintLibrary.set_current_time(integer)

------------------------------------------------------------------------------------------



2018/04/04

MotionBuilder : カメラショットクリップを選択して実行するとインアウトを合わせる

ストーリーのカメラショットクリップを選択して実行です。
ついでに、Mergeで増えーる増えーる空トラックを全消し


# -*- coding: utf-8 -*-
from pyfbsdk import *

# クリップのフレームインとフレームアウト用のリスト
lIn = []
lOt = []
# 空のトラックをあとで消す用のリスト
lDel = []

# ショットトラック処理
for track in FBStory().RootEditFolder.Tracks:
    # 空のトラックなら、消す用リストに追加
    if not len(track.Clips):
        lDel.append(track)

    print track.Name
    # トラックにあるクリップ処理
    for clip in track.Clips:
        # クリップが選択されていたら
        if clip.Selected:
            # インとアウトの値をリストにそれぞれ追加 クリップ選択複数対応
            lIn.append(clip.ShotActionStart.GetFrame())
            lOt.append(clip.ShotActionStop.GetFrame())

# インとアウトのリストから、Transport ControlsのZoomWindowの値をセットする
if lIn and lOt:
    mn = min(lIn)
    mx = max(lOt)-1
    print "in %s - out %s" % (mn,mx)
    
    if FBPlayerControl().LoopStart.GetFrame() > mn:
        FBPlayerControl().LoopStart = FBTime(0,0,0,mn)
    if FBPlayerControl().LoopStop.GetFrame() < mx:
        FBPlayerControl().LoopStop = FBTime(0,0,0,mx)
    
    FBPlayerControl().ZoomWindowStart = FBTime(0,0,0,mn)
    FBPlayerControl().ZoomWindowStop = FBTime(0,0,0,mx)
    
# 取得した空のリストを消去
map(FBComponent.FBDelete,lDel)

2017/12/12

maya : 選択しているチャンネルボックスで、グラフエディタのFCurve表示

こっちのほうが、使いやすいかも。
UIいらんな…。


# -*- coding: cp932 -*-
# FCurveSelectorChannelBox.py

import pymel.core as pm

# グラフエディタを取得。カスタムグラフエディタ対応で複数のエディタを見に行く
for ge in pm.getPanel(scriptType="graphEditor"):
    # グラフエディタ内アウトライナの選択を一度解除
    pm.selectionConnection(ge.name()+"FromOutliner",e=1,clr=1)
    for obj in pm.selected():
        for a in pm.channelBox("mainChannelBox",q=1,sma=1):
            # 各アトリビュートのFCurveを表示
            pm.selectionConnection(ge.name()+"FromOutliner",e=1,s=obj.attr(a))


2017/12/05

maya : 骨にヘアを揺れ物シミュレーションするツール YURAYURA.py


髪の毛などの数珠繋ぎ階層にヘアシミュレーションをかける揺れ物ツールです。

ダウンロード

使い方:

このスクリプトを、そのままシェルフ登録に出来ます。

プラグインとして使用する場合は、mayaのscriptsフォルダに
このファイルを入れます。
C:\Users\[user]\Documents\maya\scripts
もしくは、PYTHON_PATHが設定してある場所でもOKです。

実行コマンド
import YURAYURA;YURAYURA.YURAYURA()

ツールを実行するとUIが立ち上がります。

GENERATE:
髪の毛のルートを選択して、GENERATEボタンを押すと
YURAYURAシミュレーションセットが作られます。
複数選択でき、一度作成した後でも追加で使用できます。

MODIFY:
SETTING欄の数値を変更して、下にあるMODIFY SETTING ( REFRESH )
ボタンで適用できます。

COLLIDE:
コリジョンをセットしたい場合は、コリジョンオブジェクトを選択して
ADD COLLIDEボタンを押します。

BAKE:
シミュレーション結果が良さそうであれば、BAKEボタンを押すと
元に選択していた階層すべてのRotateにBake Simulationをかけます。
YURAYURAシミュレーションセットは消去され、UIも閉じます。


動画の途中で、ikHandleのInherits Transformをカチカチっとやってますが
ikHandleのリフレッシュがうまく行われず、なんらかのアトリビュートを
いじれば、ちゃんとした結果になるようです・・・。
自分のセットアップが悪いのかも知れませんが・・・。
解決法があれば、教えていただきたいです。


2017/11/29

maya : 選択しているFCurveをリダクション



自分でも書いてみました。
キャプチャエディットしてると使いたくなります。
やっぱり便利です。

YAMATANI.py


# -*- coding: cp932 -*-
# YAMATANI.py

import pymel.core as pm

# FCurveノード名を取得
lfcv = pm.keyframe(q=1,n=1)
for fcv in lfcv:
    ld = [] # 消去するキーのインデックスリスト
    # FCurveの時間、値のリスト取得
    lv = pm.keyframe(fcv,q=1,tc=1,vc=1)
   
    # 最初と最後のキー以外を調査
    for i in range(1,len(lv)-1):
        # キーが上り坂なら消すリストにインデックスを追加
        if lv[i-1][1] < lv[i][1] and lv[i][1] < lv[i+1][1]:
            ld.append([i])
        # キーが下り坂なら消すリストにインデックスを追加
        elif lv[i-1][1] > lv[i][1] and lv[i][1] > lv[i+1][1]:
            ld.append([i])
    if ld:
        # インデックスを使ってキーを消去
        pm.cutKey(fcv,index=ld)
        # 一度すべてのキータンジェントをAutoにする
        pm.keyTangent(fcv,itt="auto",ott="auto")
        # 最初のキータンジェントをSplineにする
        pm.keyTangent(fcv,t=lv[0][0],itt="spline",ott="spline")
        # 最後のキータンジェントをSplineにする
        pm.keyTangent(fcv,t=lv[-1][0],itt="spline",ott="spline")

2017/11/15

maya : タイムレンジのゲットセット

いくつかやり方があるけれど、これが一番シンプルかなー。

import pymel.core as pm

# タイムレンジの内側のゲットセット
pm.Env().minTime = 100
print pm.Env().minTime

pm.Env().maxTime = 500
print pm.Env().maxTime

# タイムレンジの外側のゲットセット
pm.Env().animStartTime = 0
print pm.Env().animStartTime

pm.Env().animEndTime = 600
print pm.Env().animEndTime

2017/11/08

python : 関数のデフォルト引数

今日はじめて知ったんですが、pythonの関数のデフォルト引数の挙動

>>> def b(l=[]):
... l.append(1)
... return l
...
>>> print b()
[1]
>>> print b()
[1, 1]
>>> print b()
[1, 1, 1]
>>>

あらららららららららら・・・・???

調べてみると、デフォルト引数は、関数が作成されるときに一度だけセットされるみたいです。
回避するには

>>> def c(l=None):
... if l is None:
... l=[]
... l.append(1)
... return l
...
>>> c()
[1]
>>> c()
[1]
>>> c([1])
[1, 1]
>>>

とかやるみたいです。
完全に間違ってました・・・orz

2017/11/02

maya : 選択しているオブジェクトのアニメーションキーを前後5フレずつ消す

k の値をお好きに変えてどうぞ。
いままで、手動でやってたのを後悔するわ…。


# -*- coding: cp932 -*-
# RemoveNeighboringKeys.py

import pymel.core as pm

k = 5 # 前後の消すフレームの値
c = pm.currentTime()
pm.cutKey(pm.selected(),time=(c-k,c-1))
pm.cutKey(pm.selected(),time=(c+1,c+k))

2017/11/01

maya : 選択しているオブジェクトのコンストレイントをすべて削除

コードが短すぎて、逆に不安…。
デフォルトでつけておいて欲しい。

import pymel.core as pm
pm.delete(pm.listRelatives(pm.selected(),typ="constraint"))

Perforce: 複数のワークスペースを更新するバッチ

batを叩けば全部更新。 @echo off set P4PORT=x.x.x.x:xxxx set P4USER=user set P4PASSWD=password echo %P4PORT% echo %P4USER% echo %P4PASSWD% echo %P4PAS...