it-swarm.dev

Warum verwendet DirectX ein linkshändiges Koordinatensystem?

Ich habe überlegt, auf Stack Overflow zu posten, aber die Frage erscheint mir viel zu subjektiv, da mir keine vernünftige technische Erklärung für die Wahl von Microsoft in dieser Angelegenheit einfällt. Aber diese Frage hat mich so lange beschäftigt und das Problem taucht immer wieder in einem meiner Projekte auf, und ich habe noch nie einen Versuch gesehen, dies zu erklären:

OpenGL verwendet ein rechtshändiges Koordinatensystem, bei dem sich der + Z-Teil des Weltkoordinatensystems zum Betrachter erstreckt.

DirectX verwendet ein linkshändiges System, bei dem sich der + Z-Teil der Weltkoordinate vom Betrachter weg in den Bildschirm erstreckt .

Ich habe nie die Glide API verwendet, daher weiß ich nicht, wie es funktioniert hat, aber soweit ich das beurteilen kann, wird auch ein Linkshänder-System verwendet.

Gibt es dafür einen technischen Grund? Und wenn nicht, gibt es einen konzeptionellen Vorteil für eine bestimmte Händigkeit eines Koordinatensystems? Warum sollte man einen über den anderen wählen?

52
greyfade

Ich weiß, dass dies ein alter Beitrag ist, aber ich habe gesehen, dass auf diesen Beitrag verwiesen wird, und ich mag den Ton der gewählten Antwort nicht.

Also habe ich ein bisschen nachgeforscht!

  1. DirectX ist alt. Es wurde erstmals 1995 veröffentlicht, als die Welt viel mehr als Nvidia und ATI , DirectX vs OpenGL hatte. Das sind über 15 Jahre, Leute.
  2. dfx Interactive's Glide (einer der Konkurrenten von DirectX damals. OpenGL war damals nicht für Spiele gedacht) verwendete ein linkshändiges Koordinatensystem.
  3. POV-Ray und RenderMan (Pixars Rendering-Software) verwenden ebenfalls ein linkshändiges Koordinatensystem.
  4. DirectX 9+ kann mit beiden Koordinatensystemen arbeiten.
  5. Sowohl WPF als auch XNA (die unter den Kulissen mit DirectX funktionieren) verwenden ein Recht -handed Koordinatensystem.

Daraus kann ich über ein paar Dinge spekulieren:

  • Industriestandards sind nicht so Standard wie Menschen.
  • Direct3D wurde in einer Zeit erstellt, in der jeder die Dinge auf seine eigene Weise tat, und die Entwickler wussten es wahrscheinlich nicht besser.
  • Linkshändigkeit ist optional, aber in der DirectX-Welt üblich.
  • Da Konventionen schwer aussterben, glaubt jeder, dass DirectX nur mit Linkshändern arbeiten kann.
  • Microsoft lernte schließlich und folgte dem Standard in allen neuen APIs, die sie erstellten.

Daher wäre meine Schlussfolgerung:

Als sie sich entscheiden mussten, kannten sie den Standard nicht, wählten das 'andere' System und alle anderen machten einfach mit. Kein zwielichtiges Geschäft, nur eine unglückliche Designentscheidung, die mitgenommen wurde, denn Abwärtskompatibilität ist der Name des Microsoft-Spiels.

64
Kyte

Ich bin überrascht, dass niemand etwas erwähnt hat: OpenGL funktioniert auch in einem linkshändigen Koordinatensystem. Zumindest, wenn Sie mit Shadern arbeiten und den Standardtiefenbereich verwenden.

Sobald Sie die Pipeline mit festen Funktionen verworfen haben, beschäftigen Sie sich direkt mit "Clip-Space". Die OpenGL-Spezifikation definiert den Clip-Raum als ein homogenes 4D-Koordinatensystem. Wenn Sie den Transformationen durch normalisierte Gerätekoordinaten bis hinunter zum Fensterbereich folgen, finden Sie dies.

Der Fensterbereich befindet sich im Bereich der Pixel eines Fensters. Der Ursprung befindet sich in der unteren linken Ecke, wobei + Y nach oben und + X nach rechts geht. Das klingt sehr nach einem rechtshändigen Koordinatensystem. Aber was ist mit Z?

Der Standardtiefenbereich (glDepthRange) setzt den nahen Z-Wert auf 0 und den fernen Z-Wert auf eins. Also geht das + Z weg vom Betrachter.

Das ist ein linkshändiges Koordinatensystem. Ja, Sie können den Tiefentest von GL_LESS in GL_GREATER und den glDepthRange von [0, 1] in [1, 0] ändern. Der Standardzustand von OpenGL besteht jedoch darin, in einem Linkshänder zu arbeiten. Koordinatensystem. Und keine der Transformationen, die erforderlich sind, um aus dem Clip-Raum in den Fensterraum zu gelangen, negiert das Z. Der Clip-Raum, die Ausgabe des Scheitelpunkt- (oder Geometrie-) Shaders, ist also ein linkshändiger Raum (irgendwie. Es ist also ein homogener 4D-Raum) Es ist schwer, die Händigkeit zu bestimmen.

In der Pipeline mit fester Funktion wandeln sich die Standardprojektionsmatrizen (hergestellt von glOrtho, glFrustum und dergleichen) alle von einem rechtshändigen Raum in einen linkshändigen einer. Sie drehen die Bedeutung von Z um; Überprüfen Sie einfach die Matrizen, die sie erzeugen. Im Augenraum bewegt sich + Z auf den Betrachter zu; im Raum nach der Projektion bewegt es sich weg.

Ich vermute, Microsoft (und GLide) haben sich einfach nicht die Mühe gemacht, die Negation in ihren Projektionsmatrizen durchzuführen.

37
Nicol Bolas

Es ist reine Geschichte. In der Antike betrachteten die frühen Höhlengrafikprogrammierer die Betrachtungsfläche des Monitors (Teletyp? Steintyp?) Als zweidimensionales Millimeterpapier. In Mathematik und Ingenieurwesen lauten die üblichen Konventionen zum Zeichnen von Datenpunkten auf Millimeterpapier: x = rechts, y = oben. Dann, eines Tages, ungefähr eine Woche nach der Erfindung des Siliziumrades, dachte jemand an 3D-Grafiken. Wenn die Kerzenlampe dieser Idee aus irgendeinem Grund über ihrem Kopf blinkte, fügten sie Z = weg vom Betrachter hinzu. (Autsch, meine rechte Hand tut weh, wenn ich mir das nur vorstelle.)

Sie hatten keine Ahnung, dass ihre Nachkommen eines Tages Ingenieure, Wissenschaftler, bildende Künstler, kommerzielle Künstler, Animatoren, Produktdesigner usw. werden und 3D-Grafiken nützlich finden würden. Alle diese feinen modernen Menschen verwenden rechtshändige Koordinatensysteme, um miteinander und mit den etablierteren mathematischen Texten und physikalischen Konventionen übereinzustimmen.

Es ist dumm, das 3D-Koordinatensystem auf der Anzeigefläche zu basieren. Es ist das Modell, das zählt - die Dreiecke und Polygone und Ebenen, die ein Haus, einen Stuhl, einen übergewichtigen grünen Oger oder eine Galaxie beschreiben. Heutzutage entwerfen und modellieren wir alle Dinge in rechtshändigen XYZ-Systemen, und zwar in Bezug auf die Modellwelt, noch bevor wir darüber nachdenken, wie sie gerendert werden. Die Kamera wird irgendwann hinzugefügt, möglicherweise um auf verrückte Weise herumzufliegen, und es ist eine unsichtbare Infrastruktur, die das Modell in Pixel umwandelt, die in ihrem Darm mit koordinierten Systemtransformationen herumarbeiten müssen.

Um die Verwirrung zu vergrößern, erkennen einige Grafikbibliotheken, dass CRTs das Bild von oben nach unten scannen und daher Y = down haben. Dies wird auch heute noch in allen Fenstersystemen und Fenstermanagern verwendet - X11, fvwm, gtk +, Win31 API usw. Wie neu entwickelte 3D-GUI-Systeme wie Clutter, Beryl usw. mit Z umgehen, ist ein anderes Problem als die 3D-Grafikmodellierung. Dies muss nur Anwendungsprogrammierer und GUI-Designer betreffen.

11
DarenW

Sie sind beide im Wesentlichen gleichwertig, da einer leicht transformiert in den anderen umgewandelt werden kann. Der einzige Vorteil, den ich für das linkshändige System finden kann, ist: Da Objekte in jeder Richtung (x, y oder z) weiter vom Betrachter entfernt sind, ist der Abstand ein höherer Wert. Aber ich habe keine Ahnung, ob Microsoft aus diesem Grund einen über den anderen gewählt hat.

POV-Ray verwendet auch ein linkshändiges Korridatsystem.

10
tcrosley

Der Hauptentwickler von DirectX (und Direct3D) Alex St. John hat das kürzlich kommentiert. In einem Artikel über die Geschichte von Direct3D schrieb er:

Ich wurde [...] gebeten, eine Händigkeit für die Direct3D-API zu wählen. Ich habe ein linkshändiges Koordinatensystem gewählt, teilweise aus persönlichen Vorlieben . [...] es war eine willkürliche Wahl.

Quelle: http://www.alexstjohn.com/WP/2013/07/22/the-evolution-of-direct3d/

10
Daniel Rikowski

Es ist zu verstehen, dass eine RIESIGE Menge an Programmierzeit für die Konvertierung zwischen linkshändigen und rechtshändigen Koordinatensystemen verschwendet wurde und noch mehr Programmiererzeit für die Erinnerung daran, welches System zu einem bestimmten Zeitpunkt benötigt wurde.

All das ging verloren, als rechtshändige Koordinatensysteme zum Industriestandard wurden.

Es gibt bereits genügend gebräuchliche Koordinatensysteme, ohne die Anzahl durch Einführung einer Händigkeitsfrage zu verdoppeln. Siehe Minkler & Minkler, "Aerospace Coordinate Systems and Transformations" . Wenn Sie in der Luft- und Raumfahrt tätig sind, können Sie z. Flugsimulation, Sie [~ # ~] benötigen [~ # ~] dieses Buch.

Ich vermute, dass Microsoft niemanden im DirectX-Projekt hatte, der etwas über die Industriestandards wusste, nicht wusste, dass es einen Industriestandard gab, und dachte, dass es keine Rolle spielte.

Die andere Möglichkeit, dass sie wussten, dass rechtshändige Systeme der Industriestandard sind, und sie DirectX absichtlich für Linkshänder gemacht haben, um es für Benutzer SCHWER zu machen, Code zu konvertieren, der DirectX verwendet, um stattdessen OpenGL zu verwenden, wird nicht berücksichtigt. Würde ich feststellen, dass dies tatsächlich der Fall ist, würde ich es für notwendig halten, eine neue und vermutlich kurzlebige Karriere als Axtmörder in Redmond zu beginnen.

5
John R. Strohm

Die wirkliche Antwort auf die frühe Linkshändigkeit von Direct3D ist viel weniger unheimlich als einige von Ihnen spekulieren. DirectX wurde gestartet, als Microsoft 1995 RenderMorphics kaufte.

Zu dieser Zeit war der in den RenderMorphics-Büros verwendete Standardgrafiktext "Principles of Interactive Computer Graphics" von Newmann und Sproul, der alles mit linkshändigen Koordinaten erledigt. Es ist das gleiche Buch, das ich im College verwendet habe. Wenn Sie sich den D3D-Code ansehen, können Sie sogar sehen, dass sie Variablennamen verwenden, die mit den Gleichungen im Buch übereinstimmen.

Es ist keine Microsoft-Verschwörung. Die Entscheidung wurde getroffen, bevor Microsoft überhaupt ins Bild kam.

5
Stephen Coy

Für alle, die glauben, dass Rechts- oder Linkshändigkeit keinen Vorteil haben, liegen Sie absolut falsch. Die Rechtshändigkeit kartesischer Koordinatensysteme ergibt sich aus der Definition des Vektorkreuzprodukts. Für XYZ-Basisvektoren u, v und w, w = u X v.

Diese Definition ist grundlegend für die Vektormathematik, die Vektorrechnung und einen Großteil der Physik. Angenommen, Sie versuchen, elektromagnetische Wechselwirkungen zu simulieren. Sie haben einen Magnetfeldvektor M und ein geladenes Teilchen, das sich in diesem Feld mit der Geschwindigkeit v bewegt. Wie beschleunigt sich die Ladung? Einfach - in Richtung M X v. Außer ein Idiot dachte, es würde Spaß machen, Ihr Anzeigesystem für Linkshänder zu machen, also beschleunigt es in Richtung -M X v.

Grundsätzlich wird jede physikalische Interaktion zwischen zwei Vektorgrößen als rechtshändig definiert. Wenn Sie diese Interaktion also simulieren müssen, sollten Sie besser hoffen, dass Ihr Grafiksystem rechtshändig ist, oder Sie müssen daran denken, negative Vorzeichen einzukarren all deine Mathe.

5
Tom

Keiner ist letztendlich besser als der andere - Sie ordnen 3D-Koordinaten einer 2D-Oberfläche zu, sodass die dritte Dimension (die die Dinge tatsächlich zu 3D macht) willkürlich ausgewählt werden kann und auf den Betrachter oder in den Bildschirm zeigt. Sie werden die Dinge sowieso durch eine 4x4-Matrix führen, daher gibt es keinen technischen Grund, eine über die andere zu wählen. Funktionell könnte man argumentieren:

  • In der Datenverarbeitung und in anderen Bereichen besteht ein ziemlich breiter Konsens darüber, dass die X-Achse von links nach rechts verläuft (die Luftfahrt ist anscheinend eine bemerkenswerte Ausnahme).
  • In der Mathematik zeigt die Y-Achse nach oben. (Auch oben ist, wo die Blasen gehen).
  • Auf Computerbildschirmen zeigt die Y-Achse nach unten (weil CRT-Bildschirme so funktionieren und weil die meisten menschlichen Skripte in dieser Reihenfolge Zeilen anordnen).
  • Wenn Sie auf die "sichtbare" Seite einer Oberfläche in der X/Y-Ebene schauen, sollte die Normale auf den Betrachter zeigen (z. B. wenn Sie Satellitenaufnahmen betrachten; die "Höhe über dem Meeresspiegel" zeigt auf den Satelliten, nicht auf der Mittelpunkt der Erde). Da die Normale für die X/Y-Ebene der Z-Achsenvektor ist, sollte die Z-Achse auch auf den Betrachter zeigen.
  • Wenn Sie 3D-Bilder auf einem Computerbildschirm betrachten, sollten Punkte, die weiter vom Betrachter entfernt sind, eine größere Z-Komponente aufweisen. Daher sollte die Z-Achse in den Bildschirm zeigen.

Schlussfolgerung: Es gibt einen gewissen Konsens für die X-Achse, aber für die beiden anderen können beide Richtungen argumentiert werden, was zwei rechtshändige und zwei linkshändige Konfigurationen ergibt, und alle sind sinnvoll.

3
tdammers

Interessante Tatsache.

Direct3D (nicht DirectX - DirectX deckt auch Eingaben, Sound usw. ab) nicht hat ein linkshändiges Koordinatensystem.

Es ist perfekt in der Lage, sowohl RH- als auch LH -Systeme) zu unterstützen. Wenn Sie sich die SDK-Dokumentation ansehen, sehen Sie Funktionen wie D3DXMatrixPerspectiveFovLH nd D3DXMatrixPerspectiveFovRH. Beide funktionieren und beide Erstellen Sie eine Projektionsmatrix, die erfolgreich mit dem Koordinatensystem Ihrer Wahl verwendet werden kann. Wenn Sie möchten, können Sie in Direct3D sogar Spaltenmajor verwenden. Es handelt sich lediglich um eine Softwarematrixbibliothek, die Sie nicht verwenden müssen Wenn Sie es jedoch mit OpenGL verwenden möchten, werden Sie feststellen, dass es auch mit OpenGL perfekt funktioniert (was möglicherweise der endgültige Beweis für die Unabhängigkeit der Matrixbibliothek von Direct3D selbst ist).

