シェイプ アニメーションを使用すると、時間の経過に伴ってオブジェクトのシェイプを変化させることができます。 これを実行するには、オブジェクトのポイント クラスタの幾何学的シェイプ(デフォーメーション)に基づいて、ポーズごとにシェイプ キーを保存します(ポリゴンまたはエッジで作成されたクラスタはサポートされていません)。
シェイプ アニメーションは、リファレンス シェイプに相対的なポイント クラスタのシェイプ データをShapeKeys または ShapeKeys に保存します。 シェイプ アニメーションは、特定の種類の Source または Source オブジェクトであり、ActionSource または ActionSource オブジェクトと呼ばれています。
ShapeKey または ShapeKey オブジェクトは、特定の ClusterProperty または ClusterProperty を表現し、特定のジオメトリを格納するために使用します。 シェイプ キーは、クラスタ シェイプの絶対値(オブジェクト リファレンスに基づくオフセットまたは頂点のローカル リファレンス フレームに基づく値)を保存することで、クラスタ シェイプの変化に関する情報を提供します。 これらの値を使用する KeyType パラメータの値を取得することで、キーのリファレンス モードを調べることができます。
KeyType パラメータによって使用される値が、siShapeReferenceMode 列挙型(Geometry.SaveShapeKey メソッド、CClusterPropertyBuilder::AddShapeKey メンバ関数、ConvertShapeReferenceMode コマンドなどの多くの関数で使用される)によって表現される値に対応しないことを認識することが重要です。
あるシェイプ キー リファレンス モードから別のモードに変換するには、ConvertShapeReferenceMode コマンドを使用します。
次のように、ポイント クラスタからシェイプ キーを作成できるスクリプト コマンドは多数存在します。
ApplyDeformKey: ポーズごとにデフォーメンション キーを保存します。
SaveDeformKey: ポーズごとのデフォーメンションのキーを保存します。
SelectShapeKey: オブジェクトのリストを別のオブジェクトのシェイプ キーとして選択します。
シェイプ キーは、シェイプ グループ(指定されたクラスタ内でシェイプ キーを意味的に整理するために使用)に割り当てることもできます。 シェイプ グループを CreateShapeGroup コマンドを使用して作成し、SetShapeGroup コマンドを使用してシェイプ キーをグループに割り当てることができます。
シェイプ キーは、ActionSource または ActionSource([ミキサ]の下に格納され、ShapeClip または ShapeClip としてインスタンス化される)にまとめることもできます。 ShapeClip オブジェクトは、アニメーション ミキサのシェイプ トラックのある特定位置における、シェイプ キー(ソース)のインスタンスです。 オブジェクト モデル(C++ API にはこのメソッドに相当する関数がありません)のGeometry.SaveShapeKey メソッドを使用するか、次のいずれかのスクリプト コマンドを使用します。
SaveShapeKey: 現在のシェイプのシェイプ キーを作成し、モデルのシェイプ ソース(Mixer>Sources>Shape フォルダ)のリストに追加します。
StoreShapeKey: シェイプ キーをモデルの Mixer>Sources>Shape フォルダに格納しますが、ミキサ内にシェイプ クリップを作成しません。
ApplyShapeKey: 指定されたシェイプ キーを現在のフレームのオブジェクトに適用し、アニメーション ミキサ内にシェイプクリップを作成します。
ActionSources に基づいた他のクリップ同様、ShapeClips には単純なクリップと(siClipShapeType)コンパウンド クリップ(siClipShapeCompoundType)があり、SIObject.Type または SIObject::GetType プロパティを持つクリップ オブジェクトに対してテストできます。
シェイプ キーは、アニメーションに手を加えることなく、ジオメトリのシェイプにソロを適用することで、.obj ファイルに書き出すことができます。 ソロの適用では、次の 2 つの操作を実行します。
たとえば、次のコードは、ソロの適用方法を示した上で、次のスクリプト コマンドを使用してシェイプ キーを書き出します。
この例では、ほとんどのアクションの実行にスクリプト コマンドを使用しています。
# Setup a few Python-specific things from win32com.client import constants as c# so we can use Softimage constants app = Application # use pointer since we are using so many commands # Start by making a cone and deforming the topmost point app.NewScene( "", 0 ) obj = app.CreatePrim( "Cone", "MeshSurface" ) app.SetValue( "Context.ConstructionMode", 1 ) app.ActivateVertexSelTool() app.AddToSelection( "cone.pnt[1]", "ASITIS", 1 ) app.Translate( "cone.pnt[1]", -4.03443654541759, 4.44089209850063E-16, -3.46944695195361E-17, c.siRelative, c.siView, c.siObj, c.siXYZ ) # Now save a shape key on the cone app.SaveShapeKey( "cone.pnt[1]", "", "", 1, "", "", "", "", c.siShapeObjectReferenceMode ) app.SelectFilter( "object" ) app.SelectObj( "Mixer.Mixer_Shape_Track.Shape_ClusterClip" ) app.SetValue( "Mixer.Mixer_Shape_Track.Shape_ClusterClip.Mixer_Shape_Track1.ShapeKey_Clip.actionclip.weight", 0.52 ) app.SetKey( "Mixer.Mixer_Shape_Track.Shape_ClusterClip.Mixer_Shape_Track1.ShapeKey_Clip.actionclip.weight", 1, 0.52 ) # Solo the shape key app.Selection.SetAsText( obj.Name ) stack = obj.ActivePrimitive.ConstructionHistory for op in stack : if op.Type == "clustershapecombiner" : op.Parameters("ShowResult").Value = 1 #true op.Parameters("SoloIndex").Value = 1 #solo shape key # This is the equivalent using scripting commands: #app.SelectObj( "cone.polymsh.clustershapecombiner" ) #app.SetValue( "cone.polymsh.clustershapecombiner.ShowResult", 0 ) #app.SetValue( "cone.polymsh.clustershapecombiner.SoloIndex", 1 ) # Export the soloed geometry in an OBJ file sPath = XSIUtils.BuildPath( app.InstallationPath(c.siUserPath), "Data", "SoloExportDemo.obj" ) app.ObjExport( sPath )