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);
    }
}

2014年9月17日水曜日

LindenX周りのお話

今更誰がそんなことすんだよ的なお話ではありますがメモ程度に



ポイントになる部分を箇条書きにしておきます


想定はプレ垢の支払いにinworldの売上を使いたい人用
(大体25000L$あればプレ垢の年額支払いに出来ます)

・現状LindenX以外は使えないと思っておいたほうがいい

・有効なクレジットカードが必須
 (Vプリカ不可楽天(旧イーバンク)のVISASデビッドは可 AUウォレットはどうなんだろうなー)

・L$を売るためにはまずLindenXで10ドル分ほどL$を買わないとあかんです

・ここ最近の米国の法改正で 一定額以上を売る場合には
 運転免許証かパスポートのスキャンを提出する必要が出る可能性があります
 (昔よりマネロンとかそっち系の対策が厳しくなった)

ってなところかね

以上



おまけ

US$をpaypal送金する方法について(paypal関係)


・paypal経由で可能ですが

最近の法改正(資金決済法だったかな?)で本人確認の認証が必要になりました

(最長一週間かかります)

本人確認書類の送付が必要なのでスキャナーかデジカメを用意しませう

認証ではパスワードを郵送で送ってきますので現住所も一応確認しませう


・クレジットカード認証は必須です(別に楽天VISAデビッドでも可能ですが)


・念のためアカウントはプレミアムかビジネスにしませう


・ちなみに上記手順をきちんと踏まずにLLからpaypalへUS$を移動しようとすると

謎のエラーが出て最長三ヶ月ほどUS$が宙ぶらりんになりますので注意


・paypalからの引き出しにネット銀行を指定する場合

ネット系銀行以外の口座情報が必要になる場合もあるので

(これも資金決済法関係です)一応準備しておきませう

2014年8月9日土曜日

SLのキャッシュについて

SLの低パフォーマンスの原因って

(スペックが足りていると思われる)一般ユーザーの場合9割ほどが
実はキャッシュ周りなんだよね

だからといってキャッシュをこまめに消すのは逆効果になりやすい
何故か

"キャッシュするときが一番重い"から

回線が超絶に速くてPCスペックがカッツカツってなら
キャッシュクリアしてやったほうがはやい場合もあるけど
(キャッシュのフラグメンテーションの解決ってこっちゃね)

SLのキャッシュはサーバーから全部ダウンロードしてくるので
PC内部の処理速度はあんまり関係なくて
全体の転送レートが一番影響する


んでまぁUSBメモリをキャッシュにするって話がたまーに出るじゃん

今回やってみてわかったんだけど
無意味どころか逆効果だった
何故か
キャッシュする段階で
PCが数秒のフリーズを繰り返す
(キャッシュ終了後のフレームレートはあんまり変わらないんだけど
 キャッシュされるまでのフリーズがとにかく不快でお話にならん)

これだったらHDDの方がまだマシやってなもんですよ

しゃーないのでテストに使ったUSBメモリはとりあえずReadyToBoost用にしますた

個人的に推奨するSLのキャッシュはRAMDISKっす
容量はまぁ2Gくらいでおk 64bitOSなら最善策の一つ

次がキャッシュ専用のSSD導入
デスクトップでしか使えない手ですが
これは別のソフトでも使えるので結構な効果が期待できるですよ
(なんで専用で買うかってーとSSDで書き込み繰り返すと寿命がストレスでマッハなので)

ReadyToBoostの導入
windows7以降の機能でランダムアクセスのキャッシュとしてUSBメモリを使用する方法
(HDDのシークタイム分の圧縮がメインの用途らしい)
メモリがマジでカッツカツでスワップしまくりのマシンとかだと劇的な効果がある"らしい"です
まだ導入してあんまり時間たってないので効果の程は?て感じ



ってなところかねぇ
以上

2014年7月5日土曜日

今更ながらllTeleportAgent命令について

軽くメモ程度に

http://wiki.secondlife.com/wiki/LlTeleportAgent/ja


この命令一見便利そうに見えて微妙に使いにくいのが

テレハブが指定されていてダイレクトTPが許可されてないSIMだと
任意座標へのTPが機能せずにテレハブ(もしくは最寄りのスポーンポイント)に飛ばされる

かといってTPさせたい先を全部スポーンポイント指定すると

こんどはマップ等でTPしてきたアバターを適切なランディングポイントに確実に誘導出来なくなる


つまり
ランディングポイントを固定しつつTPで移動をさせたい場合に大変都合が悪い(※1)


これの対策として有効そうなのは

・全部のスポーンポイントで正規のランディングポイントへの誘導を行う

・正規のランディングポイント以外ではHUD等で認証プロセスを通し 通らなかったらTPHOME

だいたいこの辺

HUD装着した状態での勝手TPは正規ルートにTPで戻せばおk


ってなところかねぇ

この命令
テレハブ使いつつ任意座標へのTPもさせられればかなり便利なんだけど

現状だと微妙に使いにくいのよねぇ


以上

(※1)なんで都合が悪いかというと
Sit型のテレポーターって他のプラットホームには無いので
 なにげにものすげー説明がめんどくさいのよ

 あとコンバットシステム的な運用をさせる場合
 死んだら即強制TPみたいな単純でわかりやすいオペレーションでないと
 不正対策とかソンビ行為とかの対策としてはすげー難しい
 (数SIM使うようなVICE系だとダイレクトTP許可してなおかつ
   死亡時にマップ表示させてTPする的なアイテムの装着を義務付けてる)