バスについてのTips
https://scrapbox.io/files/67b8533c22600ecede0d2f43.png
https://scrapbox.io/files/67b85f1c4a1c7e12a80095d2.png
https://scrapbox.io/files/67b85daf8b953e01250d53ea.png
・・・という茶番はさておき…
このページは、STP トリセツの中でも、最も難解な内容の1つかなと思います。覚悟して読んでください。
そもそも、なぜこんなものが存在するのか。
もともとは、「パーツの描画順序を途中で入れ替える」というのが、このパラメータを実装する目的でした。
YMM4上で、アイテムの描画順序を途中で入れ替えるには、主に以下の二つの方法が挙げられると思います。
対象のアイテムを途中で分割して、別レイヤーに移動する。
表示するアイテムの「Z順に描画」を ON にして、対象のアイテムのZ座標をいじる。
しかし、初回リリース時のSTPでは、「バス」を使わずにパーツの描画順序を途中で入れ替えることができませんでした。
現在のバージョンでも、STPの描画順序リストは、再生位置によってパーツの順序を変化させることはできません。 また、バージョン 1.0.5.1 までのSTPでは、パーツにX/Y座標を指定することはできましたが、Z座標は指定できませんでした。 しかし、バージョン 1.1.0.0 へのアップデートにて、パーツ個別に映像エフェクトを掛けられるようするために、パーツにZ座標を指定できるようにせざるを得なくなりました。
Z座標が指定できるようになり、「バス」はもう要らないなと開発者は一瞬思いましたが、「バス」にはまだ可能性が残されているかもしれないとも考えているので、パラメータとして残しております。はい、私の直感です、えぇ。
そもそも「バス」という単語は、回路図で使われる「バス」から来ています。回路図における「バス」とは、複数の配線をまとめるものです。
STP での「バス」は「複数のパーツを1枚のキャンバスに描画する」という役割を持っています。 「バス」で指定する値は、「バスの番号」として考えて下さい。言い方を変えると、値を N にしたとき、それは「このパーツを N 番目のバスに含ませる」ことを意味します。
逆に言うと、N 番目のバスは、「バス」の値が N になっているパーツをまとめて、1枚のキャンバスに描画します。
そして、描画の際には、バスの番号が小さいバススクリーンから順に描画されます。 1つのキャンバスにまとめる、という意味では、回路図の「バス」と役割は似ているでしょう。
使い方の一例として、きつね(仮)様のゆっくレミリアの立ち絵を使いましょう。
https://scrapbox.io/files/682d8e1a2b8f197074b6aa16.png
赤面にしているのは、目よりも先に描画されていることを分かりやすくするためです。
このレミリアの立ち絵のパーツは、「髪」「眉」「目」「口」「顔色」と、そのほかに「体」「後」があります。
今回、「髪」のバスは 3 、「眉」「目」「口」のバスは 1 、そのほかはすべて 0 にしています。
「顔色」「体」「後」の次に「眉」「目」「口」が描画され、その次に「髪」が描画されています。
ではこの状態で、「顔色」を、赤面の差分から青ざめた差分に切り替えます。
https://scrapbox.io/files/682d8f784c9c2d2d02d9c16e.png
あっ…… この白色は何色だぁ??
こういう時は「顔色」パーツの「合成モード」を「乗算」にしましょう。
https://scrapbox.io/files/682d903e82c9140505384a0d.png
羽の方に白くて細い線が残っているのは無視してください。
やろうと思えば消せるんで。
でも今はそんなの関係ねえ。はい。おっぱっぴぃ。
これでも違和感が残りますね。肌の部分だけが青くなっているので、目が浮き出てしまっています。
全パーツのバスが 0 になっているときは、描画順序リストで「顔色」のパーツブロックを「目」(と「眉」と「口」)より下に移動すれば下の画像のようになります。 https://scrapbox.io/files/682d923b65b4fb175c2f7339.png
しかし、表情アイテムをタイムラインに追加し、立ち絵アイテムより下のレイヤーに付け足すことで顔色を変えたい時、タグについてのTipsを読んだなら分かると思いますが、このとき表情アイテムの描画順序リストに「顔色」というタグを持ったパーツを追加するだけでは、差分を変えることはできますが描画順序を変えることはできません。 そんな時に役立つのがバスです。
先程、各パーツのバスの割り振りを示しましたが、2 のバスが使われていませんよね?この時のために空けておいたんです。
では、ここで「顔色」のバスを 0 から 2 に変えてみます。
すると、バス 0 には「体」「後」、バス 1 には「眉」「目」「口」、バス 2 には「顔色」、バス 3 には「髪」が分配されます。
バスの番号が小さい方から描画していくと、先程は「顔色」が「眉」「目」「口」より先に描画されていたのが、あとに描画されるようになります。
ここにわざわざ Z 座標の調整の作業を挟むのは、ちょっとおかしいですよね 異論は認めません (圧)
他にも、次のような場面で、バスは役立ちます。
下の画像の立ち絵は、うさちゃこ様のstp対応霊夢です。
https://scrapbox.io/files/682d9909663d9315ea580477.png
右と左は、両方とも全パーツが親子関係を持っています。上半身は「上半身」(胴体の赤い服の差分)から、下半身は「スカート」から、子パーツとして連鎖的につながっています。そして、全パーツが親パーツに個別で掛けられている映像エフェクトを自身にも掛けるよう設定してあり、「上半身」パーツ(胴体の赤い服の差分)に「3D回転」を掛けて、上半身全体が手前に倒れかけています。証拠に、上半身が全体的に縦方向が縮んで、頭の方は横に広がって見えるでしょう。 右と左の違いは、前髪のパーツが他の全てのパーツより大きいバス番号が指定されているか否かです。 左の霊夢は、全てのパーツのバスが 0 になっています。右の霊夢もそうなのですが、各パーツは中心位置が異なります。なので、胴体に3D回転を施し、前かがみになったことで、各パーツの中心位置のZ座標の大小関係がしっちゃかめっちゃかになり、描画順序がおかしなことになってしまいました。 しかし右の霊夢は、前髪がしっかり手前に描画されていますね。この霊夢は前髪のパーツたちのバスが 1 になっており、そのほかのパーツはすべてバスが 0 になっています。 YMM4 の 3D 描画の仕様はそこまで優秀ではなく、描画順序が不自然になることはよくあります。しかしそれにはしっかり訳があるので、我慢してください。そして STP は、3D 描画も含め、様々な仕様が YMM4 のものを再現して作られています。なので、立ち絵のパーツを3次元方向に動かすとき、Z座標の問題で描画順序の管理が面倒くさくなったら、バスを使ってみてください。 ここまで読むと、html や css でウェブページのレイアウトをデザインしたことがある人にとっては、STP のバスは「Z-index」の方が感覚としては近いかなと思います。 では、例をいくつか挙げましたし、この「バス」が描画順序をどのように変化させているのか、その本質的な部分に触れていきます。
パーツのもともとの描画順序から、バスによってどのように描画順序が変化するのかを考えるときの手順を下に示します。
ただし、いずれのステップでも、リストの中のパーツは、先頭のパーツから順番に処理します。別のリストに移動する等の指示があった場合は、移動先のパーツの順番の前後関係が、移動前と同じであるようにしてください。 ① もともとの描画順序のリスト(厳密にはタグについてのTipsで「第二次総合パーツリスト」と呼んでいるリストを指します。)から、以下の条件を満たすパーツを除外し、「バス無視パーツリスト」に移動する。 パラメータ「Z順描画」が「グローバル空間内」になっている。
パーツの中心位置の Z 座標が 0 以外になっている。 ②リストに残されたパーツたちをバス番号で分類し複数のリスト「バスリスト」を作る。
(つまり、同じバス番号のパーツたちを同じリストに分別するということです。使われているバス番号の数だけリストが作られるはずです。バスが「1」であれば、「1」のバスリストに追加しましょう。) ③全ての「バスリスト」に対して、次の処理を行う。
パラメータ「Z順描画」が「Z座標完全無視」になっているパーツは、中心位置の Z 座標が 0 であるとみなす。 上の内容を踏まえたうえで、「バスリスト」のパーツたちを中心位置の Z 座標が小さいものが先に描画されるように入れ替える。 ④全ての「バスリスト」を、対応するバスの番号が小さい方から順番に連結させて1つのリスト「第三次総合パーツリスト」にする。
(この段階で、全てのバススクリーンをバスの番号通りに描画することになります。) ⑤「バス無視パーツリスト」内のパーツを全て、中心位置の Z 座標が小さい方から順番に並び替えた後、中心位置の Z 座標が 0 より大きいパーツを「バス無視パーツリスト(手前)」に、逆に 0 より小さいものは「バス無視パーツリスト(奥)」に、分別する。 ⑥3つのリスト「バス無視パーツリスト(奥)」「第三次総合パーツリスト」「バス無視パーツリスト(手前)」を連結させ、1つのリスト「最終総合パーツリスト」を作る。
これらの手順を踏んで完成した「最終総合パーツリスト」が、パーツの真の描画順序です。タグについてのTipsで説明した「第二次総合パーツリスト」の作り方が理解でき、そこから「最終総合パーツリスト」に変形する方法も理解できたのなら、あなたは STP のパーツの描画順序の決め方を完全網羅したことになります。 <| Credit |> 画像に使われている立ち絵素材の制作者様