モーフを使用する

モーフィングは、ある形状を別の形状へとシームレスに変化させます。形状間でモーフィングするには、モーフデータを含む Mesh リソースを使用します。

Kanzi はシェーダーを使用してモーフィングを可能にします。シェーダー を参照してください。

Kanzi でメッシュ間をモーフィングする前に、サードパーティツールで3Dモデルを作成し、それを Kanzi Studio にインポートする必要があります。

サードパーティツールでモーフィングしたいメッシュを作成する際、まずベースメッシュを作成します。ベースメッシュから、モーフィングしたいメッシュを形作ります。メッシュを作成する際には、次の点に注意してください。

  • すべてのメッシュは、同じ数の頂点とクラスターを持たなければなりません。

  • メッシュのトポロジーを変更しないでください。

モーフを追加する

Kanzi Studio プロジェクトにモーフを追加する前に、サードパーティツールでモーフを含む3Dモデルを作成し、それをgltf、glb、fbx、またはdae形式でエクスポートしてください。

Kanzi Studio プロジェクトにモーフを追加するには:

  1. Assets で、Import Assets をクリックし、モーフターゲット間でモーフさせたいモーフメッシュを使用する3Dモデルをインポートします。

    各モーフターゲットは、モーフベースシェイプの変形バージョンです。

    ../../_images/assets-import-assets.png

    モデルに法線を持たないメッシュが含まれている場合、Kanzi Studio は法線を生成することを提案します。Kanzi はライティング計算で法線を使用します。Kanzi Studio に法線を生成させない場合、メッシュはモーフベースメッシュの法線を使用します。モーフターゲット法線の使用 を参照してください。

    Kanzi Studio がモーフをインポートすると、次のものが作成されます:

    • Library > Meshes には、ベースの頂点データと差分モーフデータを含むメッシュがあります。

      ../../_images/library-morph-cube.png
    • Library > Materials and Textures で、プロジェクトにそのようなマテリアルタイプが含まれていない場合、モーフィングをサポートするマテリアルタイプを使用します。

      Kanzi Studio はこのマテリアルタイプを使用するマテリアルを作成し、モーフのベースメッシュがこれらのマテリアルを使用するように設定します。

      マテリアルタイプでは、Kanzi Studio がインポートされたモーフのメッシュ数に合わせて同時にアクティブなモーフターゲットの最大数を設定します。パフォーマンスを最適化するために、同時にアクティブなモーフターゲットの数を制限することができます。同時にアクティブなモーフターゲットの数を制限する を参照してください。

      ../../_images/library-morph-material-type.png
    • Prefabs では、Morph および Mesh リソースを使用する Model ノードを含む Scene プレハブがあります。

      Scene プレハブのコンテンツを Preview で表示するには、Prefabs でそのプレハブをダブルクリックします。

      Kanzi Studio はプレハブを新しい Preview タブで開き、そのプレハブのコンテンツを Preview に表示します。

      ../../_images/morph-composition.png
  2. Prefabs で、モーフデータを含む Mesh リソースを表示する Model ノードを選択します。Properties の Morphing プロパティで、Morph リソース内の各メッシュのウェイトを調整できます。

    この方法で、Morph の形状を制御します。

    値が大きいほど、Mesh は指定された形状に近づきます。Kanzi のモーフシェーダーはメッシュのベースチャンネルデータを使用し、すべての形状をベース形状に累積的に加算します。モーフ形状はベース形状からの差分として表現されるため、1 を超えるウェイトを使用したり、Morphing プロパティで複数の形状に高いウェイトを与えたりすると、表示上のエラーが発生する可能性があります。

    例えば、モーフの形状を変更するには、キーフレームアニメーションを使用します。モーフウェイトアニメーションを作成する を参照してください。

    ../../_images/prefabs-main-model.png ../../_images/properties-main-model-adjust-weights.png

モーフにターゲットを追加する

