Newsgroup: it.scienza.fisica
Titolo: [semi-OT] quesito conversioni angoli roll-pitch-yaw

 
penso sia semi OT, o forse OT (è geometria in effetti), ma 
per voi è una passeggiata di un attimo
 
premesso, sto scrivendomi dei programmini "helper" per 
OpenSCAD, ossia che costruiscono arrays di coordinate o di 
angoli nel formato "roll-pitch-yaw" che poi OpenSCAD usa 
nativamente.
 
Esternamente, genero dei "path" (con funzioni che in un 
linguaggio "vero", non me ne vogliano i puri funzionalisti 
:D, diciamo dichiarativo, possono banalmente essere 
iterative, mentre in uno funzionale diventano ricorsive e mi 
ci perdo), ossia generiche SPEZZATE angolose, e creo le 
coordinate a cui poi spostare "oggetti" costruiti con openscad.
 
Dopodiché, questi oggetti però non dovrebbero venire solo 
TRASLATI alle coordinate date, ma opzionalmente RUOTATI in 
3D (mi sto sforzando di ottenere una "pseudo" tangenza, 
usando la direzione SECANTE il percorso 3D per i due punti 
confinanti, il precedente e il successivo, e tanto mi 
basta), ma ho un problema di conversione.
 
Mi spiego meglio.
 
in INPUT ho due punti (con uno intermedio), da cui ricavo
DeltaX, DeltaY e DeltaZ  (riferiti alla secante passante per 
gli stessi).
 
Devo convertirli in angoli di rotazione per poter disporre 
un oggetto correttamente ruotato nel punto intermedio agli 
stessi.
 
Ora ioe la cavicchio con le coordinate SFERICHE (che hanno 
un raggio o modulo, e soli DUE ANGOLI, zenitale e 
azimutale), e ho già qualche routine che dai 3 Delta ottiene 
Azimut e Zenith, così come pure l'inverso (usando dei delta 
normalizzati a 1 per convenzione mia, perché ovviamente 
l'inverso non ha una soluzione univoca).
 
 
Ma la funzione rotate () nativa non usa i due angoli delle 
coordinate sferiche,
invece vuole TRE angoli ROLL / PITCH / YAW
e io non so come ottenerli a partire
 
 
P.S. dalla terna di angoli ROLL / PITCH / YAW mi sono 
trascritto (ho brutalmente copiato codice altrui open) una 
routine che crea una matrice di rotazione quadrata 3x3, 
perché a volte mi serve ruotare gli oggetti direttamente 
dentro l'altro linguaggio, e non invocare rotate () nativa 
di openSCAD.
 
L'inverso non l'ho implementato perché non mi serve in 
nessuno scenario concreto.
 
Ma mi resta il problema di fondo che non so come convertire 
la notazione "angoli zenith/azimut in coord sferiche" nella 
notazione "angoli roll/pitch/yaw" usata da openSCAD, né il 
contrario.
 
E o non trovo nada, oppure se lo vedo, non capisco nemmeno 
che sia quello l'argomento.
 
Mi accontenterei se sapeste indicarmi una risorsa in rete. 
Intanto spulcio in Rosetta Code, ma dispero abbastanza.
 
 
-- 
1) Resistere, resistere, resistere.
2) Se tutti pagano le tasse, le tasse le pagano tutti
Soviet_Mario - (aka Gatto_Vizzato)

contrario.
 
Ma gli angoli roll/pitch/yaw (o sia: rollio/beccheggio/imbardata) non
sono banalmente le rotazioni attorno ai rispettivi assi x,y,e z?
 
Comunque c'e' un grado di liberta' che non torna: zenith/azimut
identificano un punto su una sfera, mentre roll/pitch/jaw descrivono
l'assetto 3D di un *solido*. Cioe', se si vuole che un aereo punti a
(zenith/azimut) e' sufficiente imbardare di -azimut e beccheggiare di
-zenith; il rollio e' ininfluente.
 
Comunque probabilmente il problema e' elementare se formulato -- come
non hai fatto -- in termini elementari. Ciao

 non hai fatto -- in termini elementari. Ciao
 
eh non mi è semplice, infatti. Riprovo.
 
Dispongo di due punti 3d
P1 (X1, Y1, Z1) e
P2 (X2, Y2, Z2)
che individuano un segmento orientato a caso con pendenze, è 
un vettore, ha anche un verso
 
