フィルタプラグイン

胸揺れ

概要

画像の一部分をオブジェクト移動に合わせて柔らかく揺らすフィルター

詳細説明

Shake_PPP(胸揺れ)

Shake_PPPは、AviUtl2の画像オブジェクトの一部を、移動に少し遅れて揺れる柔らかい領域として変形するフィルタープラグインです。

画像上で「動かす範囲」と「最も大きく動く範囲」をベジェ曲線で指定し、画像オブジェクトのX/Y移動から揺れを自動生成します。胸、髪、衣服、柔らかい装飾など、画像の一部分だけを揺らす用途を想定しています。

重要

現在は開発中です。仕様や保存形式が変更される可能性があります。重要なプロジェクトでは、編集前にバックアップを作成してください。

関連リンク

動作の仕組み

  • 外周:変形させる領域の境界です。外周の外側は動きません。
  • 重心・頂点範囲:最も大きく動く内側の領域です。
  • 外周から重心範囲までの間は、変位量が滑らかにつながるように補間されます。
  • AviUtl2から取得した画像オブジェクトのX/Y座標をフレームごとに比較し、移動方向と移動量から遅れ、行き過ぎ、戻りを計算します。
  • 形状セット1と2を使うと、1つの画像内に独立した変形範囲を2組設定できます。

必要環境

  • Windows 64-bit
  • AviUtl2(SDK v2.13の画像パラメータ取得APIに対応したバージョン)
  • 画像オブジェクト

現在の実装は画像オブジェクトのX/Y移動を対象とします。回転、拡大率、中心座標の変化は揺れの入力として使用しません。

インストール

配布されたShake_PPP.auf2を次の場所へ配置します。

C:\ProgramData\aviutl2\Plugin\Shake_PPP\Shake_PPP.auf2

AviUtl2を起動中の場合は、終了してからファイルを更新してください。配置後にAviUtl2を起動し、画像オブジェクトへ胸揺れフィルターを追加します。

最短の設定手順

  1. タイムラインへ画像オブジェクトを配置します。
  2. 画像オブジェクトへ胸揺れフィルターを追加します。
  3. 対象画像がプレビューに表示されているフレームへ再生位置を移動します。
  4. フィルターの設定を押します。
  5. 形状セット1と外周を編集を選び、揺らしたい部分の外側を左クリックで囲みます。
  6. 最初の頂点をダブルクリックして外周を閉じます。
  7. 重心・頂点範囲を編集を選び、最も大きく動かしたい内側の範囲を囲んで閉じます。
  8. 膨らみプレビューまたは動作プレビューで形状を確認します。
  9. 設定画面を閉じて形状を保存します。
  10. AviUtl2の標準描画などで画像オブジェクトのX/Yを動かし、再生しながら揺れ設定を調整します。

外周と重心範囲は、どちらも閉曲線にする必要があります。

形状設定画面

ツールバー

項目 内容
形状セット1 / 2 編集・プレビューする変形範囲を切り替えます。2組の形状は独立して保存されます。
外周を編集 変形領域の外側を編集します。
重心・頂点範囲を編集 最も大きく動く内側の範囲を編集します。
動作プレビュー 左ドラッグの画像移動を入力として、戻りを含む揺れを確認します。
鋭角頂点 選択中の頂点、またはこれから追加する頂点を鋭角にします。
滑らかな頂点 選択中の頂点、またはこれから追加する頂点を滑らかなベジェ接続にします。
元画像 変形前の画像を表示します。
膨らみプレビュー 上部のプレビュー膨張量とAviUtl2側の膨張中心X/Yを使った静的な膨らみ結果を表示します。
全体表示 画像全体が画面内に収まる倍率と位置へ戻します。

マウス操作

操作 動作
空所を左クリック 現在選択している種類の頂点を追加します。
頂点を左ドラッグ 頂点を移動します。
頂点を右クリック 頂点を削除します。
最初の頂点をダブルクリック 曲線を閉じます。
最後の頂点をダブルクリック 曲線を開きます。
最後の頂点を最初の頂点へドラッグ 最後の重複頂点を取り除き、曲線を閉じます。
閉じている接続線を右クリック 曲線を開きます。
空所を右ドラッグ 揺れを発生させず、画像の表示位置だけを移動します。
中ボタンドラッグ 画像の表示位置を移動します。
マウスホイール 表示を拡大・縮小します。
動作プレビュー中に左ドラッグ 画像を移動させ、その動きで変形範囲を揺らします。

閉じた曲線の先頭は二重の四角い輪郭で表示されます。閉じる区間はマゼンタ色です。

外周可変の範囲を指定するには、閉じた外周の頂点を選び、その近くに表示されるSで開始点を設定します。別の頂点を選んでEを押すと、開始点と終了点の間が緑色の可動区間になります。反対側の区間を動かしたい場合はRで反転します。浮動メニューには青色の滑らかなベジェ接続と赤色の鋭角への切替もあり、上部ツールバーと選択状態が同期します。浮動メニューは選択点を隠さない位置へ表示され、画面端ではプレビュー範囲内へ自動的に移動します。開始点・終了点を指定していない旧データでは、従来どおり外周全体が追従します。

形状を作るコツ

  • 外周は対象物の輪郭より少し内側に置くと、周囲の背景を巻き込みにくくなります。
  • 重心範囲は小さくしすぎず、形を保ったまま動かしたい厚みのある部分を囲みます。
  • 外周と重心範囲が近すぎると急激な変形になり、離すほど広い範囲でなだらかに変形します。
  • 頂点を増やしすぎると編集が難しくなるため、まず少ない滑らかな頂点で形を作り、必要な場所だけ追加します。
  • 角を残したい場所だけ鋭角頂点を使用し、それ以外は滑らかな頂点を推奨します。
  • 2か所を別々に設定する場合は、形状セット1と2の外周が大きく重ならないようにします。

保存について

設定画面は、タイトルバーの閉じる操作を含め、閉じると現在の形状を保存します。現在は設定画面内のキャンセル、元に戻す、やり直す機能はありません。

形状はフィルターの形状データ項目へ保存され、AviUtl2プロジェクトと一緒に読み込まれます。形状データは内部用の文字列なので、通常は直接編集しないでください。

AviUtl2側の設定

設定項目は揺れ、膨らみ、膨らみの表示へ分けて表示します。

揺れ

設定 範囲 / 初期値 内容
変形タイプ 外周固定・外周可変 / 外周固定 外周固定は輪郭を保ったまま内部を膨張・揺らします。外周可変は外周も最大変形の35%追従させます。膨張時は形状設定画面で指定した可動区間だけを追従させ、未指定の場合は従来どおり外周全体を追従させます。
時間軸計算 ON / ON ONでオブジェクト移動から揺れを計算します。現在の実装ではOFFにすると実映像の揺れ変形を停止します。
揺れの強さ 0~100% / 50% オブジェクトの移動を揺れへ伝える強さです。
動きの遅れ 0~100% / 50% 本体の動きに対して柔らかい部分が残る量です。大きいほど移動直後の変形が強くなります。
やわらかさ 0~100% / 50% 元の形へ戻すばねの性質を調整します。大きいほど戻りがゆっくりになります。
揺れの長さ 0~100% / 50% 揺れの残りやすさを調整します。大きいほど減衰しにくくなります。
最大変形量 0~100px / 50px 大きな移動時の変形量を制限し、画像の破綻を抑えます。
横方向 0~100% / 50% 横方向の変形だけを増減します。0%で横揺れを止めます。
縦方向 0~100% / 50% 縦方向の変形だけを増減します。0%で縦揺れを止めます。

形状セット1と2では外周と重心範囲だけが独立しています。上表の揺れ設定は2組で共通です。

膨らみ

以下は膨らみ機能の形状パラメーターです。設定画面の膨らみプレビューと実映像へ反映します。実映像では形状セット1・2の膨張を順に適用した後、既存の揺れ変形を適用します。膨張量100%では膨張処理を省略します。設定画面のプレビューは外周固定で表示し、実映像では変形タイプが外周可変の場合に、形状設定画面で指定した開始点から終了点までの外周区間だけ膨張範囲自体も拡大・縮小します。区間端は滑らかにつながり、外周の合成範囲は変形ウェイトから独立して移動するため、対象画像の縁取りも膨張先へ維持されます。外周が入力画像の端へ達した部分は画像範囲内でクリップされます。