モーフさせる形状を追加するには、Model ノードの Morphing プロパティのドロップダウンを使用して、モーフに形状を追加します。モーフターゲットとして追加できるのは、Model に割り当てられた Mesh に関連付けられた形状の中からのみです。

Morph にターゲットを追加するには、

  1. モーフさせる Model ノードの Morphing プロパティで + Morph shape ボタンをクリックし、モーフに追加する形状を選択します。

    ../../_images/morph-targets-add.png
  2. モーフの一覧を並べ替えるには、Morphing プロパティでシェイプに関連付けられた上下の矢印を使用します。

    ../../_images/rearrange-morphing-property.png
  3. シェイプを削除するには、Morphing プロパティでシェイプに関連付けられた × ボタンを使用します。

    ../../_images/remove-morph-shape.png
  4. 最初からやり直して、すべてのシェイプをデフォルトのウェイトで追加するには、Morphing プロパティを削除し、+ ボタンを使用して再度追加します。

    ../../_images/remove-morphing-property.png ../../_images/add-morphing-property.png
  5. (オプション) Library > Materials and Textures > Material Types で、モーフのベースメッシュが使用する各マテリアルタイプを選択します。Properties の Preprocessor Definitions で、KANZI_SHADER_MORPH_TARGET_COUNT を、Kanzi が同時にアクティブにできるようにするモーフターゲットの数に設定します。

    ../../_images/library-vertex-phong-morph.png ../../_images/properties-morph-target-count-9.png

    スマートマテリアルを使用する場合、Kanzi はマテリアルに設定されているプロパティに基づいて Preprocessor Definitions を自動的に設定します。

    モーフを含む Mesh をインポートすると、Kanzi は適切なマテリアルを自動的に作成し、その Mesh に割り当てます。

    モーフデータ内のモーフシェイプの数が Morph Data Texture を使用せずに GPU のアトリビュートチャネル内に収まる場合は、Mesh のモーフデータ内のモーフターゲットの正確な数を使用する必要があり、KANZI_SHADER_MORPH_TARGET_COUNT を変更する必要はありません。同時にアクティブなモーフターゲットの数を制限する を参照してください。

  6. (オプション) グラフィックスドライバーが Mesh 内のモーフターゲットの数をサポートしていない場合は、Properties の Preprocessor Definitions で、KANZI_SHADER_USE_MORPH_DATA_TEXTURE を 1 に設定します。

    この方法で、マテリアルタイプがモーフデータテクスチャを使用できるようになります。データテクスチャを使用すると、任意の数のアクティブなモーフターゲットを同時に持つことができますが、パフォーマンスコストが伴います。

    ../../_images/properties-use-morph-data-texture-1.png

    Kanzi は、Morph Data Texture が必要かどうかを自動的に検出し、テクスチャを作成して Model に割り当てます。この場合、割り当てられたモーフターゲットの順序と数を変更すると、テクスチャがその場で変更されます。不要なモーフシェイプを削除することで、パフォーマンスコストを削減できます。同時にアクティブなモーフターゲットの数を制限する を参照してください。

モーフターゲット法線の使用

モーフメッシュを使用する 3D モデルを Kanzi Studio にインポートし、そのモデル内の一部のメッシュに法線がない場合、Kanzi Studio はモーフターゲットの法線を自動的に生成します。Kanzi は法線をライティング計算に使用します。

Kanzi Studio がモーフターゲット用に生成する法線は、モーフのベースシェイプの法線とは異なる可能性が高いため、アクティブにするモーフターゲットが増えるほど、その差によって誤差が蓄積されます。これにより、視覚的な品質が徐々に劣化する可能性があります。これを回避するため、Kanzi Studio はモーフターゲットの法線を生成する際に、ベースメッシュの法線も再生成します。

Kanzi Studio による法線の生成や変更を避けるには、3D 編集ソフトウェアからすべてのモーフシェイプの法線をエクスポートします。

ヒント

