question pour matheux

Répondre
Partager Rechercher
bonjour,

au départ j'ai 3 objets distincts dont je connais les coordonnées, qui forment un triangle ACB dans l'espace
si je déplace les points A et/ou B je souhaite que la rotation de l'objet C suive automatiquement la tangente de l'angle ACB sur son axe X

429247-1535715873-7137.png

quelqu'un peut me donner les formules entre vecteurs et rotations pour obtenir ça ?
Salut,

Ça fait un moment que j'ai pas utilisé le LSL ça va me dérouiller.

Ta notion de tangente est pour le moins... tangente... mais bon j'ai compris l'idée...

J'ai fait un petit test inline en mettant ce script dans l'objet A :

default
{
state_entry()
{
llSetTimerEvent(2);
}

timer()
{
llSay(11, (string)llGetPos());
}
}




Et celui-ci dans l'objet B :

default
{
state_entry()
{
llSetTimerEvent(2);
}

timer()
{
llSay(12, (string)llGetPos());
}
}

Jusque là on a juste deux objets qui donnent leur position toutes les 2 secondes...


C'est l'objet C le plus intéressant, voici le code que j'ai mis :

vector posA;
vector posB;

calcul() {
vector vecRef = posB - posA;
rotation rotActuelle = llGetRot();
vector vecBase = <1, 0, 0> * rotActuelle;
rotation rotDiff = llRotBetween(vecBase, vecRef);
llSetRot(rotActuelle * rotDiff);
}

default
{
state_entry()
{
llListen(11, "", NULL_KEY, "");
llListen(12, "", NULL_KEY, "");
}

listen(integer channel, string name, key id, string message)
{
if(channel == 11) {
posA = (vector)message;
calcul();
}
else if (channel == 12) {
posB = (vector)message;
calcul();
}
}
}

On écoute les objets A et B et quand ça bouge on calcule.


Le principe c'est de déterminer la rotation entre le vecteur formé par les deux objets A et B et le vecteur formé par l'axe X de l'objet C.

Une fois qu'on a cette rotation différentielle il n'y a plus qu'à l'appliquer à l'objet C et... l'affaire est pliée

PS : ce forum est toujours aussi pourri pour insérer du code... entre autres...

Dernière modification par bestmomo ; 31/08/2018 à 19h05.
sous toutes réserves et si je comprends bien les lignes de l'objet C tu ne prends en compte que le vecteur AB pour déterminer la rot de C, il y a 2 cas où ça ne fonctionne pas, si l'objet C bouge (ça c'est de ma faute je ne l'avais pas précisé car je ne pensais pas que cela soit possible et pourtant il peut bouger le bougre) et l'autre cas c'est si les 2 objets A et B bougent en même temps, du coup le vecteur entre les deux ne change pas et C ne voit rien ..
Citation :
Publié par what else !
sous toutes réserves et si je comprends bien les lignes de l'objet C tu ne prends en compte que le vecteur AB pour déterminer la rot de C, il y a 2 cas où ça ne fonctionne pas, si l'objet C bouge (ça c'est de ma faute je ne l'avais pas précisé car je ne pensais pas que cela soit possible et pourtant il peut bouger le bougre) et l'autre cas c'est si les 2 objets A et B bougent en même temps, du coup le vecteur entre les deux ne change pas et C ne voit rien ..
Mon script fait exactement ce que tu as demandé au départ mais apparemment ta demande était incomplète. Prenons les deux points évoqués :
  1. Si C bouge. En position ? Là pas de souci pour la rotation. En rotation ? Là faut-il lui apprendre à vivre et le ramener dans le droit chemin ?
  2. Si A et B bougent en même temps en conservant le vecteur : là je ne vois pas ce que ça change pour C
Donc il faudrait mieux reformuler le problème je pense...
c'est sur la notion de tangente que je m'exprime mal mais je ne sais pas comment le dire autrement, peut-être en disant que l'axe X de C doit toujours être perpendiculaire à la moitié de l'angle ACB

429247-1535748812-5037.png



