2014年08月31日

(SimPeople)壁や隣に干渉しないオブジェクトを作る その2 -zバッファの基本-

zバッファといえば、シムピープルのオブジェクト作りの鬼門ともいえる所です。幾多の職人がこれに悩まされ、涙したか知れません(いや新参なんでほんとに知らないだけですがw)。

zバッファとは、要はオブジェクトの奥行きを表した白黒の画像です。奥行きの情報だけなので、オブジェクトが単独で存在しているときは意味はありませんが、前後にシムやオブジェクトがあるときは、この情報を元に「どちらが手前にあるのか」を判断しています。
白い(数値が大きい)ほど奥に、黒い(数値が小さい)ほど手前にあるので、これが白すぎると奥の壁に埋まったり、黒すぎると手前の壁を貫通してしまいます。

これを作る必要があるわけですが、普通手書きで作るとかそういうものではありません。細かい修正くらいなら可能でしょうが。

Blenderが使えるならそれで3Dモデルを作ってしまえば必要な画像がすべて作成できるので無問題ですが、なかなかそうもいかないでしょう。

なので、出来ればどこかから元になるzバッファを持ってきて、それを流用するのが一番です。公式オブの物がそのまま使えれば、少なくとも壁に埋まるなどの問題は起きませんし。

とは言っても、そのまま使えないことも多いでしょうし、zバッファがどんな物なのか、どういう特性を持っているのかを理解しているのは大切です。その辺を少し解説してみます。




さて、zバッファはオブジェクトの奥行きを表している、といいましたが、正しくは「画面との距離」を表しているといった方がいいです。画面との距離なので、画面と平行な場所までの距離はすべて等しくなります。
つまり、画面に対して平行に動かすのなら、zバッファは変わらないという事になります。

z2-1.jpg z2-2.jpg
しかし、シムピでは対象を斜め上から見下ろした形になっていますから、画像上で左右に移動したときは思った通りの場所へ移動しますが、上下に動かすと思ったのとは全く違う場所へ移動してしまいます。

それじゃあ、上下には全く動かせないのか、というとそうでもありません。勿論、zバッファの濃さを調整する必要はありますが、割と簡単に修正できます。
zバッファにはいくつか法則があって、それを利用するとオブジェクトを床に対して平行、垂直に移動することができます。これはzバッファの計算式から求めることができますが、あんまり役に立たないのでおまけとして後述しておきます。

z2-4.jpg
まずは床に平行に動かす場合です。床やテーブルに置いたまま手前や奥にずらす時ですね。
この場合は、画像上で1px上に動かすたびに3/2ずづzバッファを明るくしてやります。(ずらしたpx数)*(3/2)という事ですね。10px上に動かしたなら、15だけzバッファを明るくすればいいことになります。画像上で下にずらしたのなら、逆に暗くしてやるだけです。

明るくするときは、Photoshopなら新しいレイヤーを作って、(15,15,15)のグレー(ほとんど黒ですが)で塗りつぶし、元のzバッファの上に「覆い焼き(リニア)-加算-」で重ねて「下のレイヤーと統合」で元のzバッファと統合すれば出来上がりです。オブの周りの余計な部分は削除してくださいね。暗くするなら「差の絶対値」で同様に。

床に垂直に動かしたい時、大抵は床置きのオブを机の上に移動したいとか逆に床に移動したい、という時だと思いますが、画像上で1px上に動かすたびに1/2ずつ暗くしてやります。(ずらしたpx数)*(1/2)ですね。テーブルの高さは画像上で床から64pxなので、32だけzバッファを暗く/明るくすることが多いでしょう。ただし、床置きのラグなどは上にくるシムやオブとの干渉を避けるためか、理論値よりも明るく(奥になるように)作られていることが多いようなので、その分少し余計に暗くする必要があるかもしれません。

これで、zバッファを好きな場所に移動できるようになりました。とは言え、地味に面倒なので、なるべくならそのまま流用できるオブを見つけて持ってきたいところですね。

次回は、使える状況がある程度限られますが、色々と使いまわせるzバッファを作ってみたいと思います。




おまけ -zバッファの計算式-

まず、シムピープルの画面は、45度水平回転したものを30度の角度から見下ろしている、とありました。
45度は言わなくてもわかるでしょう。見下ろし角の30度は、タイルの対角線の長さが 1:2 になっていることから、sin30°= 1/2 でこれも正しいようです。