Wenn Sie also ein RH-System in Ihrem Programm verwenden möchten, verwenden Sie einfach die -RH-Version der Funktion. Wenn Sie ein LH System) verwenden möchten, verwenden Sie die -LH-Version. Direct3D ist das egal. Ebenso, wenn Sie ein LH System in) verwenden möchten OpenGL - nur glLoadMatrix und LH Projektionsmatrix. Keines dieser Dinge ist wichtig und es ist bei weitem nicht das große Problem, das man manchmal sieht.

3
Maximus Minimus

Bereitstellung dieses als ergänzendes Material zu meiner vorherigen Antwort hier. Aus einer alten OpenGL-Spezifikation aus den 1990er Jahren:

OpenGL erzwingt in keinem seiner Koordinatensysteme Links- oder Rechtshändigkeit.

(Quelle: http://www.opengl.org/documentation/specs/version1.2/opengl1.2.1.pdf ).

Da weder D3D noch OpenGL eine Händigkeit durchsetzen, lautet die eigentliche Frage: Warum sehen die Leute dies als eine große Sache an?

0
Maximus Minimus

Beide Hände haben keinen technischen Vorteil, sie sind völlig willkürlich. Beide funktionieren einwandfrei, solange Sie konsistent sind.

Aufgrund der Vorteile der Konsistenz sollte man im Idealfall nur "das verwenden, was alle anderen verwenden" - aber das ist in vielen Fällen ziemlich schwierig, da es in der Praxis auch keine überwiegend "bevorzugte" Konvention gibt: Beide Händigkeiten sind weit verbreitet. Bestenfalls gibt es in bestimmten Communities (z. B. OpenGL) eine gewisse Konsistenz.

Ich denke, die grundlegende Antwort auf diese Frage lautet: Sie haben gewählt, was sie gewählt haben, weil es sich richtig anfühlte (zweifellos hatten sie bereits Erfahrungen mit dieser Händigkeit gemacht), und es gab wenig Grund, dies nicht zu tun.

Am Ende macht es wenig Unterschied - jeder, der ernsthaft Assets/Code mit anderen Systemen/Communities austauschen möchte, muss ohnehin darauf vorbereitet sein, sich mit der Händigkeitskonvertierung zu befassen, da dies in 3D-Grafiken eine Tatsache ist.

0
snogglethorpe