2014年12月29日月曜日

SL用に自作でPCアップデートするお話 2014冬ボ版


んじゃ次に”自作”とか"貧乏アップデート"の話

まずOSをチェック
XPなら窓から投げ捨てて全部新調すべし

7proがいいけどまぁ今からなら8.1の方がコスパいいからなぁw


最低限マザーとCPUとメモリを新調する前提で話を進めていきます


キーボードとマウスがUSBならとりあえず大丈夫

どちらかがPS/2ってんならオンボでPS/2ついてるマザーを選べばおk
両方PS/2の方はこの機にゲーミングマウス辺りの導入を検討されては?


モニターはHDMI付いてればとりあえず大丈夫
21.5インチ以上のフルHDでデュアルモニターとかするとすげー捗る
やるならモニタアームの導入もおすすめする


ケースもまぁマザーサイズに合わせてちょっと気にする程度でいい


電源がもし新しいマザーに対応してないものの場合
80Plus GOLD 以上の電源に入れ替えませう



CPU
とりあえずi3かi5かi7の最新のやつ
AMDはやめとけ ビューワーとの相性がある

GPU
とりあえず750以上にしとけ Nvidiaなら問題ない
Radeonはビューワとの相性があるからやめとけ

TITANとかあのへんはまぁむしろ電源が問題なのでショップで相談した方がいい

マザーボード
PCIex16ポートがあるかどうかを確認すること
該当者はPS/2ポートついてるかどうかをチェック

個人的にはGIGABYTEのマザーを推奨

メモリ
とりあえず8Gを二枚刺し
これが最低ライン

ハードディスク

とりあえずsteamかoriginの利用者なら
Crucialの512GのSSD+1.5TB以上のHDD
ぶちこんどいて損はない

てかSSD入れるだけでも劇的に改善する

光学ドライブ
外付けでおk だたしブルーレイ必須
理由はまぁ 特に無いけど どうせOSのディスクがそのうちブルーレイになるだろ的な

NIC
必要ならINTELのギガビットにしとけ
まぁなくてもいけるだろうけどロードの快適性に響く
有線接続は必須



大体この辺かな

多分BTOマシンより結構割高になるだろうけど
ほとんどが"部品の信頼性"の部分なのでまぁ諦めろ的な

以上

2014年12月28日日曜日

これからSL用にBTOでPC更新する場合の最低ライン 2014冬ボ版

さてまぁ円安でPCパーツがクソ高いこの時期にあえてPCを更新する勇者たちへのお話

まずこの三箇条を送りましょう

・SLにINするためだけにハイエンドPCは完全に無駄です

・最低ラインとして今のPCの"パーツ"は全部使えないと覚悟せよ

・自分で組めないなら予算は"最低"10万です 慈悲はない


さてこの三箇条を最低65536回音読してから次のお話



BTOでコスパ重視ならどれになるか


まず断言しちゃうと

最低ラインは"最新"のi3でwindows7の64biでメモリ16Gぶっこんであればなんでもおk

この仕様ならとりあえず影offである程度パフォーマンス重視の設定なら確実に30fps出る



ドスパラだとマグネイトのこいつ
http://www.dospara.co.jp/5shopping/detail_prime.php?tg=2&tc=50&ft=&mc=4361&sn=0

にメモリ16GとSSDぶっこめばそれなりに動く
最低でもメモリの方は16Gぶっこむこと SSDは余裕があればでいい

SSDとメモリ追加だけで10万いくって? そんなもんだw


将来的にグラボぶっこむならこの仕様だと無理なので




最初から750がついてるこいつのwindows7モデル SSD付きでちょーお得?
http://www.dospara.co.jp/5goods_pc/pc_bto.php?h=d&f=d&m=pc&mc=4639&sn=2356&vn=1&lf=0

にメモリ16Gを追加でぶっこむ

大体13万円


ゲーミングPCじゃないと嫌だってんなら最低ラインは

http://www.dospara.co.jp/5goods_pc/pc_bto.php?h=d&f=d&m=pc&mc=4643&sn=2153&vn=1&lf=0