ここから、z=0 である平面(XY軸上の平面)を回転させた時のZの値を計算します。
z=0の平面、すなわち法線ベクトルが(0,0,1)の平面をZ-Y-X回転で回転させて、その平面の式にXとYを代入すればzの値が求まります。

z_siki1.jpg
これでzの値が出るかと思いきや、どうも公式のzバッファと合致しません。色々検証した結果、グレースケール画像のとれる値(0〜255)に収まるように係数がかかっているようです。それを調べた結果、最終的な式は

z_siki2.jpg
となります。

zバッファの作成法で、冷蔵庫などの垂直な壁部分は「同じ色で2ドット上がって、1ドット横に動く」というのが定番としてあるようですが、「同じ色(zが等しい点)は2ドット上がって(yが2増える)、1ドット横に動く(xが1増える)」となり、求めた式と一致します。

床面などの式も、同じ様な方法で求めることができます。




.

2014年08月30日

(SimPeople)壁や隣に干渉しないオブジェクトを作る その1 -まずは必要な画像の基本から-

さて、今更ながら備忘録もかねてオブジェクトの作成に必要な情報について少しまとめておきます。作成する画像の解像度とかその辺ですね。

オブジェクトのグラフィックは、すべて1タイル単位で作成されています。1x2のオブジェクトなら、1x1のグラフィックが2タイル分入っているという事です。

で、1タイル分のグラフィックは横136x縦384のグラフィックが3枚セットになっています。
順に、
  • 実際に表示されるp画像(picture)
  • 画像の表示部分を表すa画像(alpha)
  • オブジェクトの奥行きを示すz画像(zバッファ)

この3枚がセットで1つの絵が完成します。オブジェクトは向きが変わると画像も変わるので、基本的には方向ごとに1つづつ、4セットの絵が入っていることが多いです。
そのため、1タイルのオブジェクトには、1セット3枚x4方向で計12枚の画像が必要になります。

(花瓶の様にどの方向から見ても同じものは1セットのみ、左右対称のオブジェクトは画像の左右反転が使えるので2セットで済みます)

実際には、画面のズームに応じて更にx3しなければならないんですが、これはトラモグの機能で自動生成できるので、ここでは1番拡大された画像のみ扱うこととします。
※ 自動生成は若干クオリティが落ちるので、気になる方は自分で縮小、修正してください。




z1-1.jpg
それぞれの画像ですが、p画像はそのまま見た目を表す画像です。次に出てくるa画像で指定した範囲だけが表示されます。

a画像は表示部分を指定するモノクロ画像です。真っ白の部分はそのまま表示され、まっ黒の部分は全く表示されません。間のグレーの部分は、濃さに応じて半透明で表示されます。これを利用して、ガラスやレースカーテンなどのオブジェクトを作ることも出来ます。

z画像は見た目自体には影響を与えませんが、他のオブジェクトと重なった時にどちらが前になるかを示しています。モノクロ画像で、白いほど奥にあって黒いほど手前にあるという事を表しています。ここがおかしいと、壁に埋まったり、シムが前を通るとオブジェクトに埋まったりします。




ここで、p画像は256色パレットカラーで、他の2つはグレースケールで保存する必要があります。また、p画像とz画像はアンチエイリアスなしで、a画像はアンチエイリアスをかけて保存するのが基本です。

z1-2.jpg
なぜかというと、アンチエイリアスをかけないとオブジェクトのふちがギザギザになってしまいます。なので、オブジェクトの表示範囲を決めるa画像にはアンチエイリアスをかけた方が望ましいです。
ですが、p画像にアンチエイリアスをかけてしまうと、エッジ部分に背景の黄色が混ざります。オブジェクトに黄色の縁取りがついてしまうわけです。z画像も同じことです。なので、p画像とz画像にはアンチエイリアスをかけてはいけません。




z1-3.jpg
では、次にオブジェクトで使える範囲を見てみましょう。
1タイルの大きさは、縦64x横128のひし形になっています。そして、基本的にどのオブジェクトも1タイルの幅に収めることが必要です。そうしないと、後々壁を貫通したり面倒なことになります。それを覚悟で大きくするのは自己責任で。高さは2階に被らない程度ですが、そこまで行くことはあまりないでしょう。屋外限定のオブジェクトなら画像ギリギリまで行けるかと思います。

テーブルなどの高さは64ピクセルです。なので、地面に置くように作られたものは、上に64ピクセル移動すれば丁度テーブルの高さになります。

