ジャンプ先: 概要. 戻り値. キーワード. 関連. フラグ. Python 例.

概要

bakeDeformer([bakeRangeOfMotion=boolean], [colorizeSkeleton=boolean], [customRangeOfMotion=timerange], [dstMeshName=string], [dstSkeletonName=string], [hierarchy=boolean], [influences=string[]], [maxInfluences=int], [pruneWeights=float], [smoothWeights=int], [srcMeshName=string], [srcSkeletonName=string])

注: オブジェクトの名前と引数を表す文字列は、カンマで区切る必要があります。これはシノプシスに示されていません。

bakeDeformer は、取り消し可能、照会不可能、および編集不可能です。

デフォーマのセットによってメッシュ シェイプが決定されたリグ キャラクタを基に、bakeDeformer は観測されたデフォメーションに最も近いリニア ブレンド スキン ウェイトを計算します。そのために、可動域内でリグを移動することによってサンプルのテスト セットを生成します。結果のメッシュとポーズのペアは、スキニング ウェイトを計算して、制限された最適化を計算するために使用されます。bakeDeformer は、算出されたウェイトを自動的にバインドして目的のジオメトリに適用します。ソースと目的のメッシュ/スケルトンが同じ場合、このコマンドは、元のデフォメーションを skinCluster および計算されたウェイトで置き換えます。サンプルの使用方法については、次の例を参照してください。

戻り値

stringBakeDeformer 名

キーワード

bake, skinning, deformer

関連

skinPercent

フラグ

bakeRangeOfMotion, colorizeSkeleton, customRangeOfMotion, dstMeshName, dstSkeletonName, hierarchy, influences, maxInfluences, pruneWeights, smoothWeights, srcMeshName, srcSkeletonName
ロング ネーム(ショート ネーム) 引数タイプ プロパティ
bakeRangeOfMotion(brm) boolean create
このフラグを指定すると、コマンドは各インフルエンスを 45 度回転させて、フレームごとに 1 つの一連のポーズを生成します。これは、モーション範囲の調整のために変更するキー ポーズのセットを生成する場合に便利です(詳細については、-customRangeOfMotion フラグを参照)。最初に生成されるポーズは現在のレスト ポーズで、生成されるポーズの総数が返されます。
colorizeSkeleton(cs) boolean create
作成された新しいスキン クラスタは、そのスケルトンが色付けされます。-srcSkeletonName および -dstSkeletonName フラグと併用する必要があります。
customRangeOfMotion(rom) timerange create
使用するモーション範囲のフレームでこのフラグが指定されている場合、ツールは各フレームを独立したポーズとしてステップ実行します。それ以外の場合は、ツールで既存のモーション範囲が使用されて、各インフルエンスが 45 度回転します。

使用例:

  • -rom "10:20" は、10 ~ 20 の範囲(現在の時間単位、両方の値を含む)のすべてのフレームを意味します。
  • 範囲の一端を省略すると、次の例のように、アニメーション範囲のいずれかの端(または両端)が使用されます。
  • -rom "10:" は、時間 10 (現在の時間単位)から(タイムライン上の)アニメーション範囲内の最大時間までのすべてのフレームを意味します。
  • -rom ":10" は、(タイムライン上の)アニメーション範囲の最大時間から、時間 10 (現在の時間単位、両方の値を含む)までのすべてのフレームを意味します。
  • -rom ":" は、現在のアニメーション範囲の、最小時間から最大時間までのすべてのフレームを指定する短縮形です。

このフラグを使用した場合、指定したモーション範囲内のジョイントの一部が十分に変更されていない可能性があります。bakeDeformer の結果を改善するため、またはアルゴリズム エラーを回避するために、このコマンドは指定したモーション範囲内で十分に移動していないインフルエンスのリストを返します。これらのジョイントを検出するために、以降のフレーム間で各ジョイントの ローカル トランスフォームが比較されます。次の基準のいずれかが満たされている場合は、ジョイントが十分に変更されたとみなされます。

  • 5 度以上の回転がある(回転角はトランスフォーム間の最短の回転によって決まる)。
  • 各フレームのすべてのジョイントを含む最大のバウンディング ボックスのサイズが 1% 以上変化している。
  • 1% 以上のスケーリング変更がある。このパーセンテージは、最小スケーリング値を最大スケーリング値で割った値を表します(絶対値)。

