Hi.
Es kam mir der Gedanke, es dürfte doch möglich sein, mittels mathematiischer Berechnungen eine 3D-Welt auf einem Canvas oder via Sprite-Library auf einem Screen zu rendern.
Meine Frage ist, wie ermittelt man die Screenpositionen der 3D-Punkte und wie erfährt man, ob eine Textur/Oberläche im Vordergrund oder hinter anderen Oberflächen/Texturen posioniert ist?
Ich saß im Mathe-Leistungskurs, ihr könnt also gern Formeln herballern. Mir persönlich fehlt jeglicher Ansatz...
Grüße
es_91
Self-made 3D innerhalb 2D-Engine?
Re: Self-made 3D innerhalb 2D-Engine?
Mittels Drawing2D und einem Canvas ist es ohne weiteres möglich eine 3D Welt zu rendern, hier ein Include von mir:es_91 hat geschrieben:Es kam mir der Gedanke, es dürfte doch möglich sein, mittels mathematiischer Berechnungen eine 3D-Welt auf einem Canvas oder via Sprite-Library auf einem Screen zu rendern.
Drawing3D - Draw-Befehle für 3D-Szenen
Mit der Sprite-Library geht es leider nur eingeschränkt. Zwar ist es ohne Probleme möglich Sprites als 3D-Welt zu rendern (http://www.purebasic.fr/german/viewtopi ... 71#p336371), da jedoch die Sprites nacheinander gerendert werden, ist zwar eine Z-Sortierung möglich, aber keine Durchdringung!
Dazu benutzt man homogene Koordinaten, also 4-Dimensionale Vektoren, von denen 3 die drei Raumrichtungen X, Y und Z präsentieren und die 4. Komponente W = 0 (Richtung) oder W = 1 (Ort) ist. Mit zusätzlichen 4D-Matrizen können dann alle möglichen Transformationen durchgeführt werden und Schluss endlich bekommt man wieder ein 4D-Vektor, von dem X und Y deine Screenkoordinaten sind und Z und W Informationen zur Tiefe enthalten.es_91 hat geschrieben:Meine Frage ist, wie ermittelt man die Screenpositionen der 3D-Punkte und wie erfährt man, ob eine Textur/Oberläche im Vordergrund oder hinter anderen Oberflächen/Texturen posioniert ist?
Weiterführende Links:
https://en.wikipedia.org/wiki/3D_projection
http://www.songho.ca/opengl/gl_projectionmatrix.html
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Re: Self-made 3D innerhalb 2D-Engine?
>>es_91 hat geschrieben:Es kam mir der Gedanke, es dürfte doch möglich sein, mittels mathematiischer Berechnungen eine 3D-Welt auf einem Canvas oder via Sprite-Library auf einem Screen zu rendern.
Hierfür danke! Ich werde mich damit auseinandersetzen, doch zuerst noch ein paar Fragen zu viewtopic.php?f=10&t=22128STARGÅTE hat geschrieben:https://en.wikipedia.org/wiki/3D_projection
http://www.songho.ca/opengl/gl_projectionmatrix.html
Ein Grund, warum ich hier die Frage stelle, ist das Ding mit SpiderBasic. Dort hat es derzeit keine 3D-Engine und ein Browser dürfte sowieso nochmal viel langsamer reagieren, als eine "echte" Grafik-CPU, darum frage ich Dich direkt:STARGÅTE hat geschrieben:Das Include soll nicht als 3D-Engine benutzt werden (dafür ist es zu langsam), sondern dient zum Rendern von kleinen Szenen.
Könnte Dein include irgendwie auf moderneren Rechnern noch eine 3D-Engine für Spiele/kleinere Welten und Szenerien im Browser abgeben?
Sicher verwendest Du auch Pointer, die unter SpiderBasic ja meiner Festellung nach nur sehr eingeschränkt funktionieren.
Des Weiteren:
Das hieße nicht nur, dass Transparenz unmöglich wäre, sondern auch jede Art "interner" Beleuchtung, richtig ? Aber es gab doch die Möglichkeit, Sprites auch transparent darzustellen, könntest Du bitte dazu etwas sagen?STARGÅTE hat geschrieben:Mit der Sprite-Library geht es leider nur eingeschränkt. Zwar ist es ohne Probleme möglich Sprites als 3D-Welt zu rendern [...], da jedoch die Sprites nacheinander gerendert werden, ist zwar eine Z-Sortierung möglich, aber keine Durchdringung!
Re: Self-made 3D innerhalb 2D-Engine?
>> "Könnte Dein include irgendwie auf moderneren Rechnern noch eine 3D-Engine für Spiele/kleinere Welten und Szenerien im Browser abgeben?"
Ich denke nicht. "Heute" schreibt man keine CPU-3D-Engine mehr, dafür ist die Erwartungshaltung für das was dargestellt wird zu hoch. Was ich damit sagen will ist: Wenn deine 3D-Welt nur auch Linien besteht, ist meine Engine durchaus geeignet, aber sobald Texturen gargestellt werden sollen (was ja gehen würde) wäre die CPU-Lösung viel zu langsam.
Auch Browsergames nutzen ja nicht die CPU sondern haben ebenbürtige "echte" 3D-Engines.
>> "Das hieße nicht nur, dass Transparenz unmöglich wäre, sondern auch jede Art "interner" Beleuchtung, richtig ? Aber es gab doch die Möglichkeit, Sprites auch transparent darzustellen, könntest Du bitte dazu etwas sagen?"
(halb)-Transparente Sprites darzustellen ist ohne weiteres möglich. Man muss dabei nur auf die genaue Reihenfolge achten.
Wenn also alle anzuzeigenden Sprites (bzw. Texturflächen) erst nach Z-Tiefe sortiert werden und dann von hinten nach vorne angezeigt werden, funktioniert das.
Die Beleuchtung ist da etwas komplizierter. Da du keinerlei Zugriff auf die Pixel hast (im Rahmen der Sprite-Lib) und nicht mal die 4 Ecken des Sprites kontrollieren kannst, können nur immer ganze Sprites einheitlich in der Farbe geändert werden.
Ich denke nicht. "Heute" schreibt man keine CPU-3D-Engine mehr, dafür ist die Erwartungshaltung für das was dargestellt wird zu hoch. Was ich damit sagen will ist: Wenn deine 3D-Welt nur auch Linien besteht, ist meine Engine durchaus geeignet, aber sobald Texturen gargestellt werden sollen (was ja gehen würde) wäre die CPU-Lösung viel zu langsam.
Auch Browsergames nutzen ja nicht die CPU sondern haben ebenbürtige "echte" 3D-Engines.
>> "Das hieße nicht nur, dass Transparenz unmöglich wäre, sondern auch jede Art "interner" Beleuchtung, richtig ? Aber es gab doch die Möglichkeit, Sprites auch transparent darzustellen, könntest Du bitte dazu etwas sagen?"
(halb)-Transparente Sprites darzustellen ist ohne weiteres möglich. Man muss dabei nur auf die genaue Reihenfolge achten.
Wenn also alle anzuzeigenden Sprites (bzw. Texturflächen) erst nach Z-Tiefe sortiert werden und dann von hinten nach vorne angezeigt werden, funktioniert das.
Die Beleuchtung ist da etwas komplizierter. Da du keinerlei Zugriff auf die Pixel hast (im Rahmen der Sprite-Lib) und nicht mal die 4 Ecken des Sprites kontrollieren kannst, können nur immer ganze Sprites einheitlich in der Farbe geändert werden.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Re: Self-made 3D innerhalb 2D-Engine?
Ok. Was wäre, wenn die Welt nicht aus Texturen, sondern nur aus einfarbigen Flächen bestehen würde? Kannst Du dazu derzeit eine Aussage treffen?
(Wenn ich Dich richtig verstanden habe, würde schon ein berechneter Farbverlauf/Gradient zuviel Leistung ziehen, stimmt das auch?)
_________________________________
>> Wenn deine 3D-Welt nur auch Linien besteht, ist meine Engine durchaus geeignet, aber sobald Texturen gargestellt werden sollen [...] wäre die CPU-Lösung viel zu langsam.
_________________________________
Wieder ein Dankeschön.
(Wenn ich Dich richtig verstanden habe, würde schon ein berechneter Farbverlauf/Gradient zuviel Leistung ziehen, stimmt das auch?)
_________________________________
>> Wenn deine 3D-Welt nur auch Linien besteht, ist meine Engine durchaus geeignet, aber sobald Texturen gargestellt werden sollen [...] wäre die CPU-Lösung viel zu langsam.
_________________________________
Wieder ein Dankeschön.
Re: Self-made 3D innerhalb 2D-Engine?
Textur oder Fläche ist egal, es kommt auf die gerenderten Pixel an.es_91 hat geschrieben:Ok. Was wäre, wenn die Welt nicht aus Texturen, sondern nur aus einfarbigen Flächen bestehen würde? Kannst Du dazu derzeit eine Aussage treffen?
Nein. Wenn eine Fläche eh berechnet werden muss, und Pixel für Pixel gerendert wird, ist ein "bisschen" Farbverlauf auch nicht mehr wild.es_91 hat geschrieben:(Wenn ich Dich richtig verstanden habe, würde schon ein berechneter Farbverlauf/Gradient zuviel Leistung ziehen, stimmt das auch?)
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Re: Self-made 3D innerhalb 2D-Engine?
Und könnte man die pixelgenaue Renderung nicht umgehen, indem man jede Textur der Reihe nach zweidimensional verzerrt und dann, rundum transparent, alle übereinanderzeichnet?