sabro
2007年12月01日 21:06
// ホーミング対象(敵)のKey key enemyKey = "xxxx-xxxx-xxxx-xxxx"; // 弾が発射された地点 vector firstPos; // 敵の現在地へ弾を移動させるために必要な力を計算する vector getForce(vector enemyPos) { vector myPos = llGetPos(); vector vel = llGetVel(); vector acc = llGetAccel(); // 弾と敵の距離 vector distance = enemyPos - myPos; // 弾発射地点から見て、敵より弾の方が遠い位置にあれば力は加えない vector firstPosDistance1 = enemyPos - firstPos; vector firstPosDistance2 = llGetPos() - firstPos; if(llVecMag(firstPosDistance2) > llVecMag(firstPosDistance1)) { return ZERO_VECTOR; } // 弾を敵の現在地へホーミングさせるために必要な、現在の速度と直角方向の加速度 float theta = llRot2Angle(llRotBetween(distance, vel)); float velMag = llVecMag(distance) * llCos(theta); float time = velMag / llVecMag(vel); vector newacc = (2 * (enemyPos - (myPos + time * vel)) / llPow(time, 2)) - acc; // 加速度が大きすぎる場合は補正 if(llVecMag(newacc) > 10) { newacc = newacc * 10 / llVecMag(newacc); } // 力 = 質量 × 加速度 return llGetMass() * newacc; } default { on_rez(integer start_param) { // 弾を浮かせる設定 vector v = llGetPos(); llSetHoverHeight(v.z - llGround(), FALSE, 1.0); // 1秒ごとに敵をサーチ llSensorRepeat("", enemyKey, AGENT, 100, PI, 1.0); // Rezされた位置を記録しておく firstPos = llGetPos(); } sensor(integer total_number) { vector pos = llDetectedPos(0); // 敵が見つかった場合、弾をホーミングさせるために力を加える llSetForce(getForce(pos), FALSE); } }
// 弾と敵の距離 vector distance = enemyPos - myPos;
// 弾発射地点から見て、敵より弾の方が遠い位置にあれば力は加えない vector firstPosDistance1 = enemyPos - firstPos; vector firstPosDistance2 = llGetPos() - firstPos; if(llVecMag(firstPosDistance2) > llVecMag(firstPosDistance1)) { return ZERO_VECTOR; }
// 弾を敵の現在地へホーミングさせるために必要な、現在の速度と直角方向の加速度 float theta = llRot2Angle(llRotBetween(distance, vel)); float velMag = llVecMag(distance) * llCos(theta); float time = velMag / llVecMag(vel); vector newacc = (2 * (enemyPos - (myPos + time * vel)) / llPow(time, 2)) - acc;
// 加速度が大きすぎる場合は補正 if(llVecMag(newacc) > 10) { newacc = newacc * 10 / llVecMag(newacc); }不自然な弾の動き
// 力 = 質量 × 加速度 return llGetMass() * newacc;