メッシュの法線を手動で生成するには、Library > Meshes でそのメッシュを右クリックし、Generate Normals を選択します。

../../_images/library-mesh-generate-normals.png

モーフターゲット法線の使用を制御する

モーフターゲット法線の使用を制御するには:

  1. Library > Materials and Textures > Materials Types で、モーフのベースメッシュが使用するマテリアルタイプを選択します。

    ../../_images/library-vertex-phong-morph.png
  2. Properties の Preprocessor Definitions で、KANZI_SHADER_USE_MORPH_TARGET_NORMALS の値を次のように設定します。

    • モーフターゲットをモーフベースメッシュの法線を使用するように設定するには、0にします。

    • 各モーフターゲットが独自の法線を使用するように設定するには、1にします。

    ../../_images/properties-use-morph-target-normals-1.png

同時にアクティブなモーフターゲットの数を制限する

Kanzi Studio にモーフを含む3Dモデルをインポートすると、Kanzi Studio はそのモーフをすべてのモーフターゲットを一度にアクティブ化できるマテリアルタイプを使用するように設定します。モーフに多数のターゲットが含まれている場合、Kanzi はモーフのターゲットの頂点属性をデータテクスチャに格納するように設定します。データテクスチャを使用すると、任意の数のモーフターゲットを一度にアクティブにすることができますが、パフォーマンスコストが伴います。モーフターゲットが一度にアクティブになるほど、頂点シェーダーの処理に時間がかかります。パフォーマンスを最適化するために、次のことができます。

  • 一度にアクティブにできるモーフターゲットの数を制限します。

  • データテクスチャの使用を無効にします。

データテクスチャがない場合、同時にアクティブなモーフターゲットの最大数は

\[N = floor((MaxChannels - ConstantChannels) / PerTargetChannels)\]

場所:

  • \(MaxChannels\) は、グラフィックスドライバーがサポートする頂点属性チャンネルの最大数です。

    たとえば、16。

  • \(ConstantChannels\) は、すべてのモーフターゲットに対して同じ属性データを含むチャンネルの数です。

    例えば、テクスチャ座標、ボーンウェイト、およびボーンインデックスは、すべてのモーフターゲットで同じです。

  • \(PerTargetChannels\) は、ターゲット固有の属性データを含むチャンネルの数です。

    例えば、頂点の位置、法線、接線は、各モーフターゲットごとに異なる場合があります。

Kanzi Studio は、実際のメッシュデータに基づいて動作モードを選択します。

  1. チャンネル数が少なく Morph Data Texture なしで使用できる場合、Kanzi は常にすべてのモーフデータチャンネルを使用します。シェイプを削除してもパフォーマンスには影響しません。選択されていないシェイプのウェイトは \(0.0\) です。

    • Library > Materials and Textures > Material Types で、モーフのベースメッシュが使用する各マテリアルタイプを選択します。Properties の Preprocessor Definitions で、KANZI_SHADER_USE_MORPH_DATA_TEXTURE を 0 に設定します。

      ../../_images/library-vertex-phong-morph.png ../../_images/properties-use-morph-data-texture-0.png
    • この場合は、KANZI_SHADER_MORPH_TARGET_COUNT が Mesh 内のモーフターゲットの正確な数に設定されていることを確認してください。そうでない場合、Kanzi Studio はモデルを赤いエラーマテリアルでレンダリングし、ログに警告を出力します。

      ../../_images/properties-morph-target-count-6.png
  2. モーフデータに Morph Data Texture の使用が必要になる可能性があるほど多くのチャネルがある場合、Kanzi は常にデータテクスチャを使用します。シェイプを削除するとパフォーマンスが向上し、データテクスチャが小さくなるため、メモリ要件が減少します。

    • Library > Materials and Textures > Material Types で、モーフのベースメッシュが使用する各マテリアルタイプを選択します。Properties の Preprocessor Definitions で、KANZI_SHADER_USE_MORPH_DATA_TEXTURE を 1 に設定します。

      ../../_images/library-vertex-phong-morph.png ../../_images/properties-use-morph-data-texture-1.png
    • メッシュデータ内の一部のモーフシェイプが不要な場合は、次の手順でパフォーマンスを最適化します。

      • Morphing プロパティのシェイプリストからそのシェイプを削除します。

      • Library > Materials and Textures > Material Types で、モーフのベースメッシュが使用する各マテリアルタイプを選択します。

      • Properties の Preprocessor Definitions で、KANZI_SHADER_MORPH_TARGET_COUNT を必要なモーフターゲットの数に設定します。

      ../../_images/remove-morph-shape.png ../../_images/properties-morph-target-count-9.png
  3. (オプション) どのような状況でも使用しないモーフターゲットがメッシュに含まれている場合は、3D 編集ソフトウェアでそれらのターゲットのエクスポートを無効にし、最初からエクスポートしないことをお勧めします。こうすることで、それらのモーフターゲットが Kanzi で使用されることは一切ありません。

