Inhaltsverzeichnis:
Video: 3D-Viewer - Gunook
2024 Autor: John Day | [email protected]. Zuletzt bearbeitet: 2024-01-30 07:21
Hallo! Um mein Interesse am Programmieren und hoffentlich auch Ihres zu befriedigen, möchte ich Ihnen einen 3D-Viewer zeigen, den ich in Javascript kodiert habe. Wenn Sie Ihr Verständnis von 3D-Spielen vertiefen oder sogar Ihr eigenes 3D-Spiel erstellen möchten, ist dieser Prototyp des 3D-Viewers perfekt für Sie.
Schritt 1: Die Theorie
Um die Theorie dieses 3D-Viewers zu verstehen, können Sie einfach untersuchen, wie Sie Ihre Umgebung betrachten (es hilft, nur eine signifikante Lichtquelle zu haben). Beachte das:
- Objekte, die weiter von Ihnen entfernt sind, nehmen einen kleineren Teil Ihres Sichtfeldes ein.
- Objekte, die weiter von der Lichtquelle entfernt sind, erscheinen dunkler.
- Wenn Oberflächen paralleler (weniger senkrecht) zur Lichtquelle werden, erscheinen sie dunkler.
Ich beschloss, ein Sichtfeld mit einer Reihe von Linien darzustellen, die von einem einzigen Punkt ausgehen (analog zum Augapfel). Wie bei einem Stachelball müssen die Linien gleichmäßig verteilt sein, um sicherzustellen, dass jeder Teil des Sichtfelds gleich dargestellt wird. Beachten Sie im Bild oben, wie die Linien, die von der Spike-Kugel kommen, weiter auseinander gehen, wenn sie sich weiter von der Mitte der Kugel entfernen. Dies hilft, die Implementierung von Beobachtung 1 durch das Programm zu visualisieren, da die Liniendichte abnimmt, wenn sich Objekte weiter vom Mittelpunkt entfernen.
Die Linien sind die grundlegende Seheinheit des Programms und werden jeweils einem Pixel auf dem Display zugeordnet. Wenn eine Linie ein Objekt schneidet, wird das entsprechende Pixel basierend auf seinem Abstand von der Lichtquelle und seinem Winkel von der Lichtquelle gefärbt.
Schritt 2: Implementierungstheorie
Um das Programm zu vereinfachen, entspricht die Lichtquelle dem Mittelpunkt (Augapfel: Punkt, von dem aus die Karte betrachtet wird und von dem die Linien stammen). Analog zum Halten eines Lichts direkt neben Ihr Gesicht werden Schatten eliminiert und die Helligkeit jedes Pixels viel einfacher berechnet.
Das Programm verwendet auch Kugelkoordinaten, wobei der Blickmittelpunkt im Ursprung liegt. Dies ermöglicht eine einfache Erzeugung der Linien (jeweils mit einem eindeutigen Theta: Horizontalwinkel und Phi: Vertikalwinkel) und liefert die Grundlage für Berechnungen. Zeilen mit demselben Theta werden auf Pixel in derselben Zeile abgebildet. Der phis entsprechender Winkel nimmt über jede Pixelreihe zu.
Um die Mathematik zu vereinfachen, besteht die 3D-Karte aus Ebenen mit einer gemeinsamen Variablen (gemeinsames x, y oder z), während die anderen beiden nicht gemeinsamen Variablen auf einen Bereich beschränkt sind, wodurch die Definition jeder Ebene vervollständigt wird.
Um sich mit der Maus umzusehen, berücksichtigen die Gleichungen des Programms eine vertikale und horizontale Drehung bei der Umrechnung zwischen Kugel- und xyz-Koordinatensystemen. Dies hat den Effekt, dass eine Rotation auf dem "Spikeball"-Satz von Sichtlinien ausgeführt wird.
Schritt 3: Mathe
Die folgenden Gleichungen ermöglichen es dem Programm, zu bestimmen, welche Linien jedes Objekt schneiden und Informationen zu jedem Schnittpunkt. Ich habe diese Gleichungen aus den grundlegenden Kugelkoordinatengleichungen und den 2D-Rotationsgleichungen abgeleitet:
r=Entfernung, t=Theta(horizontaler Winkel), p=phi(vertikaler Winkel), A=Drehung um Y-Achse (vertikale Drehung), B=Drehung um Z-Achse (horizontale Drehung)
Kx=(sin(p)*cos(t)*cos(A)+cos(p)*sin(A))*cos(B)-sin(p)*sin(t)*sin(B)
Ky=(sin(p)*cos(t)*cos(A)+cos(p)*sin(A))*sin(B)+sin(p)*sin(t)*cos(B)
Kz=-sin(p)*cos(t)*sin(A)+cos(p)*cos(A)
x=r*Kx
y=r*Ky
z=r*Kz
r^2=x^2+y^2+z^2
Beleuchtung=Klight/r*(Kx oder Ky oder Kz)
p=arccos((x*sin(A)*cos(B)+y*sin(A)*sin(B)+z*cos(A))/r)
t=arccos((x*cos(B)+y*sin(B)-p*sin(A)*cos(p))/(r*cos(A)*sin(p)))
Schritt 4: Programm
Ich hoffe, dass Ihnen dieser Prototyp des 3D-Viewers geholfen hat, die Funktionsweise virtueller 3D-Realitäten zu verstehen. Mit etwas mehr Perfektionierung und Codierung hat dieser Viewer sicherlich das Potenzial, in der 3D-Spieleentwicklung eingesetzt zu werden.