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);//ウェイト
        }
    }
}

大体この辺かね
以上

0 件のコメント:

コメントを投稿