le cas 1 montre les pos initiales des 3 objets ABC ainsi que la rot de C. (ils sont reportés en gris sur le cas 2)
dans le cas 2 je déplace simultanément A et B vers leur nouvelle pos par rapport à C qui lui ne change pas de pos,
pour rester tangent on voit bien que C doit changer de rot

je ne sais pas si je suis plus clair ?
Ah oui c'est plus clair et moins simple

Donc il faut être perpendiculaire à la bissectrice...

Calculer la bissectrice c'est pas compliqué faut juste ajouter les deux vecteurs mais pour la perpendiculaire... Une astuce consiste à faire deux produits vectoriels, voilà ce que ça donne pour le script dans C :

vector posA;
vector posB;

calcul()
{
vector posC = llGetPos();
rotation rotActuelle = llGetRot();
vector AC = posC - posA;
vector BC = posC - posB;
vector bisectrice = llVecNorm(AC + BC);
vector vecRef = llVecNorm((AC % BC) % bisectrice);
vector vecBase = <1, 0, 0> * rotActuelle;
rotation rotDiff = llRotBetween(vecBase, vecRef);
llSetRot(rotActuelle * rotDiff);
}

default
{
state_entry()
{
llListen(11, "", NULL_KEY, "");
llListen(12, "", NULL_KEY, "");
}

listen(integer channel, string name, key id, string message)
{
if(channel == 11) {
posA = (vector)message;
calcul();
}
else if (channel == 12) {
posB = (vector)message;
calcul();
}
}
}


Ça devrait déjà plus ressembler à ce que tu veux...
Bon alors si c'est ça c'est parfait

Dans mon code d'exemple je n'ai pas optimisé l'aspect temporel (tempos à 2s et fonction llSetRot lente) parce que la question portait sir la gestion des positions et rotations.

Ça illustre une nouvelle fois la difficulté de rédiger un cahier des charges correct. Lorsque je faisais des scripts à la demande je me heurtais systématiquement à cet écueil. En gros on a au moins un de ces soucis :

  • le client ne sait pas vraiment ce qu'il veut
  • le client sait ce qu'il veut mais n'avait pas réalisé qu'il existait une solution technique qui aurait amélioré et simplifié sa demande, en gros il s'est limité
  • le client sait exactement ce qu'il veut mais ne sait pas le formuler
  • le client est toujours pressé et bâcle le travail
  • le client ne pousse pas assez loin la réflexion dans sa demande...
Je pense que je pourrais encore en ajouter mais vous avez compris l'idée. J'avais d'ailleurs abandonné cette activité de script à la demande pour toutes ces raisons. Je devais faire un premier jet que je savais ne pas correspondre pour ensuite vraiment passer à un script presque définitif parce qu'il y a forcément ensuite quelques tâtonnement logiques.

Dans une esquisse métaphorique je retrouve ça inscrit dans les avatars (pas de SL mais) de la communication. Les demandes d'ordre psychologique s'échouent sur les mêmes obstacles et obscurités... Mais c'est une autre histoire, celle de la vraie vie .

Bonne journée à tous les survivants de ce forum.

PS : j'éprouve une grande joie chaque fois à cliquer ici le "non" sur l'énorme bandeau qui me demande si je suis d'accord pour me faire traquer par les publicités. Le RGPD a pourri la vie de dizaines de milliers de gens (j'en fais partie pour mettre en règle quelques sites et ce n'est pas du tout facile) mais a au moins le mérite d'enfin clarifier et soumettre à consentement (c'est l’appellation officielle) ce que l'on nous imposait auparavant.
hébé

1) le forum est pourri ...
2) il n'y a plus que des walking dead ...
3) les clients savent pas ce qu'ils veulent ...

Pas facile de rendre service aux gens ordinaires ...
tiens, ça va mettre un peu de douceur dans ta vie :
Qhttps://www.youtube.com/watch?v=-0R9vaJoVYQ

