Le variabili sono:
ox, oy, oz - coordinata del centro-assi;
x1, y1, z1 - coordinata iniziale del punto da ruotare;
x2, y2, z2 - coordinata del punto ruotato;
ax, ay, az - angoli di rotazione per i rispettivi assi.
Spero di non chiedere troppo... scusate l'ignoranza e grazie a tutti.
Alberto
> Ciao a tutti.
> Sono un programmatore, ma quanto a matematica...
> Sto cercando di realizzare una routine per ruotare un punto in uno
> spazio 3D
ruotare un punto ? Un punto ha una sola dimensione... anche se lo ruoti non
cambia posizione o orientamento...
o forse intendi ruotare il punto di vista ??
d
--
moio x la lyberta'
http://www.autistici.org/darko
>Le variabili sono:
>ox, oy, oz - coordinata del centro-assi;
>x1, y1, z1 - coordinata iniziale del punto da ruotare;
>x2, y2, z2 - coordinata del punto ruotato;
>ax, ay, az - angoli di rotazione per i rispettivi assi.
Ma non li trovi gia` fatti?
Cmq se il punto ruota bastano ax, ay, az, se invece va
da 1 a 2, questa e` una traslazione che generalmente si
aggiunge alle rotazioni ax,y,z ..in definitiva mi sa che
vuoi un moto elicoidale generico, o vuoi che ax avvenga
prima o come dire "separatamente" da ay e da az?
--
Ciao, | Attenzione! campo "Reply-To:" alterato ;^)
Remigio Zedda | E-mail: remi...@tiscali.it
-- Linux 2.4.22 su Slackware 9.1
Alberto
Alberto
http://www.codeguru.com/vb/articles/2014.shtml
p.s.
devi cercare su san google "Engine 3d"
Bye man!
:-)
--
Il Wodkino Nazionale è a : www.martek.it
Pagina Vb/Bestiario/Lamer Experience :
http://www.martek.it/go.asp?portamia=2 Quotefix e altro:
http://www.martek.it/go.asp?portamia=4
Usr: ICLVB Pw: amici
> Cerco di esprimere meglio.
> Non volevo dire ruotare un punto sul suo asse, ma spostarlo in uno
> spazio 3D intorno ad uno o più assi contemporaneamente.
> Per essere ancora più chiaro, se voglio vedere un oggetto
"oggetto" va gia' meglio in quanto si presume che non sia composto da un
solo punto. Anche se in realta', un punto puo' cambiar posizione ruotando
qualora il punto non sia parte dell'asse di rotazione.
> da diverse
> angolazioni, devo spostare tutti i punti che lo compongono e io dovrei
> farlo attorno agli assi dell'oggetto stesso.
Credo che l'inghippo sia proprio qui. Non mi intendo un granche' di motori
3D, ma qualche esperienza ce l'ho. Innanzi tutto non e' affatto vero che se
vuoi vedere un oggetto da angolazioni diverse devi ruotare l'oggetto!
Bensi' dovrai ruotare il punto di vista! Si tratta proprio di 2 algoritmi
differenti.
Se invece devi effettivamente ruotare l'oggetto, puoi procedere cosi'.
Il tuo oggetto, che d'ora in poi chiamero' ogg, se ha 3 dimensioni avra'
allora certamente un asse orizzontale, un asse verticale ed uno laterale
che passano tutti per il punto mediano (la mezzeria, insomma).
alpha e' l'angolo che si forma tra ogg(X) e ogg(Y) cioe' l'angolo che si
forma tra l'asse orizzontale e l'asse verticale dell'oggetto.
Diciamo che vogliamo ruotare l'asse delle X dell'oggetto di 45 gradi allora
il nuovo valore di alpha e':
alpha += PI/4 (detto in maniera comprensibile ad un programmatore ;)
Adesso, tutte le coordinate "x" di tutti i punti dell'oggetto subirano una
rotazione di 45 gradi da una parte e -45 dall'altra (in quanto l'asse passa
per il punto di mezzeria). per calcolare l'effettivo spostamento in pixel,
poniano che il punto P dell'oggetto sia definito dalle seguenti coordinate
P=(100,200,300) e l'asse Y dell'oggetto ha x=50. La distanza tra la x del
punto P e la x dell'asse Y e' 100-50 = 50;
Lo spostamento sul piano orizzontale di Xp (il punto P dell'oggetto)
equivale a:
Xp = Xp + (sen(alpha) * 50)
ovviamente anche questa e' una formula in linguaggio informatico, non e'
un'equazione!
Lo stesso procedimento lo applichi a tutti i punti e a tutti gli assi.
Se invece intendi proprio ruotare il punto di vista... beh quello e' un paio
di maniche nel quale non posso proprio metter parola, vista la complessita'
e la mia ignoranza in materia!
> Grazie per l'attenzione.
de nada, nn so se saro' stato utile o ti avro confuso solo le idee...!
Ahi ahi ahi ;-)
Un buon libro di algebra lineare vedrai che ti aiuta non poco!
L'algebra lineare la trovi in un qualsiasi libro di geometria per
Matematica, Fisica o Ingegneria.
> Le variabili sono:
> ox, oy, oz - coordinata del centro-assi;
> x1, y1, z1 - coordinata iniziale del punto da ruotare;
> x2, y2, z2 - coordinata del punto ruotato;
> ax, ay, az - angoli di rotazione per i rispettivi assi.
Se conosci il calcolo matriciale, basta applicare le famose matrici di
rotazione. Sono del tipo:
[ cos(t) sin(t) 0 ]
[ -sin(t) cos(t) 0 ]
[ 0 0 1 ]
Questa è per la rotazione attorno all'asse delle z. La applichi al vettore
colonna (x1; x2; x3) ed ecco che subito ottieni il vettore ruotato di t
radianti attorno all'asse delle z. Semplice, no?
Le altre due matrici le ottieni spostando terza riga e colonna negli altri
due posti.
MaxArt
Ad Alberto farei notare che con le sue condizioni la rotazione non e'
determinata: ci sono infinite scelte possibili.
Per avere una sola rotazione, devi dare *due punti* da ruotare (stando
attento pero' che la distanza dall'origine e tra l'uno e l'eltro siano
le stesse all'inizio e alla fine.
Cosa che non avevi esplicitata neanche nei tuoi dati: devi avere
x1^2 + y1^2 + z1^2 = x2^2 + y2^2 + z2^2.
------------------------------
Elio Fabri
Dip. di Fisica - Univ. di Pisa
------------------------------
Dato che? Non ti ho capito.
Lui chiede come ruotare lungo i tre assi e io gliel'ho detto.
Sarà poi lui stesso ad accorgersi che, oltretutto, le rotazioni lungo i tre
assi non sono operazioni commutative!
Rileggendo il suo stesso messaggio, c'è anche da chiedersi cosa voglia dire
con: "Tutto quello che sono riuscito a fare è
una rotazione su un asse o due al massimo"...
MaxArt
Asse Y
\ Asse X
\ /
\ /
O ---- Asse Z
Scusate lo schizzo...
Riesco a farmi capire? esempio pratico: supponiamo un foglio di carta
quadrato come questo qui sotto (lavorando di fantasia): se ruoto l'asse
Z di 45 gradi e poi l'asse Y di 90 gradi dovrebbe risultare disposto in
diagonale (di profilo), mentre con il calcolo matriciale sopra descritto
eseguito in sequenza lo ottengo disposto verticalmente (di profilo).
Asse Y
|
+-----+
| |
| z |-- Asse X
| |
+-----+
Alberto ha scritto:
> Quando dico che sono riuscito a ruotare su uno o due assi, voglio dire
> che non sono riuscito a ruotare simultaneamente su tutti e tre.
>
> Infatti, se per esempio ruoto l'asse Z, gli assi X e Y si spostano e le
> successive rotazioni devono tenerne conto, altrimenti non va come vorrei.
> ...
> Riesco a farmi capire? esempio pratico:
> ...
Ho capito il problema, anche se a me sembra proprio l'opposto.
Tutto dipende dal fatto che le rotazioni non commutano.
Ma vediamo in concreto. Prendi un vertice del tuo quadrato: (1,1,0).
La rotazione di 45 gradi attorno a z te lo porta in (0, sqrt(2), 0).
D'accordo fin qui?
Ora vuoi ruotare di 90 gradi attorno a y: il punto resta fisso.
Prendiamo invece il vertice (-1,1,0): la prima rotazione lo manda in
(-sqrt(2), 0, 0), la seconda lo porta in (0, 0, sqrt(2)).
Non e' quello che volevi?
Questo perche' ho tenuto fissi gli assi, e ho solo mosso i punti.
E' diverso se invece pensi di ruotare gli assi insieme ai punti...
Ed è proprio quello che cerco invano di ottenere...
Grazie comunque per il disturbo.
Alberto
>> E' diverso se invece pensi di ruotare gli assi insieme ai punti...
>
> Ed è proprio quello che cerco invano di ottenere...
Be', non e' che fosse proprio banale, capire cosa volevi...
Provo a darti la mia soluzione.
Indico con X(t), Y(t) e Z(t) le matrici descritte da MaxArt [dipendenti da
un certo angolo t] e con "." [il punto] il prodotto matriciale righe per
colonne.
Se ad esempio ruoti di un angolo ax attorno a X sia il punto che il
sistema di riferimento, poi di un angolo ay attorno a Y [nel nuovo sistema
di riferimento] ed infine di az attorno al nuovo Z... se le coordinate del
punto nel sistema originale erano (x1, y1, z1), dopo le trasformazioni
saranno ancora le stesse, ma riferite all'ultimo sistema di riferimento.
Per esprimerle nel sistema originale [chiamiamole (x2, y2, z2)] puoi fare:
[x2, y2, z2] = [x1, y1, z1].Z(-az).Y(-ay).X(-ax)
che e' solo una serie di trasformazioni di coordinate a ritroso...
In pratica puoi usare una matrice M per memorizzare le varie
trasformazioni... dopo la prima rotazione: M = X(-ax); dopo la seconda: M
= Y(-ay).M; dopo la terza M = Z(-az).M... cosi', finite le rotazioni o
anche durante, puoi ottenere subito il punto che vuoi moltiplicandolo con
la matrice [la matrice sempre a destra, in questo caso].
Comunque, non fidarti troppo! :-)
Ciao ciao
Claudio
--
"[...] voglio sgrullarti fino a farti diventare una gattina,
ecco che ti voglio fare!"
da "Attraverso lo specchio" di Charles Lutwidge Dodgson
PS: e utilizzare le functions definite dalle librerie OPENGL?
--
Posted via Mailgate.ORG Server - http://www.Mailgate.ORG
Grazie per la dritta. Proverò a fare questo prodotto di matrici e
vediamo cosa salta fuori... :-)
Le funzioni di OpenGL? Preferisco avere dei sorgenti su cui smanettare,
sai... deformazione professionale...
Alberto
Ma sei Claudio o SuperPollo, allora? :-)
Il procedimento e' lo stesso che dice Marco Lanteri per caso?
Comunque grazie a tutti per il rompicapo, prima di tutto a capirmi...
Alberto
>> Ciao ciao
>> Claudio
>
> Ma sei Claudio o SuperPollo, allora? :-)
:-) "Claudio" solo quando sono in incognito...
Approposito... c'era un errore di "segno", in quanto ho scritto. Ho
confuso le matrici di MaxArt [che erano matrici di rotazione] con quelle
di trasformazione di coordinate [che in pratica sono le stesse, ma con
segno opposto dell'angolo]. Cioe', se usi quelle matrici, il segno meno
che mettevo va tolto [ma in sostanza cambia solo il verso di rotazione].
> Il procedimento e' lo stesso che dice Marco Lanteri per caso?
Direi di no... ti ha dato ottimi consigli per approfondire, mentre io mi
limitavo al solo problema della rotazione...
Visto che non andava bene il metodo di MaxArt [che esegue in sequenza le
rotazioni attorno ad assi sempre fissi], se inverti l'ordine delle matrici
nel prodotto ottieni sempre le rotazioni, ma attorno agli assi nelle nuove
posizioni...
In pratica, chiamando M la matrice delle trasformazioni risultanti e u, v
e w tre angoli qualsiasi:
M = X(u).Y(v).Z(w)
ti da' le rotazioni attorno a tre assi fissi;
M = Z(w).Y(v).X(u)
te le da' con gli assi variabili... aggiungendo altre rotazioni, nel primo
caso moltiplichi a destra, nel secondo a sinistra.
Nell'esempio che facevi, considerando i quattro vertici:
P1 = [ 1, 1, 0]
P2 = [ 1,-1, 0]
P3 = [-1,-1, 0]
P4 = [-1, 1, 0]
dove uso le parentesi quadre per trattarli come matrici 1x3...
Ed eseguendo prima una rotazione di 45° attorno a Z e poi una di 90°
attorno a Y [nel primo caso con Y originale, nel secondo con la nuova Y
ruotata]...
Nel primo caso, che e' quello che non ti andava bene:
M = Z(45°).Y(90°) =
= [[0, SQRT(2)/2, SQRT(2)/2], [0, SQRT(2)/2, -SQRT(2)/2], [-1, 0, 0]]
... sempreche' si capisca come sto usando le quadre...
ed i quattro punti moltiplicati per M [cioe' Pn.M] diventano:
P1 => [ 0, SQRT(2), 0]
P2 => [ 0, 0, -SQRT(2)]
P3 => [ 0, -SQRT(2), 0]
P4 => [ 0, 0, SQRT(2)]
Nel secondo caso, che e' quello che c'interessa ora:
M = Y(90°).Z(45°) =
= [[0, 0, 1], [-SQRT(2)/2, SQRT(2)/2, 0], [-SQRT(2)/2, -SQRT(2)/2, 0]]
ed i quattro punti diventano rispettivamente:
P1 => [-SQRT(2)/2, SQRT(2)/2, 1]
P2 => [-SQRT(2)/2, SQRT(2)/2, -1]
P3 => [SQRT(2)/2, -SQRT(2)/2, -1]
P4 => [SQRT(2)/2, -SQRT(2)/2, 1]
Salvo errori, naturalmente...
Funziona perche' moltiplicando un punto per Y(90°) non faccio altro che
trovare le coordinate nel precedente riferimento... moltiplicando queste
ultime per Z(45°) trovo le coordinate corrispondenti nel sistema ancora
precedente, che e' quello originale... insomma, e' la sequenza di
trasformazione di coordinate inversa, nell'ordine, alle rotazioni
eseguite. Unito al fatto che la moltiplicazione di matrici e' associativa,
puoi memorizzare le trasmormazioni come dicevo nell'altro post.
> Comunque grazie a tutti per il rompicapo, prima di tutto a capirmi...
:-) Oh, di nulla... in realta' avrei preferito seguire le risposte di
Elio, perche' nelle sue spiegazioni mette sempre considerazioni molto
interessanti [si', me lo sto arruffianando... ma e' maledettamente bravo a
spiegare le cose e con lui si imparano facilmente e non diventano mai
banali... insomma, e' per banale tornaconto ;-)]...
riCiao ciao
Gia', impadronirmi della formula... dici niente... :-)
Sotto che voce potrei cercare in Internet?
Grazie comunque per l'aiuto.
Ciao
Alberto
Ho trovato gia' molto sui quaternioni, perfino una libreria di sorgenti
per capire meglio la cosa. Ora non mi resta che applicare e vedere cosa
succede.
Grazie ancora dell'aiutone.
Ciao.
Alberto
Posso comunque darti la formula, che non è poi così complicata:
OP' = sen(delta)*u/\OP + cos(delta)*OP - (cos(delta) - 1))*uXOP*u
In questa:
O è un punto dell'asse di rotazione (che puoi far concidere coll'origine del
sistema di riferimento); OP' è il vettore trasformato(dopo la rotazione);
delta è l'angolo di rotazione (tra 0 e 180 gradi); /\ è il simbolo di
prodotto vettoriale; X è il simbolo di prodotto scalare; u è il versore che
definisce la direzione e il senso dell'asse di rotazione. Devi solo
proiettare i vettori del primo e secondo membro della formula sugli assi
x,y,z per ottenere x',y',z' in funzione di x,y,z.
Le formule delle componenti di un vettore prodotto vettoriale di due vettori
dati e la formula del prodotto scalare tra due vettori (che è un numero) le
trovi in qualsiasi libro di calcolo vettoriale ( o su internet).
Buon divertimento :-))
Elreg