これにメモリ16Gぶっこんで大体12万円





ドスパラだと大体こんなもんだけど


"安いゲーミングPCのBTO"
だとマウスコンピュータって選択肢があります

たとえばこいつ
http://www2.mouse-jp.co.jp/tune/scripts_cart/spec.asp?prod=1412NG-im550BA11-SP-W7&_ga=1.142109424.398800487.1418491214

メモリ16Gぶっこんで10万ちょい



で、
安いからってRadeonとAthlonは全部地雷
もうドライバが問題外ってレベルでバグバグで話にならん


BTOだと大体この辺やね

以上

2014年12月10日水曜日

オフセット回転スクリプトのお話

現物はここから(タダじゃないよw)


面倒なのでソース全文 適当なオブジェクトにコピペで入れても多分動かん

//とりあえず相対座標での回転演算をかなり簡略化して記述したやつ
//変な角度のヒンジでスムーズに回さないといけないってだけならこいつだけでいける

rotation axis;
vector offset_pos;
offset_rot(vector offset,rotation rot){
    // プリムナンバー,基準からの相対位置,プリムのベース回転 と記述する
    //グローバル変数でもいいんだけどプリムナンバーに変数使いたいかもしれないので関数内に記述
    list parts=[2,<0.025,0.00,-0.25>,llEuler2Rot(<0,0,0>),//黄色い円柱 
                3,<0.525,0.00,-0.25>,llEuler2Rot(<0,0,0>)];//青い板
    integer list_length=llGetListLength(parts)/3;
    list params;
    integer i;
    vector parts_pos;
    rotation parts_rot;
    for(i=0;i<list_length;++i){
        parts_pos=llList2Vector(parts,i*3+1);
        parts_rot=llList2Rot(parts,i*3+2);
        //一括で回転させるためにリストにぶっこむ 記述的には
        //プリムナンバー 回転軸基準座標+(基準からの相対位置*指定回転)  プリムのベース回転*指定回転
        params+=[PRIM_LINK_TARGET,llList2Integer(parts,i*3),PRIM_POSITION,offset+(parts_pos*rot),PRIM_ROT_LOCAL,parts_rot*rot];
    }
    llSetLinkPrimitiveParamsFast(0,params);
    
}

default
{
    state_entry()
    {
        offset_pos=<0,0,1.0>;//回転軸基準座標 必要なら関数内にぶっこんでもおk
        axis=llEuler2Rot(<PI/4,PI_BY_TWO/4,0>);//ベースの回転軸rot axisangle2rotで使うだけならvectorで指定しても変わらないんだけど実験ならこっちのほうが調整しやすいので
        llSetLinkPrimitiveParams(4,[PRIM_POSITION,offset_pos,PRIM_ROT_LOCAL,axis]);//視覚的に見せるために赤いプリムを仮想回転軸として配置
        
        
//offset_rot命令でコメントアウトしてある方は 座標系をルートプリムでなく回転軸の座標系にするやつ 多分実際に見たほうが速い

//        offset_rot(offset_pos,axis*llAxisAngle2Rot(<0,0,1>*axis,0.0));//デバッグのために一応ゼロ回転へ全部戻す
        offset_rot(offset_pos,llAxisAngle2Rot(<0,0,1>*axis,0.0));//デバッグのために一応ゼロ回転へ全部戻す
    }

    touch_start(integer total_number)
    {
        integer j;
        //開閉処理 フレーム数とかを変数にしてもいいけどサンプルなのでベタ書き 
        //15fpsで21フレーム 可動域90度
        for(j=0;j<=20;++j){//オープン
//            offset_rot(offset_pos,axis*llAxisAngle2Rot(<0,0,1>*axis,j*PI_BY_TWO/20));
            offset_rot(offset_pos,llAxisAngle2Rot(<0,0,1>*axis,j*PI_BY_TWO/20));
            llSleep(0.066);//ウェイト
        }
        for(j=0;j<=20;++j){//クローズ
//            offset_rot(offset_pos,axis*llAxisAngle2Rot(<0,0,1>*axis,PI_BY_TWO-(j*PI_BY_TWO/20)) );
            offset_rot(offset_pos,llAxisAngle2Rot(<0,0,1>*axis,PI_BY_TWO-(j*PI_BY_TWO/20)) );
            llSleep(0.066);//ウェイト
        }
    }
}