モーフウェイトアニメーションを作成する

モーフの形状を変更するには、キーフレームアニメーションを使用します。モーフウェイトアニメーションは、gltf、glb、fbx、または dae ファイルからインポートするか、Kanzi Studio でアニメーションを作成することができます。

Kanzi Studio でモーフウェイトアニメーションを作成するには、

  1. Library > Animation Data で Alt を押しながら右クリック Animation Data を作成し、Animation を選択します。

    例えば、アニメーションに Middle Animation という名前を付け、Properties で設定します。

    • Target Property を Model3D.Morphing プロパティに設定し、ターゲットシェイプのインデックスを 1 に設定します。

    • Property Field から Whole property へ

    Animation Clip は、モーフ内のメッシュのキーフレームアニメーションを保持するために使用します。各アニメーションは特定のモーフシェイプをターゲットとし、さまざまな時点でのメッシュのウェイトを定義します。Middle Animation は、モーフィングする最初のメッシュのキーフレームアニメーションです。

    ../../_images/create-morph-animation.png ../../_images/middle-animation-target-property-add-morph-weight-adding.png ../../_images/middle-animation-properties.png
  2. アニメーション化する Mesh 内のターゲットシェイプの数だけ、前の手順を繰り返します。範囲インデックス n の各アニメーションについて、n を、そのアニメーションでウェイトを変更する Model 内のシェイプのインデックスに設定します。ベースメッシュにはアニメーションを追加しないでください。

    例えば、3つのメッシュでモーフをアニメーション化するには、2つのアニメーションを作成します。それらに Middle Animation と Ready Animation という名前を付け、次のように設定します。

    • Middle Animation の Target Property を Model3D.Morphing のインデックス 1 に設定

    • Ready Animation の Target Property を Model3D.Morphing のインデックス 2 に設定

    Middle Animation を使用して、モーフ内の2番目のメッシュの重みを設定します。Ready Animation を使用して、異なる時点でモーフ内の3番目のメッシュの重みを設定します。Kanzi モーフシェーダーは、最初のメッシュの重みを設定します。

    ../../_images/morph-animations-in-the-library.png ../../_images/middle-animation-properties.png ../../_images/ready-animation-properties.png

    注釈

    アニメーションデータ内のインデックスは、アニメーション化される Model3D 内のシェイプインデックスをターゲットとします。

    メッシュのモーフターゲット数が少なく Morph Data Texture を必要としない場合、これはモーフデータ内の正確なシェイプをターゲットにします。Morph Data Texture` を使用している場合、これは Morphing プロパティで選択したシェイプの順序と数によって決まります。

  3. 前のステップで作成したアニメーションのためにキーフレームを作成します。ターゲットプロパティフィールドのためのキーフレームアニメーションの作成 を参照してください。

    キーフレーム値を使用して、異なる時点でモーフ内のメッシュの Weight プロパティを設定します。

    値が大きいほど、Mesh は指定された形状に近づきます。Kanzi のモーフシェーダーはメッシュのベースチャンネルデータを使用し、すべての形状をベース形状に累積的に加算します。モーフ形状はベース形状からの差分として表現されるため、1 を超えるウェイトを使用したり、Morphing プロパティで複数の形状に高いウェイトを与えたりすると、表示上のエラーが発生する可能性があります。

    例えば、3 つのメッシュを持つモーフの 1 秒間のリニアアニメーションを作成するには、Library で Middle Animation をダブルクリックし、Animation Clip Editor で次のキーフレームを作成します。

    • Middle Animation:

      • 最初のキーフレーム:

        • Time を 0 に

        • Value を 0 に

      • 2番目のキーフレーム:

        • Time を0.5に

        • Value を 1 に

      • 3番目のキーフレーム:

        • Time を 1 に

        • Value を 0 に

      ../../_images/middle-animation-in-animation-clip-editor.png
    • Ready Animation:

      • 最初のキーフレーム:

        • Time を 0 に

        • Value を 0 に

      • 2番目のキーフレーム:

        • Time を0.5に

        • Value を 0 に

      • 3番目のキーフレーム:

        • Time を 1 に

        • Value を 1 に

      ../../_images/ready-animation-in-animation-clip-editor.png
    ../../_images/morph-animation-clip-in-animation-clip-editor.png
  4. 作成したキーフレームアニメーションでモーフをアニメーション化します。

    1. Node Tree で、Mesh プロパティがアニメーション化する Mesh に設定されている Model ノードを選択します。モーフを追加する を参照してください。

      ../../_images/model-in-the-project.png ../../_images/set-model-mesh-property.png
    2. Node Components で、Alt を押しながら右クリック Animation を選択し、Animation Player を選択します。

      ../../_images/triggers-add-animation-player.png
    3. Animation Player で作成した Node Components の中で、Target Animation Timeline プロパティを最初のステップで作成した Animation Clip に設定し、アニメーション再生を設定します。キーフレームアニメーションの再生 を参照してください。

      たとえば、以下を設定します。

      • Autoplay Enabled を有効にする

      • Playback Mode から Ping pong へ

      • Repeat Count Infinite を有効にする

      ../../_images/animation-player-target-animation-timeline-morph-animation-clip.png ../../_images/morph-animation.gif

APIでモーフを使用する

モーフタイムラインを手動で作成し、タイムラインクロックの再生を作成するには:

// Create float animation and add two keyframes.
FloatKeyframeAnimationSharedPtr morphAnimation =
    FloatKeyframeAnimation::create(domain);
morphAnimation->addLinearKeyframe(chrono::milliseconds(0), 0.0f);
morphAnimation->addLinearKeyframe(chrono::milliseconds(100), 1.0f);

// Create a range index animation timeline and apply it to the Morphing property of the current node.
RangeIndexAnimationTimelineSharedPtr rangeIndexTimeline =
    RangeIndexAnimationTimeline::create(domain, ".", Model3D::MorphingProperty);

// Animate the first morph target using the keyframe animation (this animation goes from weight zero to one).
rangeIndexTimeline->addEntry(0, PropertyFieldWhole, morphAnimation);

// Create range index animation timeline playback.
RangeIndexAnimationTimelinePlaybackSharedPtr playback =
    RangeIndexAnimationTimelinePlayback::create(rangeIndexTimeline, context);

関連項目

3D アセット (3D Assets)

3Dアセットのインポート

サードパーティツールで3Dアセットを準備する

メッシュの使用

メッシュベストプラクティス

マテリアルタイプとマテリアル

マテリアルタイプの使用

スマートマテリアルを使用する

アニメーション (Animations)

ターゲットプロパティフィールドのためのキーフレームアニメーションの作成

キーフレームアニメーションの使用

シェーダーを編集する

プロパティの優先順位