伺か Advent Calendar 2012 向け特別企画:SERIKO新描画メソッド interpolate について
http://qiita.com/advent-calendar/2012/ukagaka
メリークリスマス!爆発しろ!
……はい、気がすんだので本題に入りましょう。
元の意味などお構いなく、ほぼただの祭りと化しているクリスマス。かなりの割合の方には、ケーキ食って子供に(中の人の苦労により)プレゼントが来てリア充が爆発する日ぐらいの認識でしょう。まあそれはよろしい。
伺かゴーストマスタ、あるいはリアルタイムで動くキャラの中の人にとっては、年に何度かあるイベント仕込み納期でありまして、毎年どないしょうどないしょうと悩みながら結局実装できなかったりする日でもありますが。
せめて着せ替え実装でサンタ帽ぐらいかぶせてやろうという親心を出して作業にかかる、というのは、よくある話であります。
ふつうのヒトガタキャラであれば、このようにきれいに帽子だけを切り抜いて合成(overlay)すればいいよね、ということになります。
ちょっとだけレベルが上がって、変化する範囲が着せ替え範囲にかかる場合でもこの通り。要は変化範囲を透明色にして回避すれば良いのです。
……さて。このようにふつうのゴーストパパでありますわたくしは、計画通りとニヤつきながら「メリーさんの電話」に帽子屋さんの協力を得てサンタ装備をかぶせられたわけですが、その後調子に乗ったのがいけませんでした。
ヒャッハー!次はとらふぃっく☆とれいんだー!
……あ?
ケモミミっ娘いいよね、耳ぴくぴくいいよね*1、という場合ではありません。こいつらの耳はreplaceによる実装なのです。
単にこれもoverlayすればいいよね?
……動いた耳にかぶさりますよね。ですよね。動く範囲切り抜いたらサンタ帽ちょん切れるし。
そうだ、昔option,backgroundというのを実装したじゃないか。これで耳の後ろに回せば……
だめでした。後からreplaceがかかるせいで影響があります。置換処理されて透明にちょん切れてしまうのです。
つまりreplaceとは、外形も含めて上書き追加ではなく完全置換する、という処理になりますから、前後のアニメーションの合成に関してかなり気を使う必要があります。
これまでこの問題の解決には、耳を完全に切り抜いておいて、全サーフィスでrunonce(とsometimes)で合成して耳の動きを実現する、という手法が普通でしたが、以下の2点の問題があります。
- ベース画像が耳ちょん切れたグロ画像になる
- 姿勢パターンがたくさんあるとものすごくめんどくさい
特に後者に完全にあたってしまった私はずいぶん悩みました。
耳アニメーションの後ろ側にあるように見せたいけれど、妙な細工で画像切り貼り地獄はやりたくない。
そうだ、新しい合成手法を開発すればいいじゃないか。*2
お待たせしました。新描画手法、interpolate (日本語訳:補完) の紹介です。
- overlay = 追加
- overlayfast = 上書き
- interpolate = 補完
つまり、後ろ側にあるように見せるためには、透明な部分だけに部品を合成する方法があればいいのです!
透明な部分を保持するoverlayfastとは全く逆、追加ばかりしかできないoverlayとも違い、「透明部分対象の補完」ので、これにinterpolateと名づけました。
この合成は、単純に透明な部分だけに合成しているのではなく、きちんとPNAの透明度を判定してブレンド処理がかかっています。
また、アニメーションの上からかぶせることで、そこまでのアニメーション合成結果の透明な部分を対象に補完ができます。
この時、アニメーションの合成順が重要で、必ずinterpolateを使う部分を後で合成(=見た目上の"上側")するようにしなければなりません。
descript
{
animation-sort,descend
version,1
}
そこで、surfaces.txt内のdescript ( descript.txtではない! ) に、先日実装したanimation-sortで降順を指定した上で、数字の大きい=上にくるアニメーション定義でinterpolateしてやると、うまく合成順を制御できます。
以上、だいぶ以前からreplaceした時の他のアニメーションへの影響を軽減する方法が無いのか何度が問い合わせがあったので、今回はその答えをやっと出せた報告でした。
というわけで、ケモミミっ娘に帽子をかぶせる方法でした!
質問をよこせ
以降、質問がありましたらお答えします。
- Q. どこぞのケモミミ鉄道娘のためだけに仕様策定とかありえん。
- A. いや、昔から言われてたんよ、replaceした時の対策。あくまで1つの回避法だけど。
- Q. overlayにoverlayfastだからunderlayとかoverlayslowとかじゃだめなんですか!
- A. 英語でも意味わかるようにしておかないと後でひどい目に遭いますからねえ。