S [DX, DY, DZ]
 
 
da parte ho un oggetto 3D di forma qualsiasi, di cui conosco 
solo alcune coordinate ma non i punti generati, che diciamo 
abbia un proprio ASSE DI RIFERIMENTO interno (gli oggetti 
nativi fanno riferimento all'asse X ma è irrilevante).
 
 
Ora io voglio disporre l'asse interno dell'oggetto (che NON 
conosco e openSCAD non espone le sue coordinate, ma so 
essere allineato all'asse X) parallelamente al segmento DX.
 
 
E per fare ciò ho una sola funzione nativa, rotate () che 
richiede TRE angoli, roll pitch and jaw, che sono quelli che 
avevi detto.
 
quindi noti DX, DY e DZ,  devo ricavare  roll pitch and jaw
 
I dati mi bastano ? Direi di sì ... ma non so come 
ragionare. (al contrario so convertire il segmento in 
coordinate sferiche normali, che però non mi servono a una 
cippa).


Soviet_Mario ha scritto:
 > Dispongo di due punti 3d
 > P1 (X1, Y1, Z1) e
 > P2 (X2, Y2, Z2)
 > che individuano un segmento orientato a caso con pendenze, è
 > un vettore, ha anche un verso
 >
 > S[DX, DY, DZ]
 >
 > da parte ho un oggetto 3D di forma qualsiasi, di cui conosco
 > solo alcune coordinate ma non i punti generati, che diciamo
 > abbia un proprio ASSE DI RIFERIMENTO interno (gli oggetti
 > nativi fanno riferimento all'asse X ma è irrilevante).
 >
 > Ora io voglio disporre l'asse interno dell'oggetto (che NON
 > conosco e openSCAD non espone le sue coordinate, ma so
 > essere allineato all'asse X) parallelamente al segmento DX.
Vorrai dire parallelamente al vettore S!
 
 > E per fare ciò ho una sola funzione nativa, rotate() che
 > richiede TRE angoli, roll pitch and jaw, che sono quelli che
 > avevi detto.
 >
 > quindi noti DX, DY e DZ, devo ricavare  roll pitch and jaw
 >
 > I dati mi bastano? Direi di sì ... ma non so come
 > ragionare. (al contrario so convertire il segmento in
 > coordinate sferiche normali, che però non mi servono a una
 > cippa).
 
Bene, ora ti do istruzioni che devi solo seguire passo passo.
1) Vai in wikipedia, "rotation matrix".
2) Vai al capitolo "In three dimensions", par. "General matrix".
3) Come ti è giò stato detto, il roll è inutile, dato che hai solo da
orientare un vettore. Poni quindi gamma=0, il che semplifica molto la
matrice:
 
[ca*cb, .sa,  ca*sb]
[sa*cb,  ca,  sa*sb]
[  -sb,   0,     cb]
 
dove sa := sin(alfa), ecc.
 
4) Se applichi questa al vettore colonna [1,0,0] ottieni
[ca*cb,sa*cb,-sb], che dovresti porre uguale a [Dx,Dy,Dz].
 
5) Questo non è possibile perché il primo vettore ha modulo 1, il
secondo no. Quindi devi prima normalizzare [Dx,Dy,Dz) dividendo per il
modulo. Chiamo [Dx',Dy',Dz'] il vettore normalizzzato.
 
5) Uguagliando:
ca*cb = Dx'
sa*cb = Dy'
   -sb = Dz'.
 
La terza determina beta.
Dividendo la seconda per la prima:
tg(alfa) = Dy'/Dx' = Dy/Dx
che determina alfa.
 
6) Ci sono casi eccezionali che puoi trattare a parte oppure usando
atan2 o come si chiama nel linguaggio che usi.
 
7) Spero
a) di essere stato chiaro
b) di non aver fatto errori.
-- 
Elio Fabri

quindi noti DX, DY e DZ,  devo ricavare  roll pitch and jaw
 
beccheggiare di arcsin(DZ/sqrt(DX^2+DY^2+DZ^2))
imbardare di arcsin(DY/sqrt(DX^2+DY^2))
rollare di importasega
 
Ciao

imbardare di arcsin(DY/sqrt(DX^2+DY^2))
 
no: prima si imbarda poi si beccheggia. Attenzione poi che se DX<0
l'imbardata e' il supplementare di arcsin(DY/sqrt(DX^2+DY^2)). Ciao