大体この辺かね
以上

2014年11月6日木曜日

rotationからオイラー角(ピッチ ロール ヨー)を取り出す方法

基本的な考え方として

大抵のエディターの場合 回転が DEG値で<x,y,z>となっている場合

これをオイラー角とか呼称します
んでなんでこれが3dプログラミングだとまずいかってーと
"ジンバルロック"
っチュー現象がどうやったっておきます

大雑把に説明すると基準平面に対して自分の現在の向きから
行える方向転換が限定される現象のことです


んでまぁ タイトルにあるような演算が必要な用途として

例えば飛行機ゲーム あとはFPS

ここ最近の航空機のグラスコックピットの場合
このオイラー角を直感的にわかるようにした計器がついてます

んで X軸を正面 Y軸を側面 Z軸を上面とした場合に

x軸:ロール
y軸:ピッチ
z軸:ヨー

って感じで記述することが可能

ゲームでの航法や射撃ならピッチとヨーだけわかってりゃ
とりあえず自分が向きたい方向を表現できる
けど基準平面が無い空間だったり姿勢まで見るならロールも欲しい ッて感じだな


んで大抵の3Dプログラミングだと
回転値はクオータニオンっちゅー4値あるデータを使います
理由は
"ジンバルロック"の対策ね

んでまぁ大抵のSDKの場合 クオータニオンとオイラー角は
相互変換のライブラリーが揃ってます

ただこの相互変換関数
望む結果が出ることはほぼありません

何故か

変換時にZYXの順番で処理するから

(直感的に回しやすいのは大抵XYZの順番なので)
じゃぁ使い物にならねーじゃねーかってなるわけですが

そこはライブラリーというか使い方があります

オイラー角のXYZを個別のクオータニオンとして生成して合成すればいい


逆もしかり

具体的な計算式は

オイラー角からクオータニオンへの変換

目的の回転rot=(X回転のeuler2rot)*(Y回転のeuler2rot)*(Z回転のeuler2rot)

クオータニオンからオイラー角への変換は
回転z=クオータニオンのローカルX軸のvectorのyとxでAtan2
回転y=クオータニオンのローカルX軸のvectorのzとxy合成した長さでAtan2

回転y=クオータニオンからzy回転を引いたローカルy軸のvectorのzとyでAtan2


面倒なのでLSL表記すると
vector rot2angle(rotation rot){

    vector vec=<1,0,0>*rot;
    vector angle;

    angle.z=llAtan2(vec.y,vec.x);
    angle.y=-llAtan2(vec.z,llVecMag(<vec.x,vec.y,0>));//yだけatan2と逆回りになる
    rot= rot /llEuler2Rot(<0,0,angle.z>)/llEuler2Rot(<0,angle.y,0>);

    vec=<0,1,0>*rot;
    angle.x=llAtan2(vec.z,vec.y);

    return angle;
}
rotation angle2rot(vector angle){
    rotation rot=llEuler2Rot(<angle.x,0,0>)*llEuler2Rot(<0,angle.y,0>)*llEuler2Rot(<0,0,angle.z>);
    return rot;
}
default
{
    touch_start(integer total_number)
    {
        llSay(0, (string)(rot2angle(llGetRot())*RAD_TO_DEG));
        llSay(0, (string)(angle2rot(rot2angle(llGetRot())))+","+(string)llGetRot());
    }
}
大体こんな感じ
出力(サンプル)

[11:36] Object: <44.99883, -45.00175, -44.99999>
[11:36] Object: <0.19133, -0.46195, -0.19134, 0.84462>,<0.19133, -0.46195, -0.19134, 0.84462>


ってなところかね

