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
Received on Sun Nov 07 2021 - 16:09:13 CET