Seite 1 von 1

Voxel-Darstellung aus dreidimensionalem Array

Verfasst: 16.04.2017 20:00
von Jan125
Okay, des ist jetz so ziemlich das zweite Code-Snippet was ich hier veröffentliche...

Für Leute, die Grafikkarten verabscheuen und stattdessen lieber 354GHz Einkernprozessoren* bevorzugen habe ich nun die ultimative Lösung zur Darstellung von 3D-Grafiken gefunden - wenn auch extrem langsam, und ohne Polygone.

*Jetzt auch in gethreadeter Version.

Hier jetzt also eine kleine Voxeldarstellungsengine.
Bewegung erfolgt via IJKL, sich umgucken kann man via WASD.
LShift steigt nach oben, LCtrl sinkt nach unten.

Die vertikale Blickrichtung ist aufgrund von starken Verzerrungen auf 30° in beide Richtungen limitiert.
Die Bilddatei für das Sprite wird als mehrschichtiges, quadratisches Modell behandelt, in etwa wie eine MRT-Aufnahme, wobei dort $FF00FF als durchsichtig gilt.

Auch wenn der Code nicht besonders gut ist, so könnte er dennoch einige Leute interessieren, hoffe ich zumindest.

Anmerkung: Der Debugger verringert die Ausführungsgeschwindigkeit erheblich, also vorher ausschalten.



Im .zip befinden sich SRT[Nummer], der framebasierte, konventionelle Raytracer, und SRT[Nummer]T, die threadbasierte Version mit dynamischen Updates.
Letztere könnte bei einigen Konfigurationen nicht funktionieren, und ich bin mir immer noch nicht ganz sicher, warum das so ist.


Screenshot vom gethreadeten Renderer auf vierfacher Auflösung mit 16facher Genauigkeit:
Bild


Link zum aktuellsten .zip:
Klick!


EDIT:
Neueste Singlethreadversion.
Noch mehr Klick!

Re: Voxel-Darstellung aus dreidimensionalem Array

Verfasst: 18.04.2017 01:17
von True29
hey , coole sache ;)
getestet funktioniert wunder bar.

ggf. kann man das ja auch als effekt für ein spiel benutzen.

Re: Voxel-Darstellung aus dreidimensionalem Array

Verfasst: 18.04.2017 09:14
von Jan125
Oder für ein Spiel an sich.
Momentan arbeite ich an einer Verschönerung des Codes, und auch an einer Thread-basierten Version mit dynamischen Bildupdates.

Funktioniert beides wunderbar auf meinen Maschinen (eine Workstation mit'm Xeon E31230, und 'n Tablet mit 'nem Zweikern-Atom), das Gethreadete jedoch nicht auf dem PC einer Internetbekanntschaft.
Könnte am direkten Bufferzugriff liegen.

Wie auch immer: Beide Versionen sind nun als .zip im Post 1 zu finden, wobei ich SRT7T lieber nicht angucken würde. Grauenvoller Spaghetticode.

Re: Voxel-Darstellung aus dreidimensionalem Array

Verfasst: 19.04.2017 20:46
von STARGÅTE
Coole Idee,

vielleicht kannst du dieses Include oder Codeteile daraus gebrauchen: Drawing3D - Draw-Befehle für 3D-Szenen
(Es entstand auch aus der Irrwitzigen Idee, man bräuchte keine Grafikkarte für 3D)

Noch als Hinweis:

Code: Alles auswählen

For i = 0 To Random(500000)
  Volume(Random(ArraySize(Volume(), 1)), Random(ArraySize(Volume(), 2)), Random(ArraySize(Volume(), 3))) = $FFFFFF
Next
Dieser Code funktioniert nicht so wie ich denke das du es denkst.
Mit jeder Iterationsschleife wird Random(500000) neu berechnet, sommit kann es im ersten Durchlauf (i=0) zB 2534 sein, dann kommt Next und i = 1 aber auch die To-Grenze wird neu Errechnet und könnte dann nur noch 100 sein oder gar "zufällig" 0 und dann bricht die schleife schon ab. Hier ein Beispiel:

Code: Alles auswählen

Procedure.i MyRandom(Value.i)
	Protected Random = Random(Value)
	Debug "MyRandom = "+Random
	ProcedureReturn Random
EndProcedure

Define I.i

RandomSeed(0)
For I = 0 To MyRandom(10)
	Debug "I = "+I
Next
Gleiches gilt übrigens für:

Code: Alles auswählen

  For Z = 0 To SpriteWidth(Sprite)/SpriteHeight(Sprite)-1
    For Y = 0 To SpriteHeight(Sprite)-1
      For X = 0 To SpriteHeight(Sprite)-1
Hier wird mit jedem Voxel das Sprite erneut gesucht und SpriteHeight berechnet, oder sogar "langsam" dividiert.

Re: Voxel-Darstellung aus dreidimensionalem Array

Verfasst: 20.04.2017 08:36
von Jan125
Hoppla, das Random() hatte ich ganz vergessen, wohl ein kleiner Gehirnaussetzer meinerseits. :>

Da die Übertragung vom Sprite in den Array nur einmal ausgeführt wird, hatte ich Schnelligkeit nicht grade als Hauptziel, soll eh nur 'ne Demo sein - erstmal. :P

Drawing3D hatte ich mir schonmal ganz am Anfang angeguckt, aber es noch nicht wirklich ausprobiert. Muss ich bei Gelegenheit mal machen!

Re: Voxel-Darstellung aus dreidimensionalem Array

Verfasst: 15.04.2018 14:12
von Darky
Hübsch hübsch soweit :-)

kann man auch um ein Objekt ( zbsp das Schiff ) rotieren oder stell ich mich nur blöd an ?

Re: Voxel-Darstellung aus dreidimensionalem Array

Verfasst: 17.04.2018 12:15
von Jan125
Inwiefern rotieren?
Wennst meinst, ob man das Bild im oder gegen den Uhrzeigersinn drehen kann:
Nö, das ist nicht drinne, und da fehlt mir auch der Skill. D:

Lade heute Abend mal die neueste Version hoch.

Re: Voxel-Darstellung aus dreidimensionalem Array

Verfasst: 17.04.2018 12:56
von Kukulkan
Hm, unter KDE Neon (im Prinzip Kubuntu 16.04) mit PB 5.46 x64 kommt nix. Ein Fenster geht auf, bleibt aber schwarz. :cry:

Re: Voxel-Darstellung aus dreidimensionalem Array

Verfasst: 17.04.2018 15:55
von Jan125
Ich programmiere nicht wirklich für LiGNUx, aber probier mal 32-bit Compiler, kommentiere den Floating-Point Hackjob aus, und wenn's ganz hart kommt: Lass MixColors einfach Farbe 2 zurückgeben.