Sto iniziando su Molehill e sto avendo un sacco di problemi nell'afferrare Matrix3D. Il mio primo problema è come gestire un Matrix3D che descrive l'orientamento di un singolo modello.Come si combinano le rotazioni X, Y e Z nello spazio locale di un modello (non globale)?
Uso Matrix3D.appendRotation() per eseguire questa operazione. Ma a seconda dell'ordine in cui appendo ottengo un risultato diverso (ovviamente, dato che sto ruotando uno alla volta nello spazio globale). So che questo è un problema comune, mi sono imbattuto in esso con la modellazione software 3d. Ma questa volta, devo sistemarlo programmaticamente. Questo è dove ho bisogno di aiuto.
In primo luogo, nel caso in cui non v'è alcuna confusione, qui è il problema in immagini:
Fase 1: I rendere un modello.
2a Fase: I ruotarla sul X-asse. Sembra corretto!
Fase 2b: Ho ruotarla sul Z-asse. Sembra corretto!
Quindi ... se ho ruotare sull'asse X e Z del modello che voglio questo:
Ma, sadface, ottengo questo:
Posso vedi il problema. Sto aggiungendo le rotazioni una alla volta nello spazio globale. Ho bisogno di ruotare nello spazio locale dell'oggetto. Non ho idea di come fare questo o cosa dovrei anche cercare (terminologia, ecc.). Il codice è semplice (e sbagliato):
modelLocalMatrix.identity();
modelLocalMatrix.appendRotation(modelZRot, Vector3D.Z_AXIS);
modelLocalMatrix.appendRotation(modelXRot, Vector3D.X_AXIS);
//eventually y-axis rotation as well...
renderMatrix.append(modelLocalMatrix);
Sto indovinando che invece di utilizzare le costanti assi Vector3D, voglio usare un po 'di vettore normalizzato e alcuni ... uh, cosa ... al posto di modelZRot , modelXRot e infine modelYRot. Qualcuno può dirmi qual è la soluzione migliore per applicare il tipo di rotazione desiderato sopra?
AGGIORNAMENTO: Dopo aver trascorso la giornata a colpire i "libri" (noti anche come KhanAcademy su YouTube) e iniziando da questa presentazione qui: The Mathematics of the 3d Rotation Matrix mi sono imbattuto in una sorta di metodo "look at" che è molto vicino alla mia soluzione desiderata. Purtroppo, ho capito solo il 50%. Spero ancora che qualcuno possa far luce su questo argomento!
var angleOfRotation:Number = Math.PI/2; //90 degrees...
var axisOfRotation:Vector3D = new Vector3D(0, 1, 0); //some point to look at...
//normalize the vector!
axisOfRotation.normalize();
var x:Number = axisOfRotation.x;
var y:Number = axisOfRotation.y;
var z:Number = axisOfRotation.z;
var c:Number = Math.cos(angleOfRotation);
var s:Number = Math.sin(angleOfRotation);
var t:Number = 1 - c;
//Graphics Gems (Glassner, Academic Press, 1990).
modelLocalMatrix = new Matrix3D(new <Number>[
t * (x * x) + c, t * x * y - s * z, t * x * z + s * y, 0,
t * x * y + s * z, t * (y * y) + c, t * y * z - s * x, 0,
t * x * z - s * y, t * y * z + s * x, t * (z * z) + c, 0,
0, 0, 0, 1
]);
Il fatto è che questo sembra piuttosto goffo. Soprattutto perché l'angolo di rotazione di un Vector3D dovrebbe essere il quarto valore (w). Ancora più importante, Matrix3D sembra già avere un metodo lookAt(). Non ce l'ho ancora ... per favore qualcuno mi salvi da ore di prove ed errori!