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 Entscheidung 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 der + Z-Teil der Weltkoordinate vom Betrachter weg in den Bildschirm hineinragt.
Ich habe die Glide-API nie verwendet , daher weiß ich nicht, wie sie funktioniert, aber soweit ich das beurteilen kann, wird auch ein System für Linkshänder verwendet.
Gibt es dafür einen technischen Grund? Und wenn nicht, hat eine bestimmte Händigkeit eines Koordinatensystems einen konzeptionellen Vorteil? Warum sollte man eine über die andere wählen?
Antworten:
Ich weiß, dass es sich um einen alten Beitrag handelt, aber ich habe gesehen, dass auf diesen Beitrag verwiesen wird, und der Ton der gewählten Antwort gefällt mir nicht.
Also habe ich ein bisschen nachgeforscht!
Daraus kann ich über ein paar Dinge spekulieren:
Daher wäre mein Fazit:
Als sie sich entscheiden mussten, kannten sie den Standard nicht, entschieden sich für das „andere“ System, und alle anderen machten einfach mit. Kein zwielichtiges Geschäft, nur eine unglückliche Designentscheidung, die mitgetragen wurde, denn Abwärtskompatibilität ist der Name von Microsofts Spiel.
quelle
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 wegwerfen, haben Sie es direkt mit "Clip-Space" zu tun. Die OpenGL-Spezifikation definiert den Clip-Space als ein homogenes 4D-Koordinatensystem. Wenn Sie den Transformationen durch normalisierte Gerätekoordinaten und bis in den Fensterbereich folgen, finden Sie dies.
Der Fensterbereich liegt 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 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 . Das + Z geht also vom Betrachter weg .
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. Aber der Standardzustand OpenGL ist in einer Arbeit linkshändigen Koordinatensystem. Und keine der Transformationen, die erforderlich sind, um vom Clip-Space zum Fenster-Space zu gelangen, negiert das Z. Also ist der Clip-Space, die Ausgabe des Vertex- (oder Geometrie-) Shaders, ein linkshändiger Space (irgendwie. Es ist also ein 4D-homogener Space) es ist schwer, die Händigkeit zu bestimmen).
Im Festfunktions - Pipeline, die Standard - Projektionsmatrizen (hergestellt von glOrtho, glFrustum und dergleichen) , die alle aus einem rechtshändigen Raum in einen Transformations linkshändigen ein. Sie drehen die Bedeutung von Z um; Überprüfen Sie einfach die Matrizen, die sie generieren. Im Augenraum bewegt sich + Z in Richtung des Betrachters. 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.
quelle
Es ist reine Geschichte. In der Antike dachten die frühen Programmierer von Höhlengrafiken, die Bildschirmoberfläche (Teletyp? Stonetyp?) Sei zweidimensionales Millimeterpapier. In Mathematik und Ingenieurwesen lauten die üblichen Konventionen zum Zeichnen von Datenpunkten auf Millimeterpapier: x = rechts, y = oben. Eines Tages, ungefähr eine Woche nach der Erfindung des Siliziumrads, dachte jemand an 3D-Grafiken. Wenn die Glühbirne dieser Idee über ihrem Kopf aufleuchtete, fügten sie aus irgendeinem Grund Z = vom Betrachter weg hinzu. (Autsch, meine rechte Hand tut weh, wenn ich mir das nur vorstelle.)
Sie hatten keine Ahnung, dass ihre fernen 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 in Einklang zu stehen.
Es ist töricht, das 3D-Koordinatensystem auf die Anzeigefläche zu stützen. Es ist das Modell, das zählt - die Dreiecke und Polygone und Flugzeuge, 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 im Hinblick auf die Welt des Modells, noch bevor wir darüber nachdenken, wie es wiedergegeben wird. Die Kamera wird irgendwann hinzugefügt, um möglicherweise auf verrückte Weise herumzufliegen, und es handelt sich um eine unsichtbare Infrastruktur, die das Modell in Pixel umwandelt, die in ihrem Innersten mit koordinierten Systemtransformationen herumlaufen müssen.
Um die Verwirrung noch zu verstärken, erkennen einige Grafikbibliotheken, dass CRTs das Bild von oben nach unten scannen und daher Y = unten haben. Dies wird auch heute noch in allen Fenstersystemen und Windows-Managern verwendet - X11, fvwm, gtk +, Win31 API usw. Wie neuartige 3D-GUI-Systeme wie Clutter, Beryl usw. mit Z umgehen, ist eine andere Frage als die 3D-Grafikmodellierung. Dies betrifft nur Anwendungsprogrammierer und GUI-Designer.
quelle
Sie sind beide im Wesentlichen äquivalent, wie man leicht werden transformiert in die andere. 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, warum Microsoft sich dafür entschieden hat.
POV-Ray verwendet auch ein linkshändiges Corridnate-System.
quelle
Der Hauptentwickler von DirectX (und Direct3D) Alex St. John hat dies kürzlich kommentiert. In einem Artikel über die Geschichte von Direct3D schrieb er:
Quelle: http://www.alexstjohn.com/WP/2013/07/22/the-evolution-of-direct3d/
quelle
Zu verstehen ist, dass eine RIESIGE Menge an Programmiererzeit 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 dies ging verloren, als rechtshändige Koordinatensysteme zum Industriestandard wurden.
Es sind bereits genügend Koordinatensysteme gebräuchlich, ohne die Anzahl durch Einführung einer Händigkeits- frage zu verdoppeln. Siehe Minkler & Minkler, "Aerospace Coordinate Systems and Transformations" . Wenn Sie im Bereich der Luft- und Raumfahrtkoordinaten tätig sind und beispielsweise Flugsimulationen durchführen, BRAUCHEN Sie dieses Buch.
Ich vermute, dass Microsoft im DirectX-Projekt niemanden 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 dass sie DirectX absichtlich für Linkshänder gemacht haben, um es für Leute SCHWER zu machen, Code zu konvertieren, der DirectX verwendet, um stattdessen OpenGL zu verwenden, spielt keine Rolle. Wenn ich herausfinden würde, 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 einzuschlagen.
quelle
Für alle, die glauben, Rechts- oder Linkshändigkeit habe keinen Vorteil, liegen Sie absolut falsch. Die Rechtshändigkeit kartesischer Koordinatensysteme ergibt sich aus der Definition des Vektorkreuzprodukts. Für XYZ Basisvektoren
u
,v
undw
,w = u X v
.Diese Definition ist für die Vektormathematik, die Vektorrechnung und einen Großteil der Physik von grundlegender Bedeutung. Angenommen, Sie versuchen, elektromagnetische Wechselwirkungen zu simulieren. Sie haben einen Magnetfeldvektor
M
und ein geladenes Teilchen, das sich mit Geschwindigkeit in diesem Feld bewegtv
. In welche Richtung beschleunigt sich die Ladung? Einfach - in RichtungM X v
. Abgesehen davon, dass ein Idiot dachte, es würde Spaß machen, Ihr Anzeigesystem für Linkshänder zu machen, so dass es in die Richtung von beschleunigt-M X v
.Grundsätzlich wird jede physikalische Interaktion zwischen zwei Vektorgrößen als rechtshändig definiert. Wenn Sie also diese Interaktion simulieren müssen, sollten Sie hoffen, dass Ihr Grafiksystem rechtshändig ist, oder Sie müssen daran denken, negative Vorzeichen in den Warenkorb zu legen alle deine Mathe.
quelle
0,0,1
Vorwärts" eine Bedeutung geben , und das ist links, also1,0,0 X 0,1,0
mach0,0,1
es linksM X v
, das MagnetfeldM
wird jedoch als in die entgegengesetzte Richtung gerichtet angesehen, da es sich um einen Pseudovektor handelt. Sie können in beiden Systemen die gleichen Gleichungen verwenden: Das einzige, was sich ändert, ist Ihre Interpretation, auf welche Weise die Pseudovektoren "zeigen". Richtige Vektoren wie die Beschleunigung funktionieren in beiden Koordinatensystemen immer gleich. en.wikipedia.org/wiki/Pseudovector#The_right-hand_ruleDie eigentliche Antwort auf die frühe Linkshändigkeit von Direct3D ist viel weniger düster als manche von Ihnen spekulieren. DirectX hatte seinen Anfang, 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, die alles mit linkshändigen Koordinaten erledigen. Es ist das gleiche Buch, das ich im College verwendet habe. Wenn Sie sich den D3D-Code ansehen, sehen Sie sogar, dass sie Variablennamen verwenden, die mit den Gleichungen im Buch übereinstimmen.
Es ist keine Verschwörung von Microsoft. Die Entscheidung wurde getroffen, bevor Microsoft überhaupt ins Bild kam.
quelle
Keines ist letztendlich besser als das andere - Sie ordnen 3D-Koordinaten einer 2D-Oberfläche zu, sodass die dritte Dimension (die tatsächlich 3D-Elemente erzeugt) 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, sich für eine über die andere zu entscheiden. Funktional könnte man argumentieren:
Schlussfolgerung : Es besteht ein gewisser Konsens für die X-Achse, aber für die beiden anderen Richtungen können beide Richtungen argumentiert werden, was zu zwei rechtshändigen und zwei linkshändigen Konfigurationen führt, und alle sind sinnvoll.
quelle
Interessante Tatsache.
Direct3D (nicht DirectX - DirectX deckt auch Eingabe, Ton usw. ab) verfügt nicht über ein linkshändiges Koordinatensystem.
Es ist perfekt in der Lage, sowohl RH- als auch LH-Systeme zu unterstützen. In der SDK-Dokumentation finden Sie Funktionen wie D3DXMatrixPerspectiveFovLH und D3DXMatrixPerspectiveFovRH. Beide Arbeiten und beide erzeugen eine Projektionsmatrix, die erfolgreich mit dem Koordinatensystem Ihrer Wahl verwendet werden kann. Verdammt, Sie können in Direct3D sogar Column-Major verwenden, wenn Sie möchten. Es ist nur eine Software-Matrix-Bibliothek, und Sie müssen sie nicht verwenden. Wenn Sie es jedoch mit OpenGL verwenden möchten, werden Sie feststellen, dass es auch perfekt mit OpenGL funktioniert (was vielleicht 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. Wenn Sie ein LH-System in OpenGL verwenden möchten, verwenden Sie glLoadMatrix, eine LH-Projektionsmatrix. Nichts von alledem ist wichtig und es ist nicht annähernd das große Problem, das man manchmal sieht.
quelle
Es gibt keinen technischen Vorteil für beide Hände, es ist völlig willkürlich. Beide funktionieren einwandfrei, solange Sie konsistent sind.
Wegen 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 eine gewisse Konsistenz innerhalb bestimmter Communities (zB OpenGL).
Ich denke, die grundlegende Antwort auf diese Frage lautet: Sie haben sich für das entschieden, was sie gewählt haben, weil es sich richtig anfühlte (ohne Zweifel hatten sie bereits Erfahrung mit dieser Händigkeit), und es gab wenig Grund, dies nicht zu tun.
Letztendlich macht es keinen Unterschied - jeder, der ernsthaft Assets / Code mit anderen Systemen / Communities austauschen möchte, muss sich auf jeden Fall auf die Händigkeitskonvertierung einstellen, denn dies ist eine Tatsache, die in der 3D-Grafik zum Alltag gehört.
quelle
Dies als ergänzendes Material zu meiner vorherigen Antwort hier zur Verfügung stellen. Aus einer alten OpenGL-Spezifikation aus den 1990er Jahren:
(Quelle: http://www.opengl.org/documentation/specs/version1.2/opengl1.2.1.pdf ).
Da also weder D3D noch OpenGL irgendeine Händigkeit erzwingen, lautet die eigentliche Frage: Warum sehen die Leute das als eine große Sache an?
quelle
Ich sage es dir nur ungern, aber die 'Hand' eines Satzes von Koordinaten ist tatsächlich subjektiv - es hängt davon ab, wie du dir vorstellst, dass du Dinge betrachtest. Ein Beispiel aus der OpenGL-Würfelkartenspezifikation: Wenn Sie sich vorstellen, im Würfel nach außen zu schauen, ist das Koordinatensystem linkshändig, wenn Sie von außen nach innen schauen, ist es rechtshändig. Diese einfache Tatsache verursacht endlosen Kummer, denn um eine numerisch korrekte Antwort zu erhalten, müssen alle Ihre Annahmen konsistent sein, auch wenn es vor Ort nicht wirklich darauf ankommt, welche Annahme Sie machen.
Die OpenGL-Spezifikation ist offiziell "handlungsneutral" und unternimmt große Anstrengungen, um dieses Problem zu vermeiden - das heißt, um es auf den Programmierer zu übertragen. Es gibt jedoch einen "Handwechsel" zwischen Augenkoordinaten und Clipkoordinaten: Im Modell- und Augenraum schauen wir hinein, im Clip- und Geräteraum schauen wir hinaus. Ich kämpfe immer mit den Konsequenzen dieser zweifellos zufälligen Komplikation.
Das Kreuzprodukt ist unser Freund, weil Sie damit aus zwei Vektoren ein definitiv rechtshändiges oder linkshändiges 3D-Koordinatensystem erzeugen können. Aber welche Hand es ist, hängt davon ab, welchen dieser Vektoren Sie "X" nennen.
quelle
Ich könnte sagen, dass der Industriestandard von Anfang an falsch ist
Der Industriestandard für Koordinaten kam tatsächlich von der Tischkoordinate, wenn die Leute alles auf dem Tisch zeichnen, der horizontalen Ebene. X ist links / rechts und Y ist vorne / hinten, so dass Z nur nach oben zeigt und das als rechtshändiges Koordinatensystem geboren wurde
Aber Sie wissen, dass wir jetzt mit Monitorbildschirm verwenden Es ist vertikale Ebene. X ist immer noch links / rechts, aber Y ist stattdessen oben und unten
Was würde also ein rechtshändiges Koordinatensystem verursachen? Es macht + Z rückwärts und -Z vorwärts sein Was zum Teufel ist das? Oben ist + und Unten ist - Rechts ist + und Links ist - ABER Vorwärts ist - und Rückwärts ist + ??? Es ist so dumm, wenn wir das Spiel so machen, dass es in der 3D-Welt läuft, aber wir müssen minus z, um weiterzumachen. Deshalb schätzen Spieleprogrammierer DirectX am meisten
Sich einen Standard zu schnappen, der vom Schreibtisch kam und ihn auf dem Monitor zu verwenden, ist auf vielen Ebenen von Anfang an so falsch. Und jetzt sollten wir zugeben, dass sie, OpenGL und Industry, falsch liegen. Sie verwenden nur das, was sie für bequem halten, aber sie sind falsch und das rechtshändige Koordinatensystem ist nur ein Überbleibsel, das so schnell wie möglich weggeworfen werden sollte
quelle