Salut les loulous,
Voili. Depuis pas mal de temps, quand je reviens sur SL, j'essaie de faire avancer une voiture toute seule en mode physique. Il y a quelques mois, vous m'aviez donné quelques pistes pour la faire suivre d'une espèce de carriole.
Le problème actuel qui se pose (qui me ronge, lol, c'est vrai en plus), c'est de la faire tourner smoothement dans les tronçons de virage. Jusqu'à présent, j'utilisais des petits parallélépipèdes transparents comme cibles successives que je semais dans les virages. Mais le problème, c'est que non seulement c'est très fastidieux à poser (surtout quand on veut changer le circuit ou qu'on déménage), mais c'est aussi "coûteux" en prims, puisqu'il en faut bien 5 par virage.
L'idée, c'est que lorsque le sensor de la voiture détecte le tronçon de virage d'un certain type (mettons virage à droite, 10m, 90°) et avec un certain nom, celle-ci suive une liste de points (positions/rotations) "virtuels" (et non des prims réels) calculés à partir du root détecté de ce virage. De sorte que la feignasse que je suis n'ait pas à ré-enregistrer à chaque fois un itinéraire ou à disséminer des prims comme des cailloux: tout serait dans le nom du tronçon.
Avec l'aide d'une "scripteuse" américaine que j'ai rencontrée sur un forum, j'ai fini par obtenir un script provisoire, qui ne marche pas. Elle s'obstine à vouloir travailler là dessus, mais j'ai le sentiment qu'elle ne maîtrise pas complètement le sujet (et elle me soutire à chaque fois 1500L pour une ou deux lignes de code modifiées sans que ça marche,

). Le voici:
integer target_id;
string CibleduSensor = "virage90";// ici, c'est le nom du virage qui déterminera le comportement de la voiture
float scandistance = 20.0;
float scanangle = PI;
list offsets = ["<-0.990,-0.40,0.0>","<-0,84.2,-0.62,0.0>","<-0,67,-0.830,0.0>", "<-0.34,-0.83,0.0>" ];// liste des offsets successifs calculés à partir du root
integer count;
move()
{
vector new_target = llGetPos() + (vector)llList2String(offsets,count);
llSay(0, "Je me dirige vers le point suivant " +(string)new_target);
llRotLookAt(llRotBetween(<1.0,0.0,0.0>,llVecNorm(new_target-llGetPos())),1.0,0.4);
llMoveToTarget(new_target, 4.0);
target_id = llTarget(new_target, 0.5);
}
default
{
state_entry()
{
llSetStatus(STATUS_PHYSICS,FALSE);
// llSetRot(ZERO_ROTATION);
count = 0;
}
touch_start(integer total_number)
{
llSetStatus(STATUS_PHYSICS,TRUE);
llSetBuoyancy(1.0);
llSensor(CibleduSensor,"",ACTIVE | PASSIVE,scandistance,scanangle);
}
sensor(integer num)
{
vector START = llDetectedPos(0);
llSay(0,"Le point de départ détecté est" + (string)START);
llMoveToTarget(START,4.0);
//llRotLookAt(llRotBetween(<1.0,0.0,0.0>,llVecNorm(START - llGetPos())),1.0,0.4);
target_id = llTarget(START,0.5);
}
no_sensor()
{
llSay(0,"yé pas trouvé le point de départ");
llResetScript();
}
at_target(integer tnum, vector targetpos, vector ourpos)
{
if (tnum == target_id)
{
++count;
llTargetRemove(target_id);
if (count >= llGetListLength(offsets))
{
llStopMoveToTarget();
llResetScript();
}
else
{
move();
}
}
}
}
Résultat:
- La voiture bouge un peu mais fait n'importe quoi et s'arrête au premier point/offset je crois bien.
- J'ai l'impression que la ligne llRotLookAt ne permet pas de bien calculer les rotations successives. Enfin, elle me paraît bizarroïde.
- De plus, si je modifie la position du circuit, comme les offsets sont calculés globalement et non par rapport au local du root, toutes les données seront fausses, j'imagine, alors quel intérêt?
Bref, si vous aviez des solutions, ce serait cool, car je crois que je vais me crasher avec ma voiture contre un mur en prims.