設定画面上部のプレビュー膨張量は0~200%の範囲で一時的に変更できます。設定画面を開いたときはAviUtl2側の膨張量で初期化されますが、設定画面内で変更した値はAviUtl2側へ書き戻されません。100%に戻すで元画像と同じ倍率へ戻せます。

設定 範囲 / 初期値 内容
膨張量 0~200% / 100% 100%で元画像、100%超で膨張、100%未満で収縮します。
膨らみ方 0~100% / 50% 0%で中心へ集中し、50%で標準、100%で外周近くまで広くなだらかに変形します。
膨張中心X -100~100% / 0% 膨張中心を外周幅の半分を基準として移動します。左右一対の形状として、形状セット1は設定方向、形状セット2はXの符号を反転した方向へ移動します。
膨張中心Y -100~100% / 0% 膨張中心を外周高さの半分を基準として上下へ移動します。
重力 0~100% / 0% 方向側の膨らみを強め、範囲内部をその方向へたわませます。外周を固定する方向には影響しません。0%では均等な膨張です。
重力方向 -180~180度 / 90度 0度は右、90度は下、-90度は上、±180度は左です。
質量 0~100% / 50% 大きいほど重力方向への偏りとたわみが強くなります。重力0%では影響しません。
張力 0~100% / 50% 大きいほど重力変形へ抵抗し、均等な膨らみに近づきます。重力0%では影響しません。

膨らみの表示

透明度連動量、陰影強度、光源方向、ハイライト強度は設定プレビューと実映像へ反映されます。透明度連動は局所的な膨張倍率から面積変化を近似し、伸びた部分のアルファ値を下げ、縮んだ部分のアルファ値を上げます。陰影とハイライトは変形ウェイトを疑似高さとして法線を求め、光源方向に応じて斜面のRGBを補正します。各強度0%では該当する表示補正を行いません。

設定 範囲 / 初期値 内容
透明度連動量 0~100% / 0% 膨張部分を薄く、収縮部分を厚く見せるアルファ補正の強さです。
陰影強度 0~100% / 0% 疑似高さの斜面へ加える明暗の強さです。アルファ値は変更しません。
光源方向 -180~180度 / -135度 0度は右、90度は下、-90度は上、±180度は左から照らします。
ハイライト強度 0~100% / 0% 光源を反射する位置へ白色の光沢を加えます。アルファ値は変更しません。

調整の目安

揺れが弱い

  1. 揺れの強さを上げます。
  2. 動きの遅れを上げます。
  3. 必要な方向の横方向または縦方向を上げます。
  4. 最大変形量が低すぎないか確認します。

揺れは座標そのものではなく、フレーム間の座標差から発生します。同じ距離でもゆっくり移動すると弱く、短時間で大きく移動すると強くなります。

揺れが長く残りすぎる

  • 揺れの長さを下げます。
  • やわらかさを下げ、元へ戻る力を強めます。

形が崩れすぎる

  • 最大変形量を下げます。
  • 揺れの強さまたは方向別の影響率を下げます。
  • 重心範囲を広げ、外周との間に十分な幅を取ります。

トラブルシューティング

設定画面に画像が表示されない

  • タイムラインの再生位置が対象画像オブジェクトの表示区間内にあるか確認します。
  • AviUtl2のプレビューを一度更新してから設定を開き直します。
  • フィルターより前の段階で画像サイズが0になっていないか確認します。

変形プレビューが表示されない

  • 選択中の形状セットで、外周と重心範囲の両方が閉じているか確認します。
  • 外周と重心範囲にそれぞれ3個以上の頂点があるか確認します。
  • 重心範囲が外周の内側にあるか確認します。

再生しても揺れない

  • 時間軸計算がONか確認します。
  • 揺れの強さ、横方向、縦方向が0になっていないか確認します。
  • 画像オブジェクトの標準描画X/Yがフレーム間で変化しているか確認します。
  • フィルターオブジェクトなど、画像座標を取得できない対象では自動揺れは動作しません。
  • 大きなシーク、逆再生、長いフレーム飛びでは異常な揺れを防ぐため履歴がリセットされます。通常再生で確認してください。

外周の外側まで動いて見える

  • 外周が正しく閉じているか確認します。
  • 半透明の髪や影など、元画像の画素自体が外周をまたいでいないか確認します。
  • 2つの形状セットの外周が重なっていないか確認します。