いずれかの基準を満たさないジョイントがある場合は、正常に移動されなかったジョイントに関する警告にこのジョイントが追加されます。

カスタムのモーション範囲は実験段階のものです。

dstMeshName(dm) string create
目的のメッシュ名。
dstSkeletonName(ds) string create
目的のスケルトン名。
hierarchy(hi) boolean create
渡されたジョイントの子のうち、インフルエンス フラグで使用されているものがすべて使用されます。
influences(i) string[] create
ジョイントのリストは、新しいウェイトを決定するためのインフルエンスとして使用されます。
maxInfluences(mi) int create
頂点ごとのインフルエンスの最大数。
pruneWeights(pw) float create
新規に作成されたスキン クラスタで、指定した値を下回るすべてのウェイトにゼロを設定します(ポストプロセス)。これにより、次のように skinPercent コマンドが呼び出されます。「skinPercent -pruneWeights [value] [skinClusterName] [dstMeshName]」。[value]はこのフラグに渡される値、[skinClusterName]は、このツールの実行後に作成される新しい skinCluster ノードの名前、[dstMeshName]は-dstMeshNameフラグで指定されたメッシュです。
smoothWeights(sw) int create
スムージング ウェイトのスムージングの反復回数です(ポストプロセス)。これにより、残りのウェイトも再正規化されます。
srcMeshName(sm) string create
ソース メッシュ名。
srcSkeletonName(ss) string create
ソース スケルトン名。

フラグはコマンドの作成モードで表示できます フラグはコマンドの編集モードで表示できます
フラグはコマンドの照会モードで表示できます フラグに複数の引数を指定し、タプルまたはリストとして渡すことができます。

Python 例

import maya.cmds as cmds

import maya.cmds as cmds
import maya.mel as mel

def createJointsAndMesh(offset = (0., 0., 0.)):
    root = cmds.joint()
    for _ in range(0,5):
        cmds.joint()
        cmds.move(0., 2., 0., r=True)

    meshes = cmds.polyCube(sx=3,sy=10,sz=3,h=10)
    cmds.move(0, 5, 0, r=True)
    cmds.select([root, meshes[0]], r=True)
    cmds.move(offset[0], offset[1], offset[2], r=True)
    cmds.select(cl=True)
    return (root, meshes[0])

def bindMesh(object):
    rootJoint, mesh = object
    cmds.select(rootJoint, r=True, hi=True)
    cmds.select(mesh, add=True)
    mel.eval('SmoothBindSkin')
    cmds.select(cl=True)

def randomizeJoints(object):
    from math import degrees
    rootJoint = object[0]
    cmds.select(rootJoint, r=True)
    cmds.pickWalk(d='down')
    for i in range(4):
        rads = mel.eval('sphrand 1.')
        cmds.rotate(degrees(rads[0]), degrees(rads[1]), degrees(rads[2]))
        cmds.pickWalk(d='down')

def matchRotations(src, dst):
    cmds.select(src[0], r=True, hi=True)
    srcChain = cmds.ls(sl=True)

    cmds.select(dst[0], r=True, hi=True)
    dstChain = cmds.ls(sl=True)

    for joints in zip(dstChain, srcChain):
        cmds.select(list(joints), r=True)
        mel.eval('MatchRotation')

# Create a new scene
cmds.file(f=True, new=True)

# Create two joint chains/meshes
object1 = createJointsAndMesh()
object2 = createJointsAndMesh(offset=(5, 0, 0))

# Bind one of the joint chains to the mesh and rotate the weights
bindMesh(object1)
randomizeJoints(object1)

# Use bakeDeformer to learn and apply the linear blend skinning weights.
cmds.bakeDeformer(ss=object1[0], sm=object1[1], ds=object2[0], dm=object2[1], mi=3)

# Match the rotations of the two chains to show the results are similar
matchRotations(object1, object2)