2012-11-09 7 views
5

Ich fand eine Tonne von Formeln und was nicht, aber 3D ist nicht meine Stärke, so bin ich bei dem Verlust dessen, was speziell zu verwenden. Mein Ziel ist es, die Daten in einer 3D-OBJ-Datei (Vertices, Normalen, Faces) nach CSS3D (Breite, Höhe, RotateX, Y, Z und/oder ähnliche Transformationen) zu konvertieren.Konvertieren OBJ Daten in CSS3D

#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() */ 

Frage Der Kern ist wie die X erhalten/Y/Z-Drehung einer 4-Punkt-Ebene:

Beispiel 2 einfachen Ebenen

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 

Könnte diese Daten umgewandelt werden, aus seiner Matrix von x, y, z-Koordinaten?

UPDATE # 1 - 11/12/12 So basiert auf den Antworten zur Verfügung gestellt, ich habe unten aus http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToEuler/index.htm über die nicht optimierte Funktion kommen:

/* 
    -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); 
} 

ich das Erzielen von Ergebnissen, aber ich bin mir nicht sicher, ob meine Berechnungen korrekt sind und ich bekomme auch gemischte Antworten darauf, was mit welcher Achse übereinstimmt. Ist es Kurs = y, Bank = x und Einstellung = z? Ich konvertiere auch jeden Grad, wenn das wichtig ist.

+1

möglich Duplikat Matrix zu Euler-Winkel: http://stackoverflow.com/ Fragen/11137591/matrix-zu-eulerangles – FlavorScape

+0

Haben Sie die Leistung gemessen? Erstellen Sie einen Benchmark mit der gewünschten Anzahl von css3d-Transformationen basierend auf zufälligen Eingabewerten.Wenn es auf dem Zielgerät nacheilt, ist Ihre Arbeit Zeitverschwendung. Die durchschnittliche obj-Datei enthält eine große Anzahl von Gesichtern. – JAre

+0

Es war kein Problem der Leistung. Es kam auf eklatante falsche Mathematik von meiner Seite. Die verwendeten OBJ-Dateien werden speziell mit CSS3D erstellt, so dass sie nur eine minimale Menge an Polygonen haben. –

Antwort

7

enter image description here

Lesen Sie dieses http://www.songho.ca/opengl/gl_matrix.html Es erklärt so ziemlich alles, und es ist die Umsetzung.

Außerdem wird die CSS 3D-Lösung eine geringere Leistung (Grössenordnung) haben, hauptsächlich weil jedes Stück der dargestellten Oberfläche ein DOM-Element ist, es ist auch sehr begrenzt - Sie finden zahlreiche Materialien zu diesem Thema (Google IO Records zum Beispiel)

Wenn benötigen Sie deklarative 3D-Gerüsts Sie könnten bei x3dom aussehen wollen

um eine 3D-Box ziehen müssen Sie nur X3DOM js Skript und betten diese Erklärung in Ihrer Seite einzufügen:

<body> 
    <h1>Hello X3DOM World</h1> 
    <x3d width="400" height="300"> 
    <scene> 
     <shape> 
     <box></box> 
     </shape> 
    </scene> 
    </x3d> 
</body> 

Es wird <x3d> Tags auf Ihrer Seite analysieren und richtige WebGL oder Flash-Implementierung mit der guten Leistung generieren.

x3d hat Möglichkeit, Assets von Blender, Maya und 3ds Max zu importieren. Hier ist eine gute Lektüre: x3domIntroTutorial.pdf

IE 11 wird WebGL unterstützen und IE10 wird IE 11, so dass nur Nicht-Unterstützung Desktop-Browser (standardmäßig deaktiviert) Die Aktualisierung erfolgt automatisch wird Safari. Apple wird gezwungen sein, es standardmäßig zu aktivieren. Mit voller Desktop-Unterstützung wird es nicht zu lange dauern, um voll mobil zu werden, da es ein hart umkämpfter Markt ist. Und wir haben ein sehr zugängliches WebGL-Framework wie three.js. Also gibt es keinen Sinn, es mit CSS 3D dabei

UPDATE: iOS 8 Safari wird WebGL-Unterstützung standardmäßig aktivieren: http://caniuse.com/webgl

+1

Danke für das Update. Ich bin in der Regel ein spätes Adoptierer für diese Art von Technologien, aber die oben genannten Informationen sind mehr als genug, um mich auf einen richtigeren Pfad zu starten. –

+0

@DonBoots 3D-Frameworks ermöglicht Ihnen, diesen Übergang so reibungslos wie möglich zu machen. Zu diesem Zeitpunkt kann niemand auf diesem Planeten alles über 3D-Grafik wissen, es ist einfach zu groß und zu tief. Aber mit einem guten Tool-Set können Sie schrittweise neue Dinge lernen und sich in einigen komplexen Fällen auf die Standardverhaltensweisen der Frameworks verlassen. – JAre

Verwandte Themen