2012-10-22 14 views
7

Per impostazione predefinita, la matrice di rotazione utilizza il punto di origine come centro della rotazione. Per ruotare attorno a un punto arbitrario, devi sottrarre la distanza all'origine usando una matrice di traslazione, fai la rotazione e poi traduci. Tranne che questo non sembra funzionare così bene per me. Ho il seguente codice (assumere il mio oggetto è 100x100 con un centro a 50,50):Rotation Matrix sul punto arbitrario

t = IDENTITY; 
t = translate(t, -50, -50); 
t = rotate(t, theta); 
t = translate(t, 50, 50); 

Purtroppo, se si applica questa trasformazione matrice t al mio oggetto, l'oggetto è posizionato correttamente.

Ho implementato un rapido jsfiddle per dimostrare il mio problema: http://jsfiddle.net/9M3uy/67/

Nel JSFiddle, il rosso ruotato piazza è dove la rotazione dovrebbe essere finito (per gentile concessione di costruzione trasformare origine di CSS3), e il il quadrato blu ruotato è dove finisce il mio calcolo (il verde sarebbe stato il quadrato originale non ruotato).

Qualche idea? Sto solo non capendo come tradurre, ruotare, tradurre i lavori meccanici o sto facendo qualcosa di terribilmente sbagliato?

+0

Non riesco a vedere il verde ... –

+0

Devi utilizzare Chrome o Safari. Ho aggiornato il JSFiddle per includere il CSS necessario per tutti i browser. – syazdani

+0

Sì! Ma sembra che tu abbia trovato la risposta! Sono arrivato troppo tardi –

risposta

2

Ci sono due problemi nel codice:

  1. La matrice moltiplicazioni sono fatte in ordine inverso di quello che probabilmente si intende. Sembra che tu intenda rotate(t, theta) restituire una matrice che si applica a t seguita da una rotazione, ma in realtà è l'opposto - la rotazione verrà applicata prima dello t. È necessario invertire l'ordine dei parametri nelle chiamate a matrixMultiply in rotate e translate.

  2. I parametri della funzione CSS matrix sono nell'ordine sbagliato. Dovrebbe essere a11, a21, a12, a22, a13, a23. Quello che stai passando è a11, a12, a21, a22, a13, a23.

Ecco lo fixed version.

+0

Ecco una versione ottimizzata della versione fissa di Interjay. http://jsfiddle.net/orwellophile/hvvo9oh8/ – Orwellophile

0

Provare a implementare prima la moltiplicazione di matrice 3x3 "standard" per i casi 2d e solo dopo aver tentato di ottimizzare gli elementi, che risultano moltiplicando per zero. È un po 'difficile vedere se le formule sono corrette, quando lo schema di indicizzazione è troppo poco ortodosso.

La matrice di rotazione = [c -s 0; s c 0; 0 0 1]; La matrice di traduzione = [1 0 x; 0 1 y; 0 0 1];

Devo supporre che la funzione di traduzione css assuma anche il risultato 3x3.

Sia la moltiplicazione che la rotazione vengono eseguite moltiplicando i vettori (x, y, 1) per la matrice corrispondente.

EDIT: Dopo giocherellare un po ', sembra che sia la matrice m dovrebbe essere tradotto, o gli operatori potrebbe essere definito come return MatMul([rot matrix],m) and return MatMul([trans matrix],m)

EDIT2: Ora posso vedere qualcosa di strano: traducendo solo da + -50, + -50 e ruotando di ~ 10 gradi, l'angolo non rimane nel mezzo del quadrato rosso. Ma non capisco comunque il formato della matrice CSS. Siamo spiacenti ...

+0

Ho aggiornato l'esempio per la moltiplicazione completa 3x3: http://jsfiddle.net/9M3uy/5/. La trasformazione css (penso che sia quello che volevi dire), assume la matrice nella forma: 'matrice (a, b, c, d, tx, ty)' (cade la terza riga). – syazdani

+1

È necessario utilizzare Chrome o Safari (o un altro browser basato su Web Kit). Per impostazione predefinita, l'origine della trasformazione in CSS è al centro e se non hai cambiato nulla nel CSS, la matrice calcolata dal mio codice sembrerà funzionare, ma solo perché il browser sta centrando la rotazione per te. Se guardi il violino aggiornato in cui imposto l'origine su 0,0 per tutti i browser, vedrai che la tua modifica suggerita non funziona. – syazdani