Morph リソースの使用¶
モーフィングは、シームレスな遷移で形状を別の形状に変換します。メッシュ間のモーフィングには、Morph リソースを使用してください。
Kanzi はシェーダーを使用してモーフィングを可能にします。シェーダー を参照してください。
Kanzi でメッシュ間をモーフィングする前に、サードパーティツールで3Dモデルを作成し、それを Kanzi Studio にインポートする必要があります。
サードパーティツールでモーフィングしたいメッシュを作成する際、まずベースメッシュを作成します。ベースメッシュから、モーフィングしたいメッシュを形作ります。メッシュを作成する際には、次の点に注意してください。
すべてのメッシュは、同じ数の頂点とクラスターを持たなければなりません。
メッシュのトポロジーを変更しないでください。
モーフを追加する¶
Kanzi Studio プロジェクトにモーフを追加する前に、サードパーティツールでモーフを含む3Dモデルを作成し、それをgltf、glb、fbx、またはdae形式でエクスポートしてください。
Kanzi Studio プロジェクトにモーフを追加するには:
Assets で、Import Assets をクリックし、モーフターゲット間でモーフさせたいモーフメッシュを使用する3Dモデルをインポートします。
各モーフターゲットは、モーフベースシェイプの変形バージョンです。
モデルに法線を持たないメッシュが含まれている場合、Kanzi Studio は法線を生成することを提案します。Kanzi はライティング計算で法線を使用します。Kanzi Studio に法線を生成させない場合、メッシュはモーフベースメッシュの法線を使用します。モーフターゲット法線の使用 を参照してください。
Kanzi Studio がモーフをインポートすると、次のものが作成されます:
Library > Meshes では、3Dモデルからのメッシュと、インポートされたメッシュを使用する Morph リソースがあります。
Library > Materials and Textures で、プロジェクトにそのようなマテリアルタイプが含まれていない場合、モーフィングをサポートするマテリアルタイプを使用します。
Kanzi Studio はこのマテリアルタイプを使用するマテリアルを作成し、モーフのベースメッシュがこれらのマテリアルを使用するように設定します。
マテリアルタイプでは、Kanzi Studio がインポートされたモーフのメッシュ数に合わせて同時にアクティブなモーフターゲットの最大数を設定します。パフォーマンスを最適化するために、同時にアクティブなモーフターゲットの数を制限することができます。同時にアクティブなモーフターゲットの数を制限する を参照してください。
Prefabs では、Morph および Mesh リソースを使用する Model ノードを含む Scene プレハブがあります。
Scene プレハブのコンテンツを Preview で表示するには、Prefabs でそのプレハブをダブルクリックします。
Kanzi Studio はプレハブを新しい Preview タブで開き、そのプレハブのコンテンツを Preview に表示します。
Prefabs で、Morph リソースを表示する Model ノードを選択します。Morph Target Weights プロパティの Properties で、Morph リソース内の各メッシュの重みを調整できます。
この方法で、Morph の形状を制御します。
値が高いほど、Morph はそのメッシュの形状に近づきます。Kanzi モーフシェーダーは、Morph Target Weights の合計が1になるようにベースモーフ形状の重みを設定します。これにより、結果として得られる形状のスケールがターゲット形状に忠実に保たれます。
例えば、モーフの形状を変更するには、キーフレームアニメーションを使用します。モーフウェイトアニメーションを作成する を参照してください。
モーフにターゲットを追加する¶
モーフィングしたい形状を追加するには、メッシュを Morph に追加します。
モーフィングが正しく機能するためには、次の条件を満たすメッシュのみを追加してください。
同じベースメッシュから形成されます。
同じトポロジーと同じ数の頂点およびクラスターを持つ。
Morph にターゲットを追加するには、
Library > Meshes で、Morph リソースを作成または選択します。
Morph Target Weights プロパティの Properties で:
Add をクリックします。ドロップダウンメニューで、Morph にターゲットとして追加したいメッシュを選択し、メッシュの重みを調整します。値が高いほど、モーフがそのメッシュの形状に近づきます。
前のステップを繰り返して、モーフィングしたいすべてのモーフターゲットを追加します。
Library > Materials and Textures > Material Types で、モーフのベースメッシュが使用する各マテリアルタイプを選択します。Properties の Preprocessor Definitions で、KANZI_SHADER_MORPH_TARGET_COUNT を Kanzi が一度にアクティブにできるモーフターゲットの数に設定します。
スマートマテリアルを使用する場合、Kanzi はマテリアルに設定されているプロパティに基づいて Preprocessor Definitions を自動的に設定します。
モーフが KANZI_SHADER_MORPH_TARGET_COUNT の値よりも多くのターゲットを持つ場合、Kanzi は自動的に最も重みの大きいモーフターゲットをアクティベーション用に選択します。
(オプション) グラフィックスドライバーが設定したモーフターゲットの数をサポートしていない場合:
Properties の Preprocessor Definitions で、KANZI_SHADER_USE_MORPH_DATA_TEXTURE を 1 に設定します。
この方法で、マテリアルタイプがモーフデータテクスチャを使用できるようになります。データテクスチャを使用すると、任意の数のアクティブなモーフターゲットを同時に持つことができますが、パフォーマンスコストが伴います。
Library > Meshes で、Morph リソースを選択します。Properties で、Morph > Export as Data Texture プロパティを追加して有効にします。
モーフターゲット法線の使用¶
Kanzi Studio にモーフメッシュを使用する3Dモデルをインポートする際、そのモデル内の一部のメッシュに法線がない場合、Kanzi Studio は法線を生成することを提案します。Kanzi はライティング計算で法線を使用します。インポート時に Kanzi Studio に欠落している法線を生成させない場合、モーフターゲットは自動的にモーフベースメッシュの法線を使用します。
ヒント
メッシュの法線を手動で生成するには、Library > Meshes でそのメッシュを右クリックし、Generate Normals を選択します。
モーフターゲット法線の使用を制御する¶
モーフターゲット法線の使用を制御するには:
Library > Materials and Textures > Materials Types で、モーフのベースメッシュが使用するマテリアルタイプを選択します。
Properties の Preprocessor Definitions で、KANZI_SHADER_USE_MORPH_TARGET_NORMALS の値を次のように設定します。
モーフターゲットをモーフベースメッシュの法線を使用するように設定するには、0にします。
各モーフターゲットが独自の法線を使用するように設定するには、1にします。
生成されたモーフターゲット法線の改善¶
Kanzi Studio がモーフターゲット用に生成する法線がモーフベースシェイプの法線と異なる場合、より多くのモーフターゲットをアクティブにするにつれて、その差が蓄積されます。これにより、法線における段階的な視覚的劣化が発生する可能性があります。
生成されたモーフターゲットの法線を改善するには、
Library > Materials and Textures > Materials Types で、モーフのベースメッシュが使用するマテリアルタイプを選択します。
Properties の Preprocessor Definitions で、KANZI_SHADER_USE_MORPH_NORMAL_LIMIT の値を 1 に設定します。
これは、法線の差を単一のターゲット形状によって引き起こされるものに制限します。
同時にアクティブなモーフターゲットの数を制限する¶
Kanzi Studio にモーフを含む3Dモデルをインポートすると、Kanzi Studio はそのモーフをすべてのモーフターゲットを一度にアクティブ化できるマテリアルタイプを使用するように設定します。モーフに多数のターゲットが含まれている場合、Kanzi はモーフのターゲットの頂点属性をデータテクスチャに格納するように設定します。データテクスチャを使用すると、任意の数のモーフターゲットを一度にアクティブにすることができますが、パフォーマンスコストが伴います。モーフターゲットが一度にアクティブになるほど、頂点シェーダーの処理に時間がかかります。パフォーマンスを最適化するために、次のことができます。
一度にアクティブにできるモーフターゲットの数を制限します。
データテクスチャの使用を無効にします。
データテクスチャがない場合、同時にアクティブなモーフターゲットの最大数は
場所:
\(MaxChannels\) は、グラフィックスドライバーがサポートする頂点属性チャンネルの最大数です。
たとえば、16。
\(ConstantChannels\) は、すべてのモーフターゲットに対して同じ属性データを含むチャンネルの数です。
例えば、テクスチャ座標、ボーンウェイト、およびボーンインデックスは、すべてのモーフターゲットで同じです。
\(PerTargetChannels\) は、ターゲット固有の属性データを含むチャンネルの数です。
例えば、頂点の位置、法線、接線は、各モーフターゲットごとに異なる場合があります。
パフォーマンスを最適化するために、\(N\) 以上のターゲットを一度にモーフでアクティブにする必要がない場合は、データテクスチャの使用を無効にしてください。
モーフがデータテクスチャを使用しない場合、同時にアクティブにできるのは、最も大きなウェイトを持つ \(N\) ターゲットのみです。
同時にアクティブなモーフターゲットの数を制限するには:
Library > Materials and Textures > Material Types で、モーフのベースメッシュが使用する各マテリアルタイプを選択します。Properties の Preprocessor Definitions で、KANZI_SHADER_MORPH_TARGET_COUNT を Kanzi が一度にアクティブにできるモーフターゲットの数に設定します。
モーフが KANZI_SHADER_MORPH_TARGET_COUNT の値よりも多くのターゲットを持つ場合、Kanzi は自動的に最も重みの大きいモーフターゲットをアクティベーション用に選択します。
(オプション) グラフィックスドライバがデータテクスチャを使用せずにサポートする値に KANZI_SHADER_MORPH_TARGET_COUNT を設定する場合、データテクスチャを無効にします。
Library > Materials and Textures > Material Types で、モーフのベースメッシュが使用する各マテリアルタイプを選択します。Properties の Preprocessor Definitions で、KANZI_SHADER_USE_MORPH_DATA_TEXTURE を 0 に設定します。
これを行う場合は、KANZI_SHADER_MORPH_TARGET_COUNT がデータテクスチャを使用せずにグラフィックスドライバがサポートする値に設定されていることを確認してください。そうでないと、Kanzi Studio はモデルを赤いエラーマテリアルでレンダリングし、ログに警告を出力します。
Library > Meshes で、Morph リソースを選択します。Properties で、Export as Data Texture プロパティを無効にするか削除します。
モーフウェイトアニメーションを作成する¶
モーフの形状を変更するには、キーフレームアニメーションを使用します。モーフウェイトアニメーションは、gltf、glb、fbx、または dae ファイルからインポートするか、Kanzi Studio でアニメーションを作成することができます。
Kanzi Studio でモーフウェイトアニメーションを作成するには、
Library > Animations で Alt を押しながら右クリック をクリックし、Animation Clip を選択してから Animation を選択します。
例えば、アニメーションに Middle Animation という名前を付け、Properties で設定します。
Target Property から <Expression> へ、
をクリックして Morph Weight プロパティを追加し、それを <MorphWeight>[1] に設定します。Property Field から Whole property へ
Animation Clip は、モーフ内のメッシュのキーフレームアニメーションを保持するために使用します。各アニメーションはモーフ内の特定のメッシュをターゲットとし、さまざまな時点におけるメッシュのウェイトを定義します。Middle Animation は、モーフさせたい最初のメッシュのキーフレームアニメーションです。
Morph にアニメーションさせたいターゲットシェイプがある限り、前のステップを繰り返します。<MorphWeight>[n] の各アニメーションに対して、アニメーションで重みを変更したい Morph のメッシュにnを設定します。ベースメッシュにはアニメーションを追加しないでください。
例えば、3つのメッシュでモーフをアニメーション化するには、2つのアニメーションを作成します。それらに Middle Animation と Ready Animation という名前を付け、次のように設定します。
Middle Animation Target Property から <Expression> <MorphWeight>[1] へ
Ready Animation Target Property から <Expression> <MorphWeight>[2] へ
Middle Animation を使用して、モーフ内の2番目のメッシュの重みを設定します。Ready Animation を使用して、異なる時点でモーフ内の3番目のメッシュの重みを設定します。Kanzi モーフシェーダーは、最初のメッシュの重みを設定します。
前のステップで作成したアニメーションのためにキーフレームを作成します。ターゲットプロパティフィールドのためのキーフレームアニメーションの作成 を参照してください。
キーフレーム値を使用して、異なる時点でモーフ内のメッシュの Weight プロパティを設定します。
値が高いほど、Morph はそのメッシュの形状に近づきます。Kanzi モーフシェーダーは、Morph Target Weights の合計が1になるようにベースモーフ形状の重みを設定します。これにより、結果として得られる形状のスケールがターゲット形状に忠実に保たれます。
例えば、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 に
Ready Animation:
最初のキーフレーム:
Time を 0 に
Value を 0 に
2番目のキーフレーム:
Time を0.5に
Value を 0 に
3番目のキーフレーム:
Time を 1 に
Value を 1 に
作成したキーフレームアニメーションでモーフをアニメーション化します。
Node Tree で、アニメーションさせたい Morph に設定されている Mesh プロパティを持つ Model ノードを選択します。モーフを追加する を参照してください。
Node Components で、Alt を押しながら右クリック Animation を選択し、Animation Player を選択します。
Animation Player で作成した Node Components の中で、Target Animation Timeline プロパティを最初のステップで作成した Animation Clip に設定し、アニメーション再生を設定します。キーフレームアニメーションの再生 を参照してください。
たとえば、以下を設定します。
Autoplay Enabled を有効にする
Playback Mode から Ping pong へ
Repeat Count Infinite を有効にする
APIでモーフを使用する¶
モーフタイムラインを手動で作成し、タイムラインクロックの再生を作成するには:
// Create morph and add meshes (created beforehand) into it.
MorphSharedPtr morph = Morph::create(domain, "testMorph");
morph->add(mesh1, 0.0f);
morph->add(mesh2, 1.0f);
// Add node that will hold the morph, then add it to the scene graph (scene).
Model3DSharedPtr model = Model3D::create(domain, "testSphere");
model->setMesh(morph);
scene->addChild(model);
// Create float animation and add two keyframes.
FloatKeyframeAnimationSharedPtr animation = FloatKeyframeAnimation::create(domain);
animation->addLinearKeyframe(chrono::milliseconds(0), 0.0f);
animation->addLinearKeyframe(chrono::milliseconds(100), 1.0f);
// Create timeline and playback.
MorphWeightTimelineSharedPtr morphTimeline = MorphWeightTimeline::create(domain, "testSphere", 1, animation);
SceneGraphTimelinePlaybackContext context(*scene);
TimelinePlaybackSharedPtr playback = morphTimeline->createPlayback(context);
// Add playback to root clock
domain->getRootTimelineClock()->addTimelinePlayback(playback);
詳細については、Morph クラスを参照してください。