とりあえず出しておくっす。
細かい数字は実験しながら修正していけば良いっすね。
どうもぺんぎんっす( ◎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 件のコメント:
コメントを投稿