Ho trovato un sacco di formule e cosa no, ma il 3D non è il mio forte, quindi sono in perdita di cosa specificamente da usare. Il mio obiettivo è convertire i dati in un file obj 3D (vertici, normali, facce) in CSS3D (larghezza, altezza, rotateX, Y, Z e/o trasformazioni simili).Conversione di dati OBJ in CSS3D
Ad esempio 2 semplici piani
g plane1
# simple along along Z axis
v 0.0 0.0 0.0
v 0.0 0.0 1.0
v 0.0 1.0 1.0
v 0.0 1.0 0.0
g plane2
# plane rotated 90 degrees along Y-axis
v 0.0 0.0 0.0
v 0.0 1.0 0.0
v 1.0 1.0 0.0
v 1.0 0.0 0.0
f 1 2 3 4
f 5 6 7 8
Potrebbe questi dati essere convertiti:
#plane1 {
width: X;
height: Y;
transform: rotateX(Xdeg) rotateY(Ydeg) rotateZ(Zdeg) translateZ(Zpx)
}
#plane2 {
width: X;
height: Y;
transform: rotateX(Xdeg) rotateY(Ydeg) rotateZ(Zdeg) translateZ(Zpx)
}
/* Or something equivalent such as transform: matrix3d() */
Il problema principale è come ottenere X/Y/Z-rotazione di un piano 4 punto dalla sua matrice di coordinate x, y, z?
UPDATE # 1 - 11/12/12 Quindi, sulla base delle risposte fornite, ho incontrato la funzione non ottimizzata da http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToEuler/index.htm di seguito:
/*
-v 0.940148 -0.847439 -1.052535
-v 0.940148 -0.847439 0.947465
-v -1.059852 -0.847439 0.947465
-v -1.059852 -0.847439 -1.052535
-v 0.940148 1.152561 -1.052534
-v 0.940147 1.152561 0.947466
-v -1.059852 1.152561 0.947465
v -1.059852 1.152561 -1.052535
f 1 2 3 4
f 5 8 7 6
f 1 5 6 2
f 2 6 7 3
f 3 7 8 4
f 5 1 4 8
*/
var f = {
'm00' : 0.940148,
'm01' : -0.847439,
'm02' : -1.052535,
'm10' : 0.940148,
'm11' : -0.847439,
'm12' : 0.947465,
'm20' : -1.059852,
'm21' : -0.847439,
'm22' : 0.947465
}
// Assuming the angles are in radians.
if (f.m10 > 0.998) { // singularity at north pole
heading = Math.atan2(f.m02, f.m22);
attitude = Math.PI/2;
bank = 0;
} else if (f.m10 < -0.998) { // singularity at south pole
heading = Math.atan2(f.m02,f.m22);
attitude = -Math.PI/2;
bank = 0;
} else {
heading = Math.atan2(-f.m20, f.m00);
bank = Math.atan2(-f.m12, f.m11);
attitude = Math.asin(f.m10);
}
sto ottenendo risultati, ma io Non sono sicuro che i miei calcoli siano corretti e sto anche ottenendo risposte miste su ciò che corrisponde a quale asse. Intestazione = y, bank = x, e attitude = z? Sto anche convertendo ciascuno in gradi se questo è importante.
possibile duplicato di Matrix per angoli di Eulero: http://stackoverflow.com/ questions/11137591/matrix-to-eulerangles – FlavorScape
Hai misurato le prestazioni? Crea benchmark con la quantità desiderata di trasformazioni css3d in base a valori di input casuali.Se rimarrà su una macchina bersaglio, il tuo lavoro sarà inutile. Il file obj medio contiene un'enorme quantità di facce. – JAre
Non era un problema di prestazioni. È venuto giù per palese matematica scorretta da parte mia. I file OBJ utilizzati sono stati creati appositamente pensando a CSS3D in modo che abbiano una quantità minima di poligoni. –