以上

2014年11月5日水曜日

チャットが聞こえる範囲と邪魔なメッセージをスマートに絞る方法

ヴィークルとかで乗ってるアバターにだけ聞こえる状態にしたいけど
○○のささやき とか出るのはダサいとか
ラップタイマーとかでログを整理したいときに
○○の叫び とか出るのはちょいと面倒だとか

その辺をスマートに解決する方法

やりかた自体はちょー簡単で
Stringの先頭に "/me :"
これを追加するだけ

以下がサンプル

default
{
    touch_start(integer total_number)
    {
        llSay(0, "/me :Say.");
        llWhisper(0, "/me :Whisper.");
        llShout(0, "/me :Shout.");
    }
}

ってなところかね

以上

2014年10月22日水曜日

SLの課金システム周りがちょい変更されたっぽいお話

ちょいと面倒なので適当に箇条書き


・L$買うだけならデビッドカードでもいけるようになったようです

 前はダメだったVプリカが使えるようになったのをサブ垢で確認
 
 支払情報の登録で1$請求して認証するプロセスが省略された?
 もしくはシステム変更で不要になった?
 相変わらずL$を売っぱらうのにはまずL$購入の実績が要る

・アカウントのUS$をpaypalへ送金する場合
 初回は必ず保留されるものと思っといて問題ない

 paypalでUS$受け取るのに郵便認証が必須になりましたが

 それとは別で SLアカウントからpaypalへのUS$引き出しの初回は必ず保留されて
 アカウントのメールアドレスに"書類提出しろ"ってメールがきますので

 運転免許証もしくはパスポートのスキャンと
 指定の書類に記入して提出する必要があります
 (書類記入はオンラインでペーパーレスなので深夜だったりFAX無かったりしてもおk)
 アカウント登録時に他人の書類とか偽名とか使ってたら長引くので覚悟すること

 あとこのメール見落としてて何もせずに30日経ったらアカウントホールドです 例外はない

 正常なLLからpaypalへの送金でも最低一週間前後かかるので
 いつものリンデンクオリティーと思ってほっぽってるとアカウントホールドされちゃいます

 ホールド中でもLLの営業時間内なら割と短時間でレスポンスが来て
 数時間でホールドが解除されます
 (このときに本人認証で他人や嘘のデータ入力してると長引きます)

・年齢認証が"アカウント作成時に入力した誕生日"で行われる仕様になってる
 土地設定アダルトだけだと年齢認証してなくても入れますが
 入場制限に年齢認証必須にしてるところは入れません

 非認証アカウントでジンドラ入れるかどうかはテスト環境無いので不明


大体この辺かな

以上

2014年10月12日日曜日

連続した超多関節駆動用スクリプト(負荷テスト用)

//連続した超多関節の駆動用スクリプト(負荷テスト用)
//スクリプトタイム平均が0.1前後なのを確認 十二分に重いので常設禁止
//17プリムのデフォルト球体をリンクしてやりゃ動く

//負荷テスト用でオン・オフとか入れてないからこれそのまま流用とか考えないようにw

integer count=0;
integer j;
vector base_pos;
rotation base_rot;
integer i;
list params;

integer dir;
default
{
    state_entry()
    {
        llSetTimerEvent(10.0);
    }
    timer(){
        j=20;
        do{
            base_pos=ZERO_VECTOR;
            base_rot=ZERO_ROTATION;
            params=[];
            if(dir){
                ++count;
                if(count>3)dir=0;
            }else{
                --count;
                if(count<-3)dir=1;
            }
            for(i=2;i<18;++i){
                base_rot=llEuler2Rot(<0,count*PI/200,count*PI/200>)*base_rot;
                base_pos+=<0.25,0,0>*base_rot;
                params+=[PRIM_LINK_TARGET,i,PRIM_POSITION,base_pos,PRIM_ROT_LOCAL,base_rot];
            }
            llSetLinkPrimitiveParamsFast(0,params);
            --j;
            llSleep(0.01);
        }while(j>0);
    }
}