Il 07/11/21 16:40, El Filibustero ha scritto:

grazie mille anche a te ! Questa sembra pure una soluzione 
"precotta e predigerita" :D lol.
 
ah cmq sì, allineato era parallelo, anzi "coincidente", 
quando OpenScad costruisce a simmetria cilindrica, solo 
parallelo se no.


Soviet_Mario ha scritto:
 > grazie mille anche a te! Questa sembra pure una soluzione
 > "precotta e predigerita" :D lol.
Naturalmente non ti sei accorto che la mia sol. e quella di ElFil sono
diverse...
Il che non vuol dire che una sia giusta e l'altra sbagliata.
Speravo di poter evitare di dirtelo, ma purtroppo l'argomento è un
gigantesco casino.
 
L'articolo di wiki che ti ho indicato ha una sezione intitolata
"Ambiguities".
Dagli una scorsa, senza cercare di capire, ma solo per renderti conto
che il casino è noto e dichiarato.
 
Il problema è che tu gli angoli li devi dare in pasto alla tua
funzione rotate() e non so se hai un manuale che descriva
*esattamente* che cosa fa questa funzione.
La soluzione sarebbe di scoprirlo per tentativi, ma non so se ne sei
capace.
 
Qualche suggerimento.
Per prima cosa, prova a dare alla funzione tre angoli di cu uno solo
non nullo e semplice: per es 90°:
rotate(90,0,0)
rotate(0,90,0)
rotate(0,0,90).
Se puoi vedere le matrici, capisci che cosa fanno. Saranno rotazioni
di 90°, ma devi vedere rispetto a quali assi e in che verso.
 
Poi prova a comporre due rotazioni, per es. rotate(90,0,0) e
rotate(0,90,0).
Verifica se rotate(90,90,0) è la matrice prodotto e in che ordine.
 
Fatto questo potrai sapere se corrisponde o no alla matrice come è
scritta nell'articolo.
 
C'è pure un'altra cosa da verificare: che verso è preso positivo per i
tre angoli di roll, pitch, yaw.
Le matrici dell'articolo prendono positive le rotazioni antiorarie
rispetto agli assi indicati.
Ma non è detto che sia sempre così.
 
Esempio.
Se hai una barca, direi che l'asse x sia sempre da poppa a prua.
L'asse z punta verso lo zenit.
Di conseguenza l'asse y punta verso sinistra (è babordo o tribordo?)
guardando la prua.
 
Ora il problema è col beccheggio (pitch).
Secondo le convenzioni che ho detto, un beccheggio positivo sarebbe
una rotazione attorno all'asse y in senso antiorario.
Quindi un beccheegio di +10° *abbassa* la prua di 10°.
Ho una gran paura che la convenzione marinara sia opposta, ma posso
sbagliare.
Lo puoi verificare come ho già detto: dopo che hai identificato quale
dei tre arogomenti di rotate è l'angolo di pitch, esegui un pitch di
10° e guarda l'effetto che fa.
 
La stessa cosa dovresti fare per rollio e imbardata, anche se in
questi casi sarei più tranquillo.
Ma una verifica non fa male.
E scriviti tutto!
Sia per ricordartelo, sia per chiedere aiuto, se del caso.
 
Ti aspettano giorni di puro divertimento :-D
-- 
Elio Fabri

 Ma non è detto che sia sempre così.
 
