SCRIPT <<< téléguidage

Répondre
Partager Rechercher
bonjour,

je recherche un script permettant de téléguidé un objet a l'aide soit d'une télécommande soit d'un interface étant peux douer en script mais assez en 3D je viens demander de l'aide

donc si quelqu'un avait un script du genre ou s'il veux me contacter voici mon nom: Dry Lykkin

Merci a tous!
Déja, si tu veux diriger un truc a la voix:

Citation :
default
{
on_rez(integer parametre)
{
llResetScript();
}

state_entry()
{
llListen(0,"",llGetOwner(),"");

}
listen (integer channel, string name, key id, string message)
{
if (message == "haut")
{
llSetPos(llGetLocalPos() + <0, 0, 1>);
}

if (message == "bas")
{
llSetPos(llGetLocalPos() - <0, 0, 1>);
}


}

}
Bon, c'est un peu basique, je le reconnais ^^ mais c'est déja un petit début.
Mais tant qu'on est sur le sujet, j'aimerai demander si quelqu'un saurait comment, au lieu de parler, faire en sorte que l'objet se deplace selon les fleches directionelles...

Quelqu'un a une idée?

Et autre chose, si on met ceci:
llSetRot(llGetLocalRot() + <0, 0, 25,0>);

(Excusez s'il y a une erreur)
Le siege tourne bien, mais au moins de 180°, et ne tourne qu'une fois, meme si on recommence a plusieurs reprises, ou bien si on utilise
llSetRot(llGetLocalRot() - <0, 0, 25,0>);...

Une idée également?

Merci!
Citation :
Mais tant qu'on est sur le sujet, j'aimerai demander si quelqu'un saurait comment, au lieu de parler, faire en sorte que l'objet se déplace selon les flèches directionelles...
C'est possible à condition que l'objet demande (et obtienne) la prise de contrôle avec llRequestPermissions(key av, PERMISSION_TAKE_CONTROLS).

Citation :
Le siege tourne bien, mais au moins de 180°, et ne tourne qu'une fois, meme si on recommence a plusieurs reprises, ou bien si on utilise
llSetRot(llGetLocalRot() - <0, 0, 25,0>);...
Les angles dans les rotations sont en radians et non en degrés, et ce n'est pas un opérateur d'addition mais de multiplication qu'il faut utiliser. Dans ton exemple, si 25 exprime des degrés :

Code:
roration r = <0, 0, 25 * DEG_TO_RAD, 0>;
llSetRot(llGetRot() * r);       // pour une rotation en coordonnées globales
llSetRot(r * llGetRot());       // pour une rotation en coordonnées locales
De tête car je ne suis pas IW pour l'instant.

Hth
C'est pas tout à fait correct, on écrit pas la rotation en radian dans le quaternion mais dans un vecteur rot (en radian) que l'on transforme en quaternion.
Donc pour reprendre votre exemple:


Code:
 roration r = llEuler2Rot(<0, 0, 25 * DEG_TO_RAD>);
llSetRot(llGetRot() * r);       // pour une rotation en coordonnées globales
llSetRot(r * llGetRot());       // pour une rotation en coordonnées locales
donc que dois je faire pour pouvoir le diriger sur le sol avec les fleches directionnel?

car la j'ai un script de soucoupe volante mais bon pour un objet etant sensé rouler (non avec un bonhomme dessus) mais télécomandé ca ne m'arrange pas vraiment la soucoupe donc je vous mets le script et si quelqun sait ce qu'il fait faiure pour le changer de sorte que je puisse a téléguidé sur le sol....

1er script:

Citation :
//script for sitting cross legged on an object
//by Ananda Sandgrain - free to distribute but please don't sell!
key avatar;
vector pos = <-0.0,0,0.8>; //adjust the position to fit object -must be
//nonzero in at least one direction or script will not work!
rotation rot = <0,0,0,1>; //adjust rotation (1 in any vector gives 90 deg)
default
{
state_entry()
{
llSitTarget(pos, rot);
}
changed(integer change)
{
avatar = llAvatarOnSitTarget();
if(change & CHANGED_LINK)
{
if(avatar == NULL_KEY)
{
// You have gotten off
llStopAnimation("sit_ground");
llReleaseControls();
llResetScript();
}
else if(avatar == llAvatarOnSitTarget())
{
// You have gotten on
llRequestPermissions(avatar,PERMISSION_TRIGGER_ANIMATION );
}
}
}
run_time_permissions(integer perms)
{
if(perms)
{
llStopAnimation("sit");
llStartAnimation("sit_ground");
}
else
{
llUnSit(avatar);
}
}
}
2eme script:

Citation :
float LINEAR_TAU = 0.75;
float TARGET_INCREMENT = 0.5;
float ANGULAR_TAU = 1.5;
float ANGULAR_DAMPING = 0.85;
float THETA_INCREMENT = 10;// 0.3
integer LEVELS = 0;
vector pos;
vector face;
float brake = 0.5;
key gOwnerKey;
string gOwnerName;
key gToucher;
key Driver;
string Name1 = "Illume Skallagrimson";
string Name2 = "Chimera Lily";
string gFLYING = "FALSE";
string sound="power";
key id;
integer nudge = FALSE;
vector POSITION;
integer auto=FALSE;
help()
{
llWhisper(0,"Commands:");
llWhisper(0,"Left click craft = Start ");
llWhisper(0,"Left click craft = Stop and release contol");
llWhisper(0,"1! through 9!, slow or warp = Set power");
llWhisper(0,"view! = Align view to craft");
llWhisper(0,"menu = Display options");
llWhisper(0,"PgUp or PgDn = Gain or lose altitude");
llWhisper(0,"Arrow keys = Left, right, forwards and back");
llWhisper(0,"Shift + arrow Left, Right = Rotate but maintain view");
llWhisper(0,"PgUp + PgDn = Set cruise on or off");
}
default
{
state_entry()
{
gOwnerKey = llGetOwner();
gOwnerName = llKey2Name(llGetOwner());
llSoundPreload(sound);
llStopSound();
llSetTimerEvent(0.0);
llMessageLinked(LINK_ALL_CHILDREN, 0, "stop", id);
llSetStatus(STATUS_PHYSICS, FALSE);
llSetStatus(STATUS_ROTATE_X | STATUS_ROTATE_Y, TRUE);
llSleep(0.1);
llSetStatus(STATUS_ROTATE_X | STATUS_ROTATE_Y, FALSE);
llSetStatus(STATUS_PHYSICS, TRUE);
llMoveToTarget(llGetPos(), 0);
llRotLookAt(llGetRot(), 0, 0);
llSetStatus(STATUS_PHYSICS, FALSE);
LEVELS = CONTROL_FWD | CONTROL_BACK | CONTROL_ROT_LEFT | CONTROL_ROT_RIGHT | CONTROL_UP | CONTROL_DOWN | CONTROL_LEFT | CONTROL_RIGHT | CONTROL_ML_LBUTTON;
TARGET_INCREMENT = 0.5;
llSitTarget(<-0.8, 0.0, 1.0>, ZERO_ROTATION);
llSetCameraEyeOffset(<-10.0, 1.0, 3.0>);
llSetSitText("Get in");
llSetCameraAtOffset(<0, 1.0, 0>);
llWhisper(0,"By your command ... click again to engage. Type menu for options.");

// this sets a Listen with no callback in this state...
llListen(0, "", "", "");
state Listening;
}

}
state Listening
{
// Here we set up the Listen that is used in the Listening state...
state_entry()
{
llListen(0, "", "", "");
}

// the rest was here before...
// This is the click callback
touch_start(integer total_number)
{
if (llSameGroup(llDetectedKey(total_number - 1))==1 || llDetectedName(total_number - 1)==Name1 || llDetectedName(total_number - 1)==Name2)
{
if (gFLYING == "FALSE")
{
gFLYING = "TRUE";
llSetStatus(STATUS_PHYSICS, TRUE);
Driver=llDetectedKey(total_number - 1);
state StateDriving;
}
}
else
{
llWhisper(0,"You must own or belong to this group to fly craft");
llInstantMessage(gOwnerKey,llDetectedName(total_number - 1) + " is touching your craft");
}
}

// Here is the Listen callback
listen(integer chan, string name, key id, string msg)
{
if (llSameGroup(id)==1)
{
if (llToLower(msg) == "menu")
{
help();
}
}
}

// and this is an on-rez callback
on_rez(integer start_param)
{
llResetScript();
}
}
state StateDriving
{
state_entry()
{
llWhisper(0, "All systems go !!");
llRequestPermissions(Driver, PERMISSION_TAKE_CONTROLS);
llMoveToTarget(llGetPos(), LINEAR_TAU);
llRotLookAt(llGetRot(), ANGULAR_TAU, 1.0);

// Added listen here as well.... for same reason...
llListen(0, "", "", "");
}

touch_start(integer total_number)
{
if (llDetectedKey(total_number - 1)==Driver)
{
llWhisper(0,"Controls back to you");
gFLYING = "FALSE";
auto=FALSE;
llSleep(1.5);
llSetStatus(STATUS_PHYSICS, FALSE);
llMessageLinked(LINK_ALL_CHILDREN, 0, "stop", id);
llSetTimerEvent(0.0);
llReleaseControls();
llResetScript();
}
}

listen(integer chan, string name, key id, string msg)
{
if (id==Driver)
{
if (llToLower(msg) == "view!")
{
llReleaseControls();
llRequestPermissions(Driver, PERMISSION_TAKE_CONTROLS);
}
if (llToLower(msg) == "menu")
{
help();
}
if (llToLower(msg) == "warp")
{
TARGET_INCREMENT = 10.0;
string TIspew = (string)TARGET_INCREMENT;
TIspew = llGetSubString(TIspew,0,3);
llWhisper(0,"Power: " + llGetSubString((string)TARGET_INCREMENT,0,3));
}
if (llToLower(msg) == "slow")
{
TARGET_INCREMENT = 0.5;
llWhisper(0,"Power: " + llGetSubString((string)TARGET_INCREMENT,0,3));
}
if (llToLower(msg) == "1!")
{
TARGET_INCREMENT = 0.75;
llWhisper(0,"Power: " + llGetSubString((string)TARGET_INCREMENT,0,3));
}
if (llToLower(msg) == "2!")
{
TARGET_INCREMENT = 1.0;
llWhisper(0,"Power: " + llGetSubString((string)TARGET_INCREMENT,0,3));
}
if (llToLower(msg) == "3!")
{
TARGET_INCREMENT = 1.5;
llWhisper(0,"Power: " + llGetSubString((string)TARGET_INCREMENT,0,3));
}
if (llToLower(msg) == "4!")
{
TARGET_INCREMENT = 2.0;
llWhisper(0,"Power: " + llGetSubString((string)TARGET_INCREMENT,0,3));
}
if (llToLower(msg) == "5!")
{
TARGET_INCREMENT = 3.0;
llWhisper(0,"Power: " + llGetSubString((string)TARGET_INCREMENT,0,3));
}
if (llToLower(msg) == "6!")
{
TARGET_INCREMENT = 4.0;
llWhisper(0,"Power: " + llGetSubString((string)TARGET_INCREMENT,0,3));
}
if (llToLower(msg) == "7!")
{
TARGET_INCREMENT = 5.0;
llWhisper(0,"Power: " + llGetSubString((string)TARGET_INCREMENT,0,3));
}
if (llToLower(msg) == "8!")
{
TARGET_INCREMENT = 6.0;
llWhisper(0,"Power: " + llGetSubString((string)TARGET_INCREMENT,0,3));
}
if (llToLower(msg) == "9!")
{
TARGET_INCREMENT = 7.0;
llWhisper(0,"Power: " + llGetSubString((string)TARGET_INCREMENT,0,3));
}
}
}
run_time_permissions(integer perm)
{
if (perm == PERMISSION_TAKE_CONTROLS)
{
llMessageLinked(LINK_ALL_CHILDREN, 0, "slow", id);
llPlaySound(sound,0.3);
llTakeControls(LEVELS, TRUE, FALSE);
}
else
{
llWhisper(0,"Stopped");
llSetTimerEvent(0.0);
gFLYING = "FALSE";
llSleep(1.5);
llResetScript();
}
}
control(key driver, integer levels, integer edges)
{
pos *= brake;
face.x *= brake;
face.z *= brake;
nudge = FALSE;
llMessageLinked(LINK_ALL_CHILDREN, 0, "slow", id);
if (levels & CONTROL_FWD)
{
if (pos.x < 0) { pos.x=0; }
else { pos.x += TARGET_INCREMENT; }
nudge = TRUE;
}
if (levels & CONTROL_BACK)
{
if (pos.x > 0) { pos.x=0; }
else { pos.x -= TARGET_INCREMENT; }
nudge = TRUE;
}
if (levels & CONTROL_UP)
{
llMessageLinked(LINK_ALL_CHILDREN, 0, "fast", id);
llPlaySound(sound,0.3);
if(pos.z<0) { pos.z=0; }
else { pos.z += TARGET_INCREMENT; }
face.x=0;
nudge = TRUE;
}
if (levels & CONTROL_DOWN)
{
llMessageLinked(LINK_ALL_CHILDREN, 0, "fast", id);
llPlaySound(sound,0.2);
if(pos.z>0) { pos.z=0; }
else { pos.z -= TARGET_INCREMENT; }
face.x=0;
nudge = TRUE;
}
if ((levels) & (CONTROL_LEFT|CONTROL_ROT_LEFT))
{
if (face.z < 0) { face.z=0; }
else { face.z += THETA_INCREMENT; }
nudge = TRUE;
}
if ((levels) & (CONTROL_RIGHT|CONTROL_ROT_RIGHT))
{
if (face.z > 0) { face.z=0; }
else { face.z -= THETA_INCREMENT; }
nudge = TRUE;
}
if ((levels & CONTROL_UP) && (levels & CONTROL_DOWN))
{
if (auto)
{
auto=FALSE;
llWhisper(0,"Cruise off");
llSetTimerEvent(0.0);
}
else
{
auto=TRUE;
llWhisper(0,"Cruise on");
llSetTimerEvent(0.5);
}
llSleep(0.5);
}

if (nudge)
{
vector world_target = pos * llGetRot();
llMoveToTarget(llGetPos() + world_target, LINEAR_TAU);

vector eul = face;
eul *= DEG_TO_RAD;
rotation quat = llEuler2Rot( eul );
rotation rot = quat * llGetRot();
llRotLookAt(rot, ANGULAR_TAU, ANGULAR_DAMPING);
}
}

timer()
{
pos *= brake;
if (pos.x < 0) { pos.x=0; }
else { pos.x += TARGET_INCREMENT; }
vector world_target = pos * llGetRot();
llMoveToTarget(llGetPos() + world_target, LINEAR_TAU);
}

}
Citation :
C'est pas tout à fait correct, on écrit pas la rotation en radian dans le quaternion mais dans un vecteur rot (en radian) que l'on transforme en quaternion.
En effet, c'est pas tout à fait correct mais surtout parce que je n'étais pas assez réveillée et que j'ai oublié ma trigo dans l'histoire :

Code:
float angle = 25.0 * DEG_TO_RAD;
rotation r = <0.0, 0.0, llSin(angle/2), llCos(angle/2)>;
Mais c'est bien sûr plus simple de faire comme tu dis
comme je l'ai dit je comprends rien au script
Faire qu'au lieu de voler avec le script que j'ai mis qu'il reste au sol en changeant la script que j'ai donner (en sachant qu'il ne doit pas voler mais rester au sol et aussi en sachant que quand il tourne il y a un angle de X° ) ou bien me donner un autre script plus simple....


merci a tous!
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés