それでも、この家具は大きい。
現実世界の家具が2mの高さとして1.25倍なら2.5mであるはずです。しかし、スケールと並べた画像を見て分かるとおり3m以上の高さがあります。
本物の家具はどのぐらいの大きさなのか?
現代の家具ではなくアンティーク物で見てみました。参考にしたのはキャビネットとブックケースです
(家具の画像は handle-marche.com さんより引用)
こちらの白い家具は
1.84mの高さ
モデルの身長は163cm
この黒っぽいケースは
2.00mの高さ
モデルの身長は159cm
だいたい、普通の家で踏み台がないと高い所の物が取れないような、そんな巨大な家具が使われるのはおかしいでしょう。
そこで「リサイズ」です。
リサイズなんて編集モードにして全体をグリグリ引っ張って引き延ばしたり縮めたりそれでいいじゃん? となる訳ですが、拘り性分の私としては「元よりも何%大きくした(小さくした)」という数値で操作する事を重視してみました。ただ、なんとなく目分量で、その場で拡大縮小するのではなく、例えばテーブルセットならば椅子もテーブルも同じ尺度で操作したいと考えました。椅子を10%大きくしたならテーブルも10%大きくしたいです。
手作業でリサイズせずにスクリプトを使ってリサイズをします。
もともとのアイテムにリサイズの機能がある物もありますね。
でも自分でスクリプトを作った方が好みのサイズにやりやすいです。
そしてダイアログ操作ではなく、あえてローカルチャット仕様です。
ダイアログで操作する方がクリックするだけなので簡単であると思われるけど、増減量が1%だったり5%だったり規定値しか選べない。例えば26%大きくしようとして10%と1%しか選択技がなかったら、10を2回、1を6回選択する事になるでしょう。スケールファクタは割合で変化するので、リサイズを行う度に微妙に細部のスケールが狂ってきます。もとより一回で26%増やすことと10%したものを更に10%、そして1%ずつ増やすと・・・。単純に結果が異なる事が分かりますよねw
ここはズバッと一気に26%サイズ変更したいと考えます。
なので、チャット操作。
もう一つ、チャット操作での利点は、対象が複数あっても同時に進行可能なことです。
例えば椅子2つとテーブル1つがあったとして、それぞれをリサイズするときに個別に操作しなくても全てにリサイズスクリプトを仕込んで一気に一度で変更できます。
それとタッチなどに反応する家具の場合、ダイアログが2つ出てしまうのもチャット操作なら避けられますね。
家具デザイナーさん毎に基準にしているサイズがそれぞれある感じがするので、同じデザイナーさんの作品なら、同じ割合で拡大(または縮小)したいものです。
ま、そもそも、家具のリサイズなんて、そうそうやるものじゃないですから、どうでもいいかもーですねw
そんなリサイズをするためだけに書いてみました。
もともとは販売しているアイテムなどで使っている処理からの抜粋でチャット用にしたものです。
integer S_HANDLE; default{ state_entry(){ llListenRemove(S_HANDLE); S_HANDLE = llListen(0,"",llGetOwner(),""); } on_rez(integer num){ llResetScript(); // Reset the script } listen(integer channel, string name, key id, string msg){ float p = llFabs((float)msg); float x = 0; if(msg == "die"){ llOwnerSay("remove script!"); llRemoveInventory(llGetScriptName()); return; } if(llGetSubString(msg,0,0) == "+"){ x = 1.0 + p / 100.0; if(x > llGetMaxScaleFactor()){ x = 1.0; } }else if(llGetSubString(msg,0,0) == "-"){ x = 1.0 / (1.0 + p / 100.0); if(x < llGetMinScaleFactor()){ x = 1.0; } }else{ return; } if(x != 1.0){ llScaleByFactor(x); llOwnerSay("Resize : " + msg); }else{ llOwnerSay("これ以上にサイズは変更できません。"); } } }
ちなみに、このスケール関連の3つの関数はOpenSIM 0.8.2.1 では実装されていないようです。
(llScaleByFactor(), llGetMaxScaleFactor(), llGetMinScaleFactor())
SecondLifeと併用を考えている方はご注意を~
0 件のコメント:
コメントを投稿