au sujet du point 3, est-ce qu'on pourrait tester une variante du dernier script,
dans la version actuelle, le vecteur X pointe perpendiculaire à la droite qui relie C au milieu du segment opposé AB
mais ça c'est pas vraiment la bissectrice, qui elle ne s'occupe pas du milieu du segment opposé, elle divise juste l'angle ACB en 2 angles égaux
et justement est-ce qu'on pourrait examiner cette solution du vecteur X qui pointe perpendiculaire à la bissectrice divisant l'angle ACB en 2 angles égaux
je soupçonne que ça sera encore plus précis que la version actuelle mais j'ai besoin de tester ça visuellement pour me rendre compte.
Salut,

T'en fais pas pour mon humeur elle va super bien .

Bon tu as raison pour la bissectrice, je suis allé un peu vite pour le coup. Voilà la fonction de calcul corrigée pour avoir effectivement la bissectrice :

calcul()
{
vector posC = llGetPos();
rotation rotActuelle = llGetRot();
vector AC = posC - posA;
vector BC = posC - posB;

float angleACB = llRot2Angle(llRotBetween(AC, BC));
vector verticale = llVecNorm(AC % BC);
rotation rotDemiAngle = llAxisAngle2Rot(verticale, angleACB / 2.0);
vector bissectrice = -(AC) * rotDemiAngle;
vector vecRef = llVecNorm(verticale % bissectrice);

vector vecBase = <1, 0, 0> * rotActuelle;
rotation rotDiff = llRotBetween(vecBase, vecRef);
llSetRot(rotActuelle * rotDiff);
}


Je soupçonne qu'on doit pouvoir directement diviser une rotation mais je ne sais pas comment faire alors j'ai décomposé avec le calcul de l'angle.
Désolé de m'immiscer dans votre discussion, mais je voulais juste dire que ça faisait un moment que je n'avais pas vu un post aussi passionnant sur ce forum.

Enfin des gens passionnés qui parlent de choses super intéressantes, auxquelles je ne comprend rien, mais dont je sens l'intelligence et sinon l'intelligence, au moins la culture.

Au fait, what else ! , à quoi va donc servir ce script ?
salut Anpton,

alors ce script sert à faire pointer un axe X perpendiculairement à la bissectrice divisant l'angle ACB en 2 angles égaux ....
naaan je deconne! haha

en fait c'est un script qui n'a que peu de rapport avec le sl in-world, mais j'utilise sl comme moyen de visualisation en 3D de la réalité rl.
lorsque je m'ennuie j'essaie de faire des trucs difficiles qui ne servent strictement à rien mais qui m'occupent l'esprit et là je cherche à visualiser le principe de fonctionnement d'un sextan.
sauf que ça dépasse un peu mes connaissances en algorithmie, il y a des angles de réfraction de partout et ça concerne aussi les rotations, le domaine de prédilection de Bestmomo qui doit bien être le seul ici à y comprendre quelque chose ..

promis, la prochaine fois je choisirai un sujet moins difficile, genre réaliser des sculptures cinétiques, ça ne sert absolument à rien non plus mais au moins c'est joli à voir et sl est un formidable outil pour expérimenter les formes et les mouvements, à la frontière entre les meshs et les scripts.
https://www.youtube.com/watch?v=nrzffjR3T8E
https://www.youtube.com/watch?v=gu-ruiyLnF4

bon je m'en vais tester la dernière mouture de Bestmomo ...

see you soon folks !
Cette fois le compte est bon, cette brique élémentaire à 3 points peut entrer dans la composition du sextant avec précision et fiabilité.
c'eût été dommage de me retrouver dans le triangle des Bermudes pour avoir perdu le nord à cause d'un appareil imprécis


429247-1535928853-7794.png

merci encore pour ton aide, à travers tes exemples je pense avoir compris comment fonctionne le produit vectoriel et comment on peut s'en servir pour manipuler les vecteurs, les angles et les rotations.
ah ça à l'air bien ce topo sur les "machines"
beaucoup d'infos sur la dynamique et les mobiles, exactement ce qu'il faut pour expérimenter dans sl la cinétique dont je parlais plus haut.
mais j'ai tellement de choses à faire avant .....
Répondre

Connectés sur ce fil

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