現在の制限

  • 揺れ入力はX/Y移動のみです。回転、拡大率、中心座標には追従しません。
  • 形状編集画面にキャンセル、元に戻す、やり直す機能はありません。
  • 形状セットは最大2組です。
  • 大きなフレーム飛びや逆再生では物理履歴を初期化します。
  • 膨らみ機能では形状・重力・透明度・陰影・ハイライトの全設定を処理します。
  • 側面用の専用変形モデルや壁接続範囲は未実装です。

開発者向けビルド

Delphi 37.0でWin64を対象にビルドします。DebugとReleaseの両構成があります。SDK型定義、フィルター設定項目の登録、オブジェクト情報取得はD:\DelphiProg\Syncroh2の共通ユニットを参照するため、Shake_PPPとSyncroh2を同じ親フォルダーに配置してください。

cmd /c 'call "C:\Program Files (x86)\Embarcadero\Studio\37.0\bin\rsvars.bat" && msbuild "D:\DelphiProg\Shake_PPP\Shake_PPP.dproj" /t:Build /p:Config=Debug /p:Platform=Win64'

ビルド後、プラグインは次の場所へコピーされます。AviUtl2が起動中だとファイルを更新できないため、ビルド前に終了してください。

C:\ProgramData\aviutl2\Plugin\Shake_PPP\Shake_PPP.auf2

Debugビルドでは診断ログを次の場所へ出力します。Releaseビルドではログを出力しません。

C:\ProgramData\aviutl2\Plugin\Shake_PPP\Shake_PPP_debug.log

実映像の負荷は約1秒ごとのRuntime performance:行で確認できます。avgMs内のbulge1・bulge2は形状セットごとの膨らみ、shake1・shake2は揺れ、totalは画像取得と書き戻しを含む合計時間です。行末のdisplayには、その区間で使われた透明度連動・陰影・ハイライトの設定値が記録されます。各項目を0%と100%で切り替え、同じ解像度・同じ外周範囲で数秒ずつ再生すると差を比較できます。

PowerShellでログを追跡する場合は次を実行します。

Get-Content -LiteralPath 'C:\ProgramData\aviutl2\Plugin\Shake_PPP\Shake_PPP_debug.log' -Tail 20 -Wait

GPU処理(第一段階)

入力画像をD3D11テクスチャとして取得できる環境では、膨らみと揺れをCompute Shaderで実行します。膨張量、膨らみ方、膨張中心、重力、質量、張力、透明度連動、陰影、光源方向、ハイライト、2形状セットに加え、固定外周・可変外周の膨張と揺れへ対応します。膨らみの表示補正と揺れはGPU作業テクスチャ上で連続処理し、最後に一度だけRGBA8へ変換して読み戻し、AviUtl2のSetImageDataへ渡します。膨張量100%の揺れ単独フレームもGPU経路を使用します。

GPU初期化、テクスチャ形式、リソース作成、読戻しのいずれかに失敗した場合もCPU処理へ自動的に戻ります。追加ランタイムは不要で、コンパイル済みHLSLをプラグインリソースへ埋め込んでいます。DebugログのRuntime GPU bulge path enabled.でGPU経路の採用、Runtime GPU bulge fallback:でCPUへ戻った理由、Runtime GPU performance:でGPU完了待ちと読戻しを含むCPU側の往復時間を確認できます。

膨らみと揺れの全GPU経路が採用された場合はRuntime GPU bulge + shake path enabled.、揺れ単独ではRuntime GPU shake path enabled.とDebugログへ記録されます。

Tests\GpuBulgeTest.dprはD3D11 WARPデバイス上でCompute Shaderを実行し、GPU版とCPU版の画素差を検証します。

配布ZIPの作成

Release Win64をビルドした後、次のバッチを実行します。

Setup\make_release_zip.bat

Setup\Shake_PPP.zipが生成されます。ZIPには、インストーラーがそのままプラグインフォルダーへコピーできるShake_PPPフォルダーが入り、その中にShake_PPP.auf2とREADME.mdが含まれます。Debug用のDLLまたはRSMが配備先に残っている場合は、Debug版の誤配布を防ぐためZIPを生成しません。