Voxel-Darstellung aus dreidimensionalem Array

Spiele, Demos, Grafikzeug und anderes unterhaltendes.
Jan125
Beiträge: 31
Registriert: 23.06.2013 06:26
Computerausstattung: Nicht lachen. Atom Z3775, 2GiB RAM, Win8.1.

Voxel-Darstellung aus dreidimensionalem Array

Beitrag 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!
Zuletzt geändert von Jan125 am 17.04.2018 17:34, insgesamt 3-mal geändert.
Wer braucht schon Unicode? PB5.24LTS
True29
Beiträge: 283
Registriert: 18.08.2012 19:18
Computerausstattung: Windows 8 64bit .Profan x2,Purebasic 5.5
Wohnort: Worms
Kontaktdaten:

Re: Voxel-Darstellung aus dreidimensionalem Array

Beitrag von True29 »

hey , coole sache ;)
getestet funktioniert wunder bar.

ggf. kann man das ja auch als effekt für ein spiel benutzen.
i7,12gb ram , Windows 10 ,Purebasic 5.50
Jan125
Beiträge: 31
Registriert: 23.06.2013 06:26
Computerausstattung: Nicht lachen. Atom Z3775, 2GiB RAM, Win8.1.

Re: Voxel-Darstellung aus dreidimensionalem Array

Beitrag 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.
Wer braucht schon Unicode? PB5.24LTS
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6994
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Voxel-Darstellung aus dreidimensionalem Array

Beitrag 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.
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
Jan125
Beiträge: 31
Registriert: 23.06.2013 06:26
Computerausstattung: Nicht lachen. Atom Z3775, 2GiB RAM, Win8.1.

Re: Voxel-Darstellung aus dreidimensionalem Array

Beitrag 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!
Benutzeravatar
Darky
Beiträge: 210
Registriert: 18.09.2004 20:53
Wohnort: Gelsenkirchen / NRW
Kontaktdaten:

Re: Voxel-Darstellung aus dreidimensionalem Array

Beitrag 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 ?
Jan125
Beiträge: 31
Registriert: 23.06.2013 06:26
Computerausstattung: Nicht lachen. Atom Z3775, 2GiB RAM, Win8.1.

Re: Voxel-Darstellung aus dreidimensionalem Array

Beitrag 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.
Wer braucht schon Unicode? PB5.24LTS
Benutzeravatar
Kukulkan
Beiträge: 1066
Registriert: 09.09.2004 07:07
Wohnort: Süddeutschland
Kontaktdaten:

Re: Voxel-Darstellung aus dreidimensionalem Array

Beitrag 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:
Jan125
Beiträge: 31
Registriert: 23.06.2013 06:26
Computerausstattung: Nicht lachen. Atom Z3775, 2GiB RAM, Win8.1.

Re: Voxel-Darstellung aus dreidimensionalem Array

Beitrag 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.
Wer braucht schon Unicode? PB5.24LTS
Antworten