mi pare che sia così, anche se c'era qualche caveat. Ma è il 
meno, uno lo vede a occhio e cambia un segno in quel caso 
(oppure fa l'angolo complementare a 360)

Mi devo studiare la seconda versione di
rotate (Angolo, Asse) cmq.
Se fa quel che voglio, e se riesco a farglielo fare, ho 
aperto un vaso di Pandora per niente ... o boh, non del 
tutto in realtà.
Con quei programmini helper esterni e l'incollamento di 
array precalcolati, qualche agevolazione l'ho già trovata 
nel generare "ruote dentate"
MA in realtà non sto cercando di pilotare la stampante 3D 
... lo ammetto, mi sto mettendo a "disegnare" ... castelli 
medioevali virtuali :\


medioevali virtuali :\
 
Se questo e' lo scopo, non esistono gia' potentissimi tool grafici che
evitano di annoyare l'utente con calcoli di bassissimo livello? Ciao

Soviet_Mario ha scritto:
 > diciamo che mi sono sembrate diverse all'apparenza, ma non
 > le ho ancora implementate, sicché non ho potuto verificare
 > se e dove lo fossero nelal sostanza, per cui mi sono
 > astenuto da osservazioni
Le differenze sono due.
La prima sta nell'angolo di pitch.
ElFil lo definisce in modo che riesce positivo se Dz>0, io l'opposto.
Ho già spiegato come mai io lo do negativo.
La seconda è nell'ordine delle due rotazioni.
Non ho approfondito, ma ElFil prima ha dato un ordine poi l'ha
corretto.
Non ho verificato quale delle due versioni concorda con la mia.
 
 > no questo l'ho intuito, perché con OpenSCAD me la cavicchio,
Continui a parlare di questo OpenSCAD come se fosse scontato che
chiunque sappia che cos'è.
Invece io non ne ho la minima idea. Sarò il solo?
 
 > L'altra invece (e tra l'altro forse fa quel che vorrei ma
 > non l'ho mica capito), chiede un vettore che funge da asse
 > di rotazione, e un angolo, che è la rotazione attorno a
 > quell'asse ....
Cavolo, e adesso lo dici? E' la soluzione più semplice.
Tu hai un vettore [1,0,0] che deve diventare parallelo a [Dx,Dy,Dz].
E' ovvio che l'asse di rotazione è la bisettrice delle semirette dei
due vettori, e l'angolo è 180°.
Non mi dici come viene dato l'asse di rotione: forse come vettore
unitario?
In ogni caso si procede così.
Poniamo per brevità u := [1,0,0], v := [Dx',Dy',Dz'] (vettori
unitari).
Calcola w := (u+v)/2 e poi normalizza: questo è l'asse di rotazione.
 
 > applica le rotazioni nell'ordine menzionato dagli argomenti
 > formali, è molto prevedibile.
Cioè
rotate(a,b,c) = rotate(0,0,c) * rotate(0,b,0) * rotate(a,0,0) ?
 
 > MA in realtà non sto cercando di pilotare la stampante 3D
 > ... lo ammetto, mi sto mettendo a "disegnare" ... castelli
 > medioevali virtuali :\
Questo per me è arabo, ma non ha importanza.
-- 
Elio Fabri

Il 08/11/21 11:50, El Filibustero ha scritto:

non saprei, con Blender non ho mai potuto superare 
l'ostacolo dell'interfaccia. Un'interfaccia di comando a 
codice C-like mi è stata più intuitiva.
 
La mia scelta cmq è ricaduta su un tool molto 
"parametrizzabile" diciamo, che dopo avere sviluppato dei 
moduli, possa produrre una gran varietà di modelli di 
aspetto diversi.


 Questo per me è arabo, ma non ha importanza.
 
ma non c'è niente da capire in realtà : OpenSCAD è un 
modellatore che costruisce poligoni in 3D in base a codice 
di aspetto vagamente C-like.


codice C-like mi è stata più intuitiva.
 
a me cio' fa sovvenire
 
https://groups.google.com/g/it.scienza.matematica/c/iQ-jlOVyq80/m/R7XGZwopAgAJ
 
 
e successivi thread analoghi. Ciao

Il 08/11/21 19:43, El Filibustero ha scritto:

cavoli !!!! Sto guardando un po' la documentazione di 
PROCESSING (open source o free). Sembra veramente poderoso !!!
 
Grazie della segnalazione. Altra roba da spulciare pazientemente


 PROCESSING (open source o free). Sembra veramente poderoso !!!
 
uhm, al momento però, non riesco né a installarlo né a farlo 
girare :\
 
Dopo avere scaricato e decompresso il ponderoso archivio, 
uno script chiamato install.sh non produce nessun risultato 
né errori. E altrove non trovo nulla da eseguire.
Boh.
 
That's java !


 
 
provo con la "penultima" versione che c'è nel repo come 
FLATPAK ...


FLATPAK ...
 
Comunque il concetto e' un altro. Al di la' dello specifico tool
impiegato, al di la' dell' interfaccia (sia essa cliccare e draggare
col mouse o mettere una riga di testo), e' *impossibile* che in un
tool grafico non vi sia il comando
 
"ruota questo oggetto attorno a questo suo punto in modo da mettere
questo suo asse parallelo a questo segmento"
 
senza bisogno di annoyare l'utente con i conti della serva. Ciao