ばぐとらぶごる

開発者もすなるぶろぐといふものを、エンバグ野郎もしてみむとてするなり。

伺か Advent Calendar 2012 "新描画メソッド interpolate について"

伺か Advent Calendar 2012 向け特別企画:SERIKO新描画メソッド interpolate について

http://qiita.com/advent-calendar/2012/ukagaka

メリークリスマス!爆発しろ!

……はい、気がすんだので本題に入りましょう。

元の意味などお構いなく、ほぼただの祭りと化しているクリスマス。かなりの割合の方には、ケーキ食って子供に(中の人の苦労により)プレゼントが来てリア充が爆発する日ぐらいの認識でしょう。まあそれはよろしい。

伺かゴーストマスタ、あるいはリアルタイムで動くキャラの中の人にとっては、年に何度かあるイベント仕込み納期でありまして、毎年どないしょうどないしょうと悩みながら結局実装できなかったりする日でもありますが。

せめて着せ替え実装でサンタ帽ぐらいかぶせてやろうという親心を出して作業にかかる、というのは、よくある話であります。

ふつうのヒトガタキャラであれば、このようにきれいに帽子だけを切り抜いて合成(overlay)すればいいよね、ということになります。

ちょっとだけレベルが上がって、変化する範囲が着せ替え範囲にかかる場合でもこの通り。要は変化範囲を透明色にして回避すれば良いのです。

……さて。このようにふつうのゴーストパパでありますわたくしは、計画通りとニヤつきながら「メリーさんの電話」に帽子屋さんの協力を得てサンタ装備をかぶせられたわけですが、その後調子に乗ったのがいけませんでした。

ヒャッハー!次はとらふぃっくとれいんだー!

……あ?

ケモミミっ娘いいよね、耳ぴくぴくいいよね*1、という場合ではありません。こいつらの耳はreplaceによる実装なのです。

単にこれもoverlayすればいいよね?

……動いた耳にかぶさりますよね。ですよね。動く範囲切り抜いたらサンタ帽ちょん切れるし。

そうだ、昔option,backgroundというのを実装したじゃないか。これで耳の後ろに回せば……

だめでした。後からreplaceがかかるせいで影響があります。置換処理されて透明にちょん切れてしまうのです。

つまりreplaceとは、外形も含めて上書き追加ではなく完全置換する、という処理になりますから、前後のアニメーションの合成に関してかなり気を使う必要があります。

これまでこの問題の解決には、耳を完全に切り抜いておいて、全サーフィスでrunonce(とsometimes)で合成して耳の動きを実現する、という手法が普通でしたが、以下の2点の問題があります。

  1. ベース画像が耳ちょん切れたグロ画像になる
  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. 英語でも意味わかるようにしておかないと後でひどい目に遭いますからねえ。

*1:しっぽもいいよね。

*2:そのりくつはおかしい。

うまうまうま

2.01.00の負荷試験のためにありったけつっこんでみた。

スクリーンショット:2/18 06:05更新(30キャラ)

………

すさまじい負荷。めいっぱいまわり続ける 21 22 24 28 30本のスレッド。コンテクストスイッチで悲鳴をあげるCPU。*1

今は猛烈に反省している。*2

23:30追記

タスクマネージャのパフォーマンスタブも一緒に撮ってみた。Core Duoの2コア両方にほぼ等しく負荷が割り振られている点に注目。

*1:全員ウマウマやるもんだからどうなるかわかりますよね?

*2:…よくもまあ、落ちずに済んだもんだ

うまうま

あ…ありのまま 今 起こった事を話すぜ!
『おれはヘルプファイルを書いていたと思ったらいつのまにかウッーウッーウマウマ(゚∀゚)とつぶやいていた』
な… 何を言ってるのか わからねーと思うが
おれも何をしたのかわからなかった…
頭がどうにかなりそうだった…
ニコ動だとかzoomeだとか
そんなチャチなもんじゃあ 断じてねえ
もっと恐ろしいものの片鱗を味わったぜ…

ちょっとためしにシェル構築2

id:ponapalt:20070530:1180471125
更新しました。あ〜、そうそう、なんか違和感があると思っていたら体の部分も動いてないとヘンですよね!*1
ちなみに、実はちょっとゴーストまで仕立ててみたい気もありました。作業かかえすぎて首まわらなくなりそうなのでやめましたが…。ゴースト部は丸投げということで!

使いたくなるフリーシェルってどんなのでしょうね。以前話題になったりWikiで投票があったりしますが、私見では「うっすらとお題も提示されているシェル」じゃないかとか思いますが。
この「うっすらと」がクセモノで、ゴーストを作る人の想像をかきたてる余地のある程度かなあと。例の「よだか」の場合はとりあえずなんとなくファンタジー系、魔法使い系かなあ?という程度の想像はできますから、それを核としてネタが組みあがってくる可能性が高いわけです。

*1:これだからド素人の私は……orz

ちょっとためしにシェル構築

http://dog.oekakist.com/1boshi/
id:wiz-stargazer:20070530:1180463788)
こちらで画像1枚がフリーパーツ扱いで公開されてましたので、
http://ssp.shillest.net/etc/yodaka.zip
とりあえずシェルに仕立て上げてみました。作業時間20分。(更新:6/1 05:40
注:利用に関する注意は完全に作者イチボシさんの規定に従うものとします。*1

  • surface10系のアニメーションは入れていません。現状のままですとアニメーションがガタつく可能性があります。
    • イチボシさんのツッコミを参考にして入れました。
  • 起動時に処理系判定して自由移動タグがおすすめ。
    • 参考:\1\![set,alignmenttodesktop,free]\0\![set,alignmenttodesktop,free]
  • ID割り振りポリシーは単純。0番〜10番がメインで1000番台がアニメーション用パーツ、エレメントはelement[合成先サーフィスID]。

*1:著作権に関する話をさとーさんがした手前、とりあえず私の立場については明記しておきます。…ホンマはsurfaces.txt部分はPublic Domainでばらまきたいのですが。