2010年4月9日金曜日

摩擦の実験で使ってるスクリプトっす

とりあえず出しておくっす。
細かい数字は実験しながら修正していけば良いっすね。
どうもぺんぎんっす( ◎v◎ )


数値はちょっと修正したっす。
結果のメールは1日動かしても5本来るか来ないかの感じっす。
さっき修正したバージョンを動かしたばっかりなもんっすから、
どれくらいの間隔で届くのかは勘っす。
修正前で1日3本のメールが来てたっすから、たぶんそれくらいっすね。

我ながら気持ち悪さ全開のモノを書いたので、
適宜書きなおして使ってくださいっす。
コピペして動かす分には問題ないっすよ。
ライセンスはGPL2でよろしくっす。

順番に使い方を説明するっす。
1.土台となる大き目のプリムをRez
2.そのプリムに以下のスクリプトを入れる



integer base_material;
integer listen_handle;

default
{
  state_entry()
  {
    listen_handle = llListen(-3, "", "", "");
    llSetPrimitiveParams([PRIM_MATERIAL, base_material]);
  }
  on_rez(integer start_params)
  {
    llResetScript();
  }
  listen(integer channel, string name, key id, string message)
  {
    llSetPrimitiveParams([PRIM_MATERIAL, (integer)message]);
  }
}




3.別の箱を土台の上、西端にRez
4.そのプリムに以下のスクリプトを入れる

 ※ただしメールアドレス(llEmailの部分)は書き換えること



vector pos0; // 初期位置
float force; // 加える力
integer box_material; // ボックスの材質
integer base_material; // 底板の材質
integer iterate_count; // 反復回数
list result; // 結果
list temp_result; // 途中経過

list fricture = // 摩擦係数(予測より小さい値を入れるのがポイント)
  [
    0.800, 0.510, 0.430, 0.690, 0.850, 0.550, 0.800, // 台: Stone
    0.510, 0.330, 0.260, 0.450, 0.530, 0.380, 0.550, // 台: Metal
    0.420, 0.250, 0.230, 0.400, 0.450, 0.325, 0.425, // 台: Glass
    0.690, 0.450, 0.400, 0.600, 0.750, 0.515, 0.750, // 台: Wood
    0.850, 0.530, 0.450, 0.750, 0.900, 0.625, 0.910, // 台: Flesh
    0.550, 0.390, 0.325, 0.515, 0.625, 0.430, 0.600, // 台: Plastic
    0.800, 0.550, 0.425, 0.750, 0.900, 0.600, 0.900 // 台: Rubber
  ];

MoveDefPos()
{
  force = llList2Float(fricture, base_material * 7 + box_material);
  llSetForce(ZERO_VECTOR, FALSE);
  llSetStatus(STATUS_PHYSICS, FALSE);
  llSetPos(pos0);
  llSetRot(ZERO_ROTATION);
  llSleep(1.0);
  llSetStatus(STATUS_PHYSICS, TRUE);
  llSleep(1.0);
}

default
{
  state_entry()
  {
    pos0 = llGetPos();
    box_material = iterate_count = 0;
    llSetStatus(PRIM_PHYSICS, TRUE);
    llSay(-3, (string)base_material);
    llSleep(1.0);
    force = llList2Float(fricture, base_material * 7 + box_material);
    llSetPrimitiveParams([PRIM_MATERIAL, box_material]);
    llSetForce(<force, 0.0, 0.0> * llGetMass() * 9.8, FALSE);
    llSetTimerEvent(2.0);
  }
  on_rez(integer start_params)
  {
    llResetScript();
  }
  touch_start(integer total_number)
  {
    if(llGetOwner() == llDetectedKey(0))
    {
      llSetTimerEvent(0.0);
      MoveDefPos();
      force = 0.0;
      llOwnerSay("stop");
    }
  }
  timer()
  {
    llSetTimerEvent(0.0);
    if(llVecMag(llGetVel()) < 0.001)
    {
      force += 0.0005;
      llSetForce(<force, 0.0, 0.0> * llGetMass() * 9.8, FALSE);
      llSetText("box_material: " + (string)box_material + "\n"
        + "force: " + (string)force,
        <1.0, 1.0, 1.0>,
        1.0);
    }
    else
    {
      temp_result += force;
      llOwnerSay((string)force);
      MoveDefPos();
      iterate_count++;
      if(iterate_count > 5)
      {
        iterate_count = 0;
        result += llListStatistics(LIST_STAT_MEAN, temp_result);
        temp_result = [];
        box_material++;
        if(box_material > 6)
        {
          box_material = 0;
          base_material++;
          if(base_material > 6)
          {
            llEmail(アドレス,
              "friction",
              llDumpList2String(result, "\n"));
            result = [];
            base_material = 0;
          }
          llSay(-3, (string)base_material);
          llSleep(1.0);
        }
        force = llList2Float(fricture, base_material * 7 + box_material);
        llSetPrimitiveParams([PRIM_MATERIAL, box_material]);
      }
    }
    llSetTimerEvent(2.0);
  }
}





5回1セットで、一巡したらメールを送ってるっす。
プリムの間で使ってる-3チャンネルに問題あれば変えてくださいっす。
力の向きはX軸の正の向きっすから、西から東っす。
必ず土台の西端に箱は置いてくださいっす。

メールは
(土台:S 箱:S)
(土台:S 箱:M)
(土台:S 箱:G)
  ・
  ・
  ・
(土台:S 箱:R)
(土台:M 箱:S)
(土台:M 箱:M)
  ・
  ・
  ・
(土台:R 箱:R)
の順で本文に49行入ってるっす。
7つずつ区切ると分かりやすいかもっすね。

0 件のコメント:

コメントを投稿

Free Avatar