オブジェクトは画像のどこで作っても構いませんが、最終的には公式のオブジェクトで使われている場所を基準にして、ゲーム内で表示される予定の場所に移動するのが望ましいです。なぜなら、zバッファはゲーム内でどこに置くかによって変わるので、公式と同じ場所にしておけばzバッファを流用したり比較するのが容易になるからです。
※ 公式のオブジェクトは、ゲーム内の位置と元画像の位置が同じになるように作られています。




ここでとても大事なポイントがあります。
それは、「オブジェクトを作るときは、z画像は本当の一番最後に作る」という事です。
「本当の一番最後」とは、zバッファ以外の画像を作って、さらにゲーム中で位置を確認・調整して、その位置が確定した後です。「干渉するから位置を変えよう」とかはやってはいけません、別の干渉を起こす原因にもなります。
それまでは適当に仮のzバッファを使って、干渉上等でテストします。

なぜなら、「zバッファはゲーム中で表示される場所によって異なる」ので、場所を変えるとzバッファも変わります。逆に言うと、zバッファを作ってしまったら、その時点でゲーム中での位置も決まっています。それをzバッファを変えずに位置だけを移動させると、当然干渉が起きてしまいます。

z1-4.jpg
勘違いしている方も多いと思いますが、トラモグでの位置調整は「オブジェクトを作った画像と同じ場所に移動する」為のものであって、「最終的に位置調整を行う」物ではありません
トラモグで画像と違う場所に移動すると、zバッファがずれてしまうので、結果壁への干渉などが起きます。タイルの真ん中辺りに置くオブジェクトなら壁とも余裕があるのであまり問題にはなりませんが、本棚など壁際に置くものは簡単にめり込んでしまいます。

なので、トラモグで位置調整を行うときは、取りあえず干渉を無視して望みの場所に移動して、確定したらそれを元に画像の方を移動してzバッファを作り直す、というのが正しい手順になります。

取りあえずはこんな所で。次回はzバッファについて少し書いてみる予定。


.

2014年08月24日

(SimPeople)穴に飛び込む高速テレポーター

シムピープルでは、2階があまりに使えません。多少遠くなるのもありますが、とにかく階段が使えません。
上り下りを合わせて一度に1人しか使えないので、たちまち渋滞が発生してしまいます。

階段をまともに使えるようにできればいいんですが、流石に大変そうなので取りあえずテレポーターを使えるように(というかチート気味な性能に)してみました。
単独での移動だとえらく速く感じますが、階段を複数人で利用できるのと比べると、時間当たりの移動可能人数としてはそんなにチートではないかなーとか思ったり思わなかったり。

ありがちなアイデアなので既に誰かが作ってる気もしますが、取りあえず見つからなかったのであげておきます。

teleporter1.jpg
マジカルのワープ用の穴がありますが、あのモーションを利用したテレポーターです。見た目は上の5種類で、テレポーターのメニューから変更できます。

teleporter2.jpg
マジカルの穴と同様、飛び込んで使用します。反対側の穴から飛び出てきます。むっちゃ高速です。


*******************************************************************************
※ マジッククッキーを持っていないので、適当に乱数で作ったマジッククッキーを使用しています。
※ わかる範囲で重複は調べましたが、もしどこかの作者様と被っているとかありましたら教えてください。
※ 現在、58009(E299)を使用しています。
*******************************************************************************


ダウンロードは下からどうぞ。
kap_hole_teleporter.zip


9/11 追記
1マス前の2階へつながる直進タイプを追加しました。
1マスずれないと、外から2階に繋ぐときなどに2階に出っ張りが必要だったので。

15/01/17 追記
3人バージョンを追加しました。


.

2014年08月18日

(SimPeople)支給した食事を食べられる人数を増やそう

「食事を支給する」でみんなの分の食事を支給できますが、デフォルトだと6人まで、ハックオブだと8人用がスタンダードです。

でも我が家は大家族、それだけでは足りません。客が来て食べちゃう事も多々ありますし。
そこで支給される食事の量(何人前なのか)を増やしましょう。

今回はデフォルトの食事を置き換えるので、トラモグでクローンはしません。クローンしたものを書き換えても、冷蔵庫から出てくるのは元の(書き換えていない)食事なので。
※ 多人数専用の冷蔵庫を作るのなら、冷蔵庫と食事を両方クローンし、クローンした食事を修正&クローン冷蔵庫からクローン食事が出るように修正しなければなりません。

食事のファイルはObjects.farに入っているので、展開して中にある"Food.iff"を開きます。

