汎用リサイズ(ローカルチャット版)

内装が進んでくると次は家具選びとなりますね。とりあえず古い建物でもモダンな建物でも違和感なく置けてしまう某デザイナーブランドの家具に手を出してみました。それなりのお値段なので敬遠しがちですが、モデリングの善し悪しだけではなく、あちこちに置かれているためにキャッシュへの読み込みが早いと感じるのもいいところかなぁ。しかし、実際に設置してじっくりと見てみると何かが変だと思うようになりました。そう、物としてのサイズが少しばかり大きいのではないかという疑問です。SecondLife内ではリアルサイズと違い所謂SLサイズという元の大きさ×1.25倍というマジックが存在し今日でもだいたいはその倍率で作られるようになっています。規約は無いのですが、ずっと昔の話しですが、国外の某高名な武器屋さんとかと会話していたときにSLのアイテムって大きいよね~って話しで元のサイズの1.25倍で作ってるよ♪ってことでした。アバターの身長とかでも格好いい男性の身長が1.9mだとして1.25倍なら2.375mですから、たしかにそんな感じのスケール感になってしまっています。女性アバターでも身長1.65mとして計算すると2.0625mとなりますから概ね、全て1.25倍で出来ていると考えていいでしょう。

それでも、この家具は大きい。
現実世界の家具が2mの高さとして1.25倍なら2.5mであるはずです。しかし、スケールと並べた画像を見て分かるとおり3m以上の高さがあります。

本物の家具はどのぐらいの大きさなのか?
現代の家具ではなくアンティーク物で見てみました。参考にしたのはキャビネットとブックケースです
(家具の画像は handle-marche.com さんより引用)



こちらの白い家具は
1.84mの高さ

モデルの身長は163cm


この黒っぽいケースは
2.00mの高さ

モデルの身長は159cm

この他の家具もほぼ高さは2m以下の物ばかりでした。
だいたい、普通の家で踏み台がないと高い所の物が取れないような、そんな巨大な家具が使われるのはおかしいでしょう。

そこで「リサイズ」です。
リサイズなんて編集モードにして全体をグリグリ引っ張って引き延ばしたり縮めたりそれでいいじゃん? となる訳ですが、拘り性分の私としては「元よりも何%大きくした(小さくした)」という数値で操作する事を重視してみました。ただ、なんとなく目分量で、その場で拡大縮小するのではなく、例えばテーブルセットならば椅子もテーブルも同じ尺度で操作したいと考えました。椅子を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 件のコメント:

コメントを投稿

Popular Posts of the Month