コンテンツにスキップ

nijigenerateシェル

Utataneでは、通常の伺かシェルと一緒にnijigenerateのパペットを任意で使用できます。 ほかのベースウェアでもシェルを使用できるよう、通常のsurface*.pngは残したまま、 次のファイルをシェルのディレクトリへ配置します。

  • puppet.inp: nijigenerateから書き出したパペット
  • nijigenerate.json: 表示範囲、サーフェス対応、マウス反応の設定

一通りの設定を含む nijigenerate.sample.jsonを雛形として利用できます。 パペットと同じ場所へコピーし、nijigenerate.jsonへ改名してください。

スコープ0では、puppet.inpとnicxliveランタイムの両方が見つかった場合に nijigenerateレンダラーを使用します。どちらかがなければ通常のシェル表示へ フォールバックします。

パペットにBody::RollとBody::Breathが存在する場合、待機中の揺れと呼吸を Utataneが自動で動かします。設定ファイル、サーフェス対応、マウス反応で明示した 値は自動値より優先されます。

{
"viewport": {
"width": 420,
"height": 720,
"contentScale": 0.96,
"contentOffsetX": 0,
"contentOffsetY": 0,
"interactionOffsetX": 0,
"interactionOffsetY": 0,
"interactionScaleX": 1,
"interactionScaleY": 1
},
"pointer": {
"xParameter": "Interaction::LookX",
"yParameter": "Interaction::LookY",
"centerX": 171,
"centerY": 155,
"rangeX": 150,
"rangeY": 145,
"response": 0.35,
"restoreMilliseconds": 180
},
"parameters": {
"Expression::Smile": 0
},
"surfaces": {
"105": {
"Expression::Smile": 1
}
},
"reactions": [
{
"event": "doubleClick",
"region": "Head",
"button": 0,
"transitionMilliseconds": 140,
"durationMilliseconds": 2500,
"restoreMilliseconds": 280,
"parameters": {
"Expression::Smile": 1
}
}
]
}

viewport.widthとviewport.heightは、拡大・縮小前のウィンドウサイズを ポイント単位で指定します。viewport.contentScaleは、変形時に制作用キャンバスの 外へ出るパーツのための余白です。contentOffsetXはパペットを右へ、 contentOffsetYは下へ移動します。既定値は順に420、720、0.96、0、0です。

interactionOffsetXとinteractionOffsetYでは、通常シェルの当たり判定を パペットへ個別に位置合わせできます。省略した場合は対応するcontentOffsetを 引き継ぎます。interactionScaleXとinteractionScaleYは、通常シェルの キャンバス左上を基準として当たり判定を拡大・縮小してからオフセットを適用します。 どちらの既定値も1です。

pointerは、通常シェルの元座標におけるカーソル位置をnijigenerateの2つの パラメータへ対応させます。centerXとcenterYの位置が値0になり、そこから rangeXとrangeYだけ離れると-1または1になります。Yの正方向は上です。 responseはマウス移動ごとの追従の滑らかさ、restoreMillisecondsはカーソルが 外れたあと正面へ戻る時間です。

dragは、指定したregion内から始まる左ドラッグを、2次元のparameterへ 渡します。そのドラッグ中はウィンドウを移動しません。rangeXとrangeYは、 パラメータ値が1になるまでの移動距離と向きを通常シェルの元座標で指定します。 左または上へ引いたときに値を増やす場合は負数にします。マウスを離すと restoreMillisecondsで指定した時間をかけて(0, 0)へ戻ります。

parametersには通常状態の値を指定します。surfacesの数値キーは、 SakuraScriptのサーフェスIDをパラメータ値へ対応させます。

reactionsで使用できるeventは、down、up、click、doubleClick、 multipleClick:N、enter、leave、hover、move、dragStart、dragEndです。 moveは、同じ当たり判定上をカーソルで撫でている間に発生します。regionは 通常シェルの当たり判定名と大文字・小文字を区別せずに照合します。省略した場合は すべての領域に一致します。buttonはAppKitのマウスボタン番号で、省略も可能です。

Utataneが操作できるのは、書き出したパペットに存在するパラメータだけです。 待機用の2つを除き、パラメータ名は設定ファイルで変更できます。最小構成として、 次のパラメータがあると便利です。

  • Body::Roll: 範囲-1〜1。待機中の左右の揺れ
  • Body::Breath: 範囲0〜1。待機中の呼吸
  • Interaction::Pet: 範囲0〜1。当たり判定を撫でたときの変形
  • Interaction::Cheek: 2次元で範囲0〜1。頬を引っぱったときの変形
  • 表情用パラメータ: 範囲0〜1。サーフェス対応やマウス反応に使用
  • 任意でInteraction::LookXとInteraction::LookY: 範囲-1〜1。視線追従

アニメーションを作ったあとでパーツを別ノードへ分離した場合、必要に応じて 元の親と同じBody::RollおよびBody::Breathの割り当てを追加してください。 たとえば前髪だけを分離して割り当てを直さないと、待機アニメーション中に頭から ずれて見えます。

簡単な髪撫で反応では、Interaction::Pet = 1に前髪の小さな変形を割り当て、 move反応から表情と一緒に有効化します。指定した通常シェルの当たり判定内で カーソルを動かし続けると反応が維持され、動きを止めると通常状態へ戻ります。

nicxliveをビルドまたはインストールし、書き出したパペットの隣へ設定ファイルを 配置します。外部パペットはシェルへコピーせず、次のように確認できます。

ターミナルウィンドウ
UTATANE_NIJIGENERATE_PUPPET=/absolute/path/to/puppet.inp \
UTATANE_NICXLIVE_LIBRARY=/absolute/path/to/libnicxlive.dylib \
/absolute/path/to/Utatane.app/Contents/MacOS/Utatane

外部パペットを指定した場合も、当たり判定とフォールバック表示には選択中の ゴーストの通常シェルを使用します。反応を調整する前に、Utataneの当たり判定表示を 使ってinteractionOffsetX、interactionOffsetY、interactionScaleX、 interactionScaleYを合わせてください。

pointerブロックは任意です。視線や顔をカーソルへ追従させない場合は、設定から 削除できます。髪撫でなど、当たり判定を使った反応はそのまま動作します。