manyfood1.jpg
BHAV→#4101:"init regular group meal" が支給する食事の初期化部分です。
"group meal"っていうのが支給した食事の英語名なんですね…パッと見てピンと来ない、こんな所にも言葉の壁が。

manyfood2.jpg
ここにある、"My Attribute 2 Assign To: 6" が何人前か、となっています。早速書き換えて起動してみます。
※ ちなみにどうやって見つけたかと言うと、「なんとなくコレっぽかった」というのが真相ですw
※ 「たぶんどっかで初期化してるだろ」「ここにそれっぽい名前と数字がある」「取りあえず書き換えて試してみよう」という感じ。解析とかの時は取りあえず何でも試すのが私のジャスティス。

manyfood3.jpg
一応食事の量は増えているようですが、皿のはずがピザの箱になってしまいました。量が減ってくると皿に戻るので、どうやら皿いっぱいのグラフィックを通り越して、別の絵が出ているようです。

manyfood4.jpg
そこでどこで食事の絵を決めているかを探します。名前から推測したりプログラムの流れを追ったりで、#4206:"graphic state - group meal" にたどり着きました。

manyfood5.jpg
ここではGUIDによって場合分けしています。どのGUIDが何なのか調べるには、Trial&Errorさんの公開しているGUID List が便利です。自分で調べるには、"Sims Object ID" をダウンロードしてリストを作っておくといいでしょう。ただし、"Sims Object ID" で出てくるGUIDは、2桁ずつ逆順になっているので注意が必要です。

調べると、上から順にチョコレート、フルーツケーキ、ピザになってました。食事はどれにも当てはまらないので、取りあえず15行目(iffPencil2でReWrite後の行番号)まで飛ぶようです。

manyfood6.jpg
そこから見ていくと、21行目で食事の残量を Temporary Storage0 にコピーしています。これに食事の種類に応じた数字を足した番号が、表示されるグラフィックの番号のようです。
元々の食事は6人前までですから、それを増やしたことで別の食事のグラフィックが出てしまったようです。
なので、食事の残量(Attribute2)が6を超えていたら、代わりに6を入れるようにすればいいはずです。
※ この改造だと、残量が6人前を切るまでは満タンのグラフィックになります。気になるなら自分で頑張ってくださいw

manyfood7.jpg
適当に行を追加して6以上かチェック、代わりに6を入れるように修正して起動します。今度は無事動作しました。

ハックオブ(食事の種類を追加しているもの)でも、foodを追加している.iffを同様の方法で修正することで量を増やせますが、大抵8人前が出てくるので、後半部分のグラフィック修正はすでに行われていることが多いです。
この場合、BHAV→#4101:"init regular group meal" 内の数字を増やすだけで量を増やせますので、デフォルトの食事を増やすより楽にできます。

(SimPeople)満員だと空いている所へ入るホットタブ

最近大家族プレイをしていますが、ホットタブを複数設置しても空いてる所に向かわずに1つのホットタブに群がってしまうし、4人待ちになると固まって出られなくなってしまいます。

multitub1.jpg
こちらは通常のホットタブです。よくある光景ですね。指示しないと中々他の浴槽へ向かわないし、固まると指示しない限り動かなくなります。

という事で、多人数用ホットタブを作ってみました。主な特徴は、
  • 満員の時、同じ部屋に同型機があるとそちらに入るように
  • 同じ部屋のホットタブがすべて満員の時はうろつかずに即諦める
  • 同じ部屋に置いたホットタブに入っていれば、離れていても全員会話ができる、社交も回復する

  • 他に、ビジターや子供も入れるようにし、子供が裸で出るときにモザイクが掛からないのも修正してあります。詳しくはれどめを参照してください。

    家の外は1つの部屋としてみなされるので、どうしても分けたい時は柵とか透明ドアなどで工夫するか、もしくはクローンしたものは同型機とみなされないので、別途クローン品と併用してください。

    multitub2.jpg
    導入するとこんな感じ。勿論指示は出していません。

    おまけで4人用ホットタブへパッチを当てるための.iffが入ってます。お気に入りの物を多人数用にして下さい。

    *****************************************************************
    ※ マジッククッキーを持っていないので、適当に乱数で作ったマジッククッキーを使用しています。
    ※ わかる範囲で重複は調べましたが、もしどこかの作者様と被っているとかありましたら教えてください。
    ※ 現在、58009(E299)を使用しています。
    *****************************************************************
    ダウンロードはこちらから
    kap_muiti_hottub.zip