Showroom - Aktuelle Arbeiten und Projekte
Forumsregeln
Bitte Präfixe benutzen. Das Präfix "[Projekt]" bewirkt die Aufnahme von Bildern aus den Beiträgen des Themenerstellers in den Showroom. Alle Bilder aus dem Thema Showroom erscheinen ebenfalls im Showroom auf der Frontpage. Es werden nur Bilder berücksichtigt, die entweder mit dem attachement- oder dem img-BBCode im Beitrag angezeigt werden.
Die Bildersammelfunktion muss manuell ausgeführt werden, die URL dazu und weitere Details zum Showroom sind hier zu finden.
This forum is primarily intended for German-language video game developers. Please don't post promotional information targeted at end users.
Bitte Präfixe benutzen. Das Präfix "[Projekt]" bewirkt die Aufnahme von Bildern aus den Beiträgen des Themenerstellers in den Showroom. Alle Bilder aus dem Thema Showroom erscheinen ebenfalls im Showroom auf der Frontpage. Es werden nur Bilder berücksichtigt, die entweder mit dem attachement- oder dem img-BBCode im Beitrag angezeigt werden.
Die Bildersammelfunktion muss manuell ausgeführt werden, die URL dazu und weitere Details zum Showroom sind hier zu finden.
This forum is primarily intended for German-language video game developers. Please don't post promotional information targeted at end users.
-
- Establishment
- Beiträge: 308
- Registriert: 25.08.2019, 05:00
- Alter Benutzername: gdsWizard
- Kontaktdaten:
Re: Showroom - Aktuelle Arbeiten und Projekte
Genau es gibt Wände, Bodenplatten, Dächer und per CSG auch Fenster. In Wände kann man Softcubes verwenden.
viewtopic.php?f=10&t=4635
viewtopic.php?f=10&t=4635
Hat den StormWizard 1.0 und 2.0 verbrochen. https://mirrorcad.com
Re: Showroom - Aktuelle Arbeiten und Projekte
Danke.
Ich erinnere mich...
Sehr cool!
Also...das ist richtig gut!!
Beeindruckend für ein privates Projekt...
Ich erinnere mich...
Sehr cool!
Also...das ist richtig gut!!
Beeindruckend für ein privates Projekt...
-
- Establishment
- Beiträge: 308
- Registriert: 25.08.2019, 05:00
- Alter Benutzername: gdsWizard
- Kontaktdaten:
Re: Showroom - Aktuelle Arbeiten und Projekte
Vielleicht splitte ich es in das neue Konzept und eins mit dem Alten. Letzteres ist dann aber etwas langsam.
Hat den StormWizard 1.0 und 2.0 verbrochen. https://mirrorcad.com
Re: Showroom - Aktuelle Arbeiten und Projekte
Nur noch eine letzte Frage (um nicht den gesamten Thread zu fluten):
Du schriebst etwas von Softcubes. Auch dein "alter" Designer hieß ja so.
Was genau sind diese Softcubes?
Habe jetzt auch nicht gegoogel oder so^^
Nachtrag:
Ich glaube die Frage kann ich mir selbst beantworten.
Cubes die man verformen kann. Quasi als Modellierungsgrundlage. Daraus kann man das alles modellieren.... (oder?)
Du schriebst etwas von Softcubes. Auch dein "alter" Designer hieß ja so.
Was genau sind diese Softcubes?
Habe jetzt auch nicht gegoogel oder so^^
Nachtrag:
Ich glaube die Frage kann ich mir selbst beantworten.
Cubes die man verformen kann. Quasi als Modellierungsgrundlage. Daraus kann man das alles modellieren.... (oder?)
Re: Showroom - Aktuelle Arbeiten und Projekte
Okay, sorry: mein letzter Beitrag hier (erstmal).
@MirrorCAD
Dein CAD-Programm finde ich echt gelungen. Zumindest was ich so sehe.
Wäre zu schade um das irgendwo in der "Unbekanntheit" vergammeln zu lassen.
Fand ich ja auch damals bei dem Softcube Designer.
Aber wie und wo man das publik machen soll weiß ich leider auch nicht :-/
Bin auch nicht mehr bei FB; dort war ich in ein paar GameDev-Groups.
Aber irgendwie feierten die auch nur, für mich, unverständliche Sachen^^
Wäre nur echt schade drum, wenn es "nur" in ZFX-Kreisen erwähnt wurde oder wird...
Btw:
GameDevR:
Cooles gepixel^^
Die PoC-Spielerfigur räumt auf? :D
Ist leider etwas zwischen dem Gespräch untergegangen :P
@MirrorCAD
Dein CAD-Programm finde ich echt gelungen. Zumindest was ich so sehe.
Wäre zu schade um das irgendwo in der "Unbekanntheit" vergammeln zu lassen.
Fand ich ja auch damals bei dem Softcube Designer.
Aber wie und wo man das publik machen soll weiß ich leider auch nicht :-/
Bin auch nicht mehr bei FB; dort war ich in ein paar GameDev-Groups.
Aber irgendwie feierten die auch nur, für mich, unverständliche Sachen^^
Wäre nur echt schade drum, wenn es "nur" in ZFX-Kreisen erwähnt wurde oder wird...
Btw:
GameDevR:
Cooles gepixel^^
Die PoC-Spielerfigur räumt auf? :D
Ist leider etwas zwischen dem Gespräch untergegangen :P
- Krishty
- Establishment
- Beiträge: 8316
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: Showroom - Aktuelle Arbeiten und Projekte
Habe ein Analyse-Tool für meine Webserver-Logs hingeklatscht. Logs rein, HTML-Seite mit Statistiken raus.
An der Anzeige kann man noch vieles drehen, aber das war ja nicht der Punkt :)
Warum?
Ab und zu kriege ich fünf E-Mails an einem Tag zu irgendeinem Thema, und dann weiß ich, dass ich irgendwo viral bin. Nur wo?
Ich bin zu blöd und zu faul, meinen eigenen Server zu betreiben. Also hoste ich bei 1&1. Die haben ein Analyse-Tool, aber das hat letzten Monat die Hits auf eine meiner Seiten einfach so gedrittelt. Ohne Grund. Und da kamen mir Zweifel, wie genau das Ganze ist. Für eine andere Seite stammen fast alle angezeigten Daten offensichtlich von Spambots und Hacking-Versuchen. Dann habe ich mir die rohen Logs runtergeladen – scheint Apache zu sein?! – und mich auf die Suche nach was anderem gemacht.
Also google ich, welche Programme man normalerweise zur Auswertung von Apache-Logs verwendet. Erster Vorschlag war Apache Log Analyzer & Viewer von Solarwinds. Die, die letztens Malware an zehntausende zahlende Kunden verteilt haben. LOLFU
Dann habe ich ein Independent-Tool ausprobiert, das man für 20 $ kaufen kann. Die Demo hatte aber wirklich NULL Funktionen.
Also awstats, weil es Open Source und frei ist. Das ist in der Tat mächtig, aber Linux-Erfahrung pur: Perl einrichten. Umgebungsvariablen einrichten. Konfigurationsskripte suchen. Konfigurationsdateien auf gut Glück editieren, bis es startet. Wenn es dann startet, findet es wegen irgendwelchen Pfadproblemen keine Icons und sieht auch sonst aus wie 2002.
An dem Punkt hatte ich so viel Zeit damit verschwendet, dass ich mir dachte, ich hätt’s auch direkt selber hinklatschen können!
Wie?
Ein paar hundert Zeilen C++. Nach dem Parsen der Dateien breche ich alles runter auf Sessions, User, etc.
Ich lege ein paar Dateien bereit, um die Sessions zu klassifizieren. Die wichtigste ist eine Liste von Pfaden à:
/.env
/admin.php
/wp-plugins/imageupload/upload.php
Jede Sitzung, die auf diese Pfade zugreift, gilt direkt als Hacking-Versuch (Scraper).
Jeder Client, der einen String wie diesen im Namen hat …
360Spider
DuckDuckBot
BW/1.1; bit.ly/2W6Px8S
… wird als Crawler eingestuft.
Ähnliche Dateien habe ich für Referrer-Schlüsselwörter (fast alles mit .ru ist Spam); Crawler-Pfade (robots.txt), usw.
Die Sitzungen werden dann runtergebrochen auf besuchte Seiten, häufigste Referrals, usw. ofstream << "<!DOCTYPE html>\n<head>\n und fertig sind die Analytics.
Erkenntnisse?
Diese Auswertung ist so einfach implementierbar, wie sie sich anhört. Ich habe natürlich nur einen winzigen Bruchteil der Features hingeklatscht, die andere Programme bieten. Aber für mich ist dieser Bruchteil schon ausreichend.
Die Hälfte bis drei Viertel des Traffics sind Crawler oder Angriffe. Das wusste ich vorher schon, aber jetzt kann ich mir sicher sein.
Es gibt einen Crawler, der meine Seite seit Jahren im 15-Minuten-Takt ansteuert. Da zwei Abrufe mit 15 Minuten Abstand als eine Sitzung gelten, hatte ich also erstmal eine Jahre dauernde Sitzung mit Zehntausenden Hits. Lustiges Zeug!
Rigorose Erkennung von Bots macht die Analytics so sauber wie ich sie sonst nicht kenne. Ich würde gern 404-Meldungen via Klick direkt als Hacking oder Crawling markieren können, damit ich nicht in Dateien rumpfriemeln muss, wann immer eine neue Bot-Generation ausgerollt wird.
Referrer-Links aufbereiten ist eine Wissenschaft für sich. Bei Google z. B. findet man recht einfach den Suchbegriff. Facebook hängt eine Unique-ID an jeden Klick; wenn man die nicht rausfiltert, hat man 1000 verschiedene Einträge für die selbe URL im Log. Da muss ich mir noch was überlegen.
An der Anzeige kann man noch vieles drehen, aber das war ja nicht der Punkt :)
Warum?
Ab und zu kriege ich fünf E-Mails an einem Tag zu irgendeinem Thema, und dann weiß ich, dass ich irgendwo viral bin. Nur wo?
Ich bin zu blöd und zu faul, meinen eigenen Server zu betreiben. Also hoste ich bei 1&1. Die haben ein Analyse-Tool, aber das hat letzten Monat die Hits auf eine meiner Seiten einfach so gedrittelt. Ohne Grund. Und da kamen mir Zweifel, wie genau das Ganze ist. Für eine andere Seite stammen fast alle angezeigten Daten offensichtlich von Spambots und Hacking-Versuchen. Dann habe ich mir die rohen Logs runtergeladen – scheint Apache zu sein?! – und mich auf die Suche nach was anderem gemacht.
Also google ich, welche Programme man normalerweise zur Auswertung von Apache-Logs verwendet. Erster Vorschlag war Apache Log Analyzer & Viewer von Solarwinds. Die, die letztens Malware an zehntausende zahlende Kunden verteilt haben. LOLFU
Dann habe ich ein Independent-Tool ausprobiert, das man für 20 $ kaufen kann. Die Demo hatte aber wirklich NULL Funktionen.
Also awstats, weil es Open Source und frei ist. Das ist in der Tat mächtig, aber Linux-Erfahrung pur: Perl einrichten. Umgebungsvariablen einrichten. Konfigurationsskripte suchen. Konfigurationsdateien auf gut Glück editieren, bis es startet. Wenn es dann startet, findet es wegen irgendwelchen Pfadproblemen keine Icons und sieht auch sonst aus wie 2002.
An dem Punkt hatte ich so viel Zeit damit verschwendet, dass ich mir dachte, ich hätt’s auch direkt selber hinklatschen können!
Wie?
Ein paar hundert Zeilen C++. Nach dem Parsen der Dateien breche ich alles runter auf Sessions, User, etc.
Ich lege ein paar Dateien bereit, um die Sessions zu klassifizieren. Die wichtigste ist eine Liste von Pfaden à:
/.env
/admin.php
/wp-plugins/imageupload/upload.php
Jede Sitzung, die auf diese Pfade zugreift, gilt direkt als Hacking-Versuch (Scraper).
Jeder Client, der einen String wie diesen im Namen hat …
360Spider
DuckDuckBot
BW/1.1; bit.ly/2W6Px8S
… wird als Crawler eingestuft.
Ähnliche Dateien habe ich für Referrer-Schlüsselwörter (fast alles mit .ru ist Spam); Crawler-Pfade (robots.txt), usw.
Die Sitzungen werden dann runtergebrochen auf besuchte Seiten, häufigste Referrals, usw. ofstream << "<!DOCTYPE html>\n<head>\n und fertig sind die Analytics.
Erkenntnisse?
Diese Auswertung ist so einfach implementierbar, wie sie sich anhört. Ich habe natürlich nur einen winzigen Bruchteil der Features hingeklatscht, die andere Programme bieten. Aber für mich ist dieser Bruchteil schon ausreichend.
Die Hälfte bis drei Viertel des Traffics sind Crawler oder Angriffe. Das wusste ich vorher schon, aber jetzt kann ich mir sicher sein.
Es gibt einen Crawler, der meine Seite seit Jahren im 15-Minuten-Takt ansteuert. Da zwei Abrufe mit 15 Minuten Abstand als eine Sitzung gelten, hatte ich also erstmal eine Jahre dauernde Sitzung mit Zehntausenden Hits. Lustiges Zeug!
Rigorose Erkennung von Bots macht die Analytics so sauber wie ich sie sonst nicht kenne. Ich würde gern 404-Meldungen via Klick direkt als Hacking oder Crawling markieren können, damit ich nicht in Dateien rumpfriemeln muss, wann immer eine neue Bot-Generation ausgerollt wird.
Referrer-Links aufbereiten ist eine Wissenschaft für sich. Bei Google z. B. findet man recht einfach den Suchbegriff. Facebook hängt eine Unique-ID an jeden Klick; wenn man die nicht rausfiltert, hat man 1000 verschiedene Einträge für die selbe URL im Log. Da muss ich mir noch was überlegen.
-
- Establishment
- Beiträge: 308
- Registriert: 25.08.2019, 05:00
- Alter Benutzername: gdsWizard
- Kontaktdaten:
Re: Showroom - Aktuelle Arbeiten und Projekte
Es sind Spline-Objekte die sich mathematisch verformen lassen ( über die Stützpunkte ). Der Begriff Softcube ist eine Erfindung von mir...Joggel hat geschrieben:Ich glaube die Frage kann ich mir selbst beantworten.
Cubes die man verformen kann. Quasi als Modellierungsgrundlage. Daraus kann man das alles modellieren.... (oder?)
Hat den StormWizard 1.0 und 2.0 verbrochen. https://mirrorcad.com
Re: Showroom - Aktuelle Arbeiten und Projekte
@Kristhy, klasse das Ding. Awstats habe ich damals nicht zum Laufen gebracht. Wie du schon sagst, Linux Experience pur. Bin dann bei Webalizer hängen geblieben. Aber das ist halt bei weitem nicht so mächtig wie Awstats. Seit Webalizer nicht mehr weiterentwickelt wird bin ich immer noch auf der Suche nach einer einfachen und vor allem datenschutzkonformen Lösung. Du darfst also gern weiterentwickeln ;)
- Krishty
- Establishment
- Beiträge: 8316
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: Showroom - Aktuelle Arbeiten und Projekte
Werde ich!
Referrers aufbereiten ist Horror, aber irgendwie ist es heute auch nicht mehr so wichtig wie vor einigen Jahren noch. Ich habe über zehntausende Besucher gerade mal vier (4) Referrers von Suchmaschinen mit Suchtext. Alle anderen sind ganz allgemein google.com, bing.com, search.yahoo.com, usw. YouTube hat nur in einem aus ein paar Dutzend Hits eine Video-URL mitgegeben. Twitter kann man sowieso vergessen, da sie alles durch ihren eigenen URL-Shortener zwingen.
Jetzt fehlt noch die Liste von Clients. Ist für mich eigentlich egal, ob die User nun via Chrome oder via Safari surfen – aber für die Crawler-Erkennung ist das fundamental.
Apropos Crawler-Erkennung: Bisher habe ich die vor allem via Client-String gemacht, weil IP knifflig ist. Ein datenschutzkonformer Apache pseudonymisiert die IPs im Log, indem bei IPv4 der letzte Block genullt wird. Bei 16-Bit-IPs rückt das Geburtstagsparadoxon in greifbare Nähe, zumal IPs ja nicht alle Bits effektiv nutzen. Ich habe aber Crawler gesehen, die sich nur bei vereinzelten Zugriffen mit Crawler-Client-String melden und den Großteil des Crawlings mit unauffälligen Client-Strings durchführen. Da kann die korrekte Zuordnung nur via IP erfolgen.
Referrers aufbereiten ist Horror, aber irgendwie ist es heute auch nicht mehr so wichtig wie vor einigen Jahren noch. Ich habe über zehntausende Besucher gerade mal vier (4) Referrers von Suchmaschinen mit Suchtext. Alle anderen sind ganz allgemein google.com, bing.com, search.yahoo.com, usw. YouTube hat nur in einem aus ein paar Dutzend Hits eine Video-URL mitgegeben. Twitter kann man sowieso vergessen, da sie alles durch ihren eigenen URL-Shortener zwingen.
Jetzt fehlt noch die Liste von Clients. Ist für mich eigentlich egal, ob die User nun via Chrome oder via Safari surfen – aber für die Crawler-Erkennung ist das fundamental.
Apropos Crawler-Erkennung: Bisher habe ich die vor allem via Client-String gemacht, weil IP knifflig ist. Ein datenschutzkonformer Apache pseudonymisiert die IPs im Log, indem bei IPv4 der letzte Block genullt wird. Bei 16-Bit-IPs rückt das Geburtstagsparadoxon in greifbare Nähe, zumal IPs ja nicht alle Bits effektiv nutzen. Ich habe aber Crawler gesehen, die sich nur bei vereinzelten Zugriffen mit Crawler-Client-String melden und den Großteil des Crawlings mit unauffälligen Client-Strings durchführen. Da kann die korrekte Zuordnung nur via IP erfolgen.
Re: Showroom - Aktuelle Arbeiten und Projekte
Neues in meinem Framework: Textauszeichnungen.
Da alles immer as simple as possible: Es geht in Richtung BB-Code. Allerdings werden nicht alle Auszeichnungen einzeln definiert, sondern vordefinierte Formate. "[h1]bla\n[]blub" ist die Syntax; leere Klammer hebt alles auf.
Hinter h1 etc. steckt dann ein im aktuellen Projekt beliebig benanntes und definiertes Absatzformat. Definieren lassen sich bisher normal/fett, Größe, Farbe, Linie, Einrückung. Weiteres kommt nach Bedarf wahrscheinlich noch hinzu. Ausrichtung ist aktuell noch an die jeweilige Layoutzelle gebunden (siehe obere Tabs, die sind z.B. mittig).
bisher:
Nur ein Textstil je Layoutzelle. neu:
Formatoptionen innerhalb eines Strings
(Es gibt lediglich "Caption" für die Zelle, das ist ein einziger String ohne Positionsangaben etc., also nicht mehrere platzierbare Objekte; völlig freies Textrendering kann man aber über die allgemeine Grafikpipeline aufsetzen.) Textrendering nach wie vor: Aus einem Texturatlas mit Pixelalphabet wird je Buchstabe ein Quad erzeugt und monospaced gerendert. Fast ein Einzeiler also.
Zur Erinnerung: das Framework war aus meinen ZFX-Action-Beiträgen gewachsen und ist in erster Linie für's persönliche Quick-Prototyping. Mal schnell ein leeres Fenster aufmachen, ein geometrisches Problem visualisieren, ein paar Buttons dazustellen zum Interagieren, ein Spielprinzip testen, ... No-Timer, No-Brainer ist dabei wichtiger als Performance bzw. hohe Skalierbarkeit oder vollständige Featureliste. Soll aber trotzdem bis zum Low-Budget-Polishing ausreichen, ohne dabei viele Fremd-Abhängigkeiten und einen riesen Klotz am Bein zu haben.
Da alles immer as simple as possible: Es geht in Richtung BB-Code. Allerdings werden nicht alle Auszeichnungen einzeln definiert, sondern vordefinierte Formate. "[h1]bla\n[]blub" ist die Syntax; leere Klammer hebt alles auf.
Hinter h1 etc. steckt dann ein im aktuellen Projekt beliebig benanntes und definiertes Absatzformat. Definieren lassen sich bisher normal/fett, Größe, Farbe, Linie, Einrückung. Weiteres kommt nach Bedarf wahrscheinlich noch hinzu. Ausrichtung ist aktuell noch an die jeweilige Layoutzelle gebunden (siehe obere Tabs, die sind z.B. mittig).
bisher:
Nur ein Textstil je Layoutzelle. neu:
Formatoptionen innerhalb eines Strings
(Es gibt lediglich "Caption" für die Zelle, das ist ein einziger String ohne Positionsangaben etc., also nicht mehrere platzierbare Objekte; völlig freies Textrendering kann man aber über die allgemeine Grafikpipeline aufsetzen.) Textrendering nach wie vor: Aus einem Texturatlas mit Pixelalphabet wird je Buchstabe ein Quad erzeugt und monospaced gerendert. Fast ein Einzeiler also.
Zur Erinnerung: das Framework war aus meinen ZFX-Action-Beiträgen gewachsen und ist in erster Linie für's persönliche Quick-Prototyping. Mal schnell ein leeres Fenster aufmachen, ein geometrisches Problem visualisieren, ein paar Buttons dazustellen zum Interagieren, ein Spielprinzip testen, ... No-Timer, No-Brainer ist dabei wichtiger als Performance bzw. hohe Skalierbarkeit oder vollständige Featureliste. Soll aber trotzdem bis zum Low-Budget-Polishing ausreichen, ohne dabei viele Fremd-Abhängigkeiten und einen riesen Klotz am Bein zu haben.
Re: Showroom - Aktuelle Arbeiten und Projekte
@joeydee: ein bisschen Formatierung macht schon einen großen Unterschied. Das schaut gut aus. Darf ich fragen, ob du die GUI-Elemente (einschließlich Text natürlich) jeweils für sich in einzelnen Buffern speicherst oder alles zusammen in einem großen Buffer?
Letztes Projekt: Grave of the Pumpkin (ZFX Halloween Action 2021)
Re: Showroom - Aktuelle Arbeiten und Projekte
Das ist alles in einem Buffer und einem Call (gleicher Shader, gleicher Texturatlas für alle Rahmenstile und Fonts)
Re: Showroom - Aktuelle Arbeiten und Projekte
Schönes Ding. Kommt da was Elite-mässiges auf uns zu?!?
Re: Showroom - Aktuelle Arbeiten und Projekte
Hab ich eigentlich schon lange mal vor, wird wahrscheinlich nochmal so lange dauern ;) weil zu viel anderes in der Pipeline.
Trotzdem baue ich mir immer mal wieder einen neuen Prototypen zum Rumfliegen. Der war jetzt gerade greifbar weil textlastig, besser als nur Bla-Blub-Foo. Da steckt aber noch nicht viel Technik dahinter.
Re: Showroom - Aktuelle Arbeiten und Projekte
Isosurface: Marching Tetrahedrons. Statt Marching Cubes.
Statt riesiger Case-Liste gibts bei Tetraedern effektiv nur 3 Fälle: alle Punkte auf derselben Seite (nichts rendern), 1 Punkt auf der anderen Seite (Dreieck rendern), 2 Punkte auf der anderen Seite (Quad rendern). Jeweils gedreht und negiert: 14 Renderfälle, keine doppeldeutigen.
Dafür entstehen 6 Tetras je Cube.
Die Fälle habe ich mir per Skizze selbst hergeleitet, weil selbermachen und so. Das ist im Gegensatz zu Marching Cubes (MC) tatsächlich überschaubar.
Bei Paul Bourke musste ich nur mal nachschauen, wie denn der Space überhaupt in Tetras aufgeteilt wird. Was ich mir auch nochmal für meine Zwecke skizziert habe.
Link zu Bourke: http://paulbourke.net/geometry/polygonise/
(die oberen 80% befassen sich mit MC, ganz runterscrollen zu "Polygonising a Scalar Field Using Tetrahedrons")
Hier ein paar meiner eigenen Skizzen dazu:
Edit: Hier noch mein Testcode.
Bei mir ist vieles (z.B. SDF) eigentlich in komplexeren Klassen und -Systemen gekapselt; damit trotzdem was geht, habe ich hier alles Notwendige einfach prozedural durchgereicht und parametrisiert. Wenig optimiert, hoffentlich noch lesbar.
Wer noch weiter mit SDF-Funktionen spielen möchte: Inigo Quilez ist die Anlaufstelle dafür. https://iquilezles.org/www/articles/dis ... ctions.htm
Vector4 und TriMesh sollten selbsterklärend sein.
Statt riesiger Case-Liste gibts bei Tetraedern effektiv nur 3 Fälle: alle Punkte auf derselben Seite (nichts rendern), 1 Punkt auf der anderen Seite (Dreieck rendern), 2 Punkte auf der anderen Seite (Quad rendern). Jeweils gedreht und negiert: 14 Renderfälle, keine doppeldeutigen.
Dafür entstehen 6 Tetras je Cube.
Die Fälle habe ich mir per Skizze selbst hergeleitet, weil selbermachen und so. Das ist im Gegensatz zu Marching Cubes (MC) tatsächlich überschaubar.
Bei Paul Bourke musste ich nur mal nachschauen, wie denn der Space überhaupt in Tetras aufgeteilt wird. Was ich mir auch nochmal für meine Zwecke skizziert habe.
Link zu Bourke: http://paulbourke.net/geometry/polygonise/
(die oberen 80% befassen sich mit MC, ganz runterscrollen zu "Polygonising a Scalar Field Using Tetrahedrons")
Hier ein paar meiner eigenen Skizzen dazu:
Edit: Hier noch mein Testcode.
Bei mir ist vieles (z.B. SDF) eigentlich in komplexeren Klassen und -Systemen gekapselt; damit trotzdem was geht, habe ich hier alles Notwendige einfach prozedural durchgereicht und parametrisiert. Wenig optimiert, hoffentlich noch lesbar.
Wer noch weiter mit SDF-Funktionen spielen möchte: Inigo Quilez ist die Anlaufstelle dafür. https://iquilezles.org/www/articles/dis ... ctions.htm
Vector4 und TriMesh sollten selbsterklärend sein.
Code: Alles auswählen
class MarchingTetraDemo
{
private List<float> blobs = new List<float>();
public TriMesh mesh = new TriMesh();
public MarchingTetraDemo()
{
float smooth = 1.0f;
float iso = 0.2f;
demoBlobs();
scan(5f, 0.5f, smooth, iso);
smoothNormals(smooth, iso);
}
//generate some random blobs
private void demoBlobs()
{
Random rnd = new Random();
float spread = 2.5f;
for (int i = 0; i < 40; i++)
{
blobs.Add((float)rnd.NextDouble() * spread * 2 - spread);
blobs.Add((float)rnd.NextDouble() * spread * 2 - spread);
blobs.Add((float)rnd.NextDouble() * spread * 2 - spread);
blobs.Add((float)rnd.NextDouble() * 0.4f + 0.3f);
}
}
//overwrite face normals
private void smoothNormals(float smooth, float iso)
{
mesh.normalList.Clear();
for (int i = 0; i < mesh.pointList.Count; i++)
{
mesh.normalList.Add(-getGradient(mesh.pointList[i], smooth, iso));
}
}
//--------------------------------- marching tetrahedrons algorithm
//scan isosurface
private void scan(float scanWidth, float cellSize, float smooth, float iso)
{
for (float x = -scanWidth; x < scanWidth; x += cellSize)
{
for (float y = -scanWidth; y < scanWidth; y += cellSize)
{
for (float z = -scanWidth; z < scanWidth; z += cellSize)
{
splitCube(new Vector4(x, y, z, 1), cellSize, smooth, iso);
}
}
}
}
//split cube into 6 tetrahedrons
private void splitCube(Vector4 p, float scanSize, float smooth, float iso)
{
float r = scanSize * 0.5f;
Vector4 v0 = p + new Vector4(-r, r, -r, 1);
Vector4 v1 = p + new Vector4(r, r, -r, 1);
Vector4 v2 = p + new Vector4(r, -r, -r, 1);
Vector4 v3 = p + new Vector4(-r, -r, -r, 1);
Vector4 v4 = p + new Vector4(-r, r, r, 1);
Vector4 v5 = p + new Vector4(r, r, r, 1);
Vector4 v6 = p + new Vector4(r, -r, r, 1);
Vector4 v7 = p + new Vector4(-r, -r, r, 1);
float d0 = unionDist(v0, smooth, iso);
float d1 = unionDist(v1, smooth, iso);
float d2 = unionDist(v2, smooth, iso);
float d3 = unionDist(v3, smooth, iso);
float d4 = unionDist(v4, smooth, iso);
float d5 = unionDist(v5, smooth, iso);
float d6 = unionDist(v6, smooth, iso);
float d7 = unionDist(v7, smooth, iso);
tetra(v3, v0, v1, v7, d3, d0, d1, d7);
tetra(v1, v2, v3, v7, d1, d2, d3, d7);
tetra(v6, v2, v1, v7, d6, d2, d1, d7);
tetra(v7, v6, v5, v1, d7, d6, d5, d1);
tetra(v5, v4, v7, v1, d5, d4, d7, d1);
tetra(v7, v4, v0, v1, d7, d4, d0, d1);
}
//generate iso polygon for a tetra cell
private void tetra(Vector4 v0, Vector4 v1, Vector4 v2, Vector4 v3, float d0, float d1, float d2, float d3)
{
int mask = 0;
if (d0 < 0) mask |= 1;
if (d1 < 0) mask |= 2;
if (d2 < 0) mask |= 4;
if (d3 < 0) mask |= 8;
//major case A: 0 vs. 4 (all inside or outside) -> do nothing
if (mask == 0 || mask == 15) return;
switch (mask)
{
//major case B: 1 vs. 3 -> triangle
case 1: addTri(v0, v1, v2, v3, d0, d1, d2, d3, 1); break;
case 2: addTri(v1, v0, v3, v2, d1, d0, d3, d2, 1); break;
case 4: addTri(v2, v0, v1, v3, d2, d0, d1, d3, 1); break;
case 8: addTri(v3, v0, v2, v1, d3, d0, d2, d1, 1); break;
//tri cases inverted
case 14: addTri(v0, v3, v2, v1, d0, d3, d2, d1, -1); break;
case 13: addTri(v1, v2, v3, v0, d1, d2, d3, d0, -1); break;
case 11: addTri(v2, v3, v1, v0, d2, d3, d1, d0, -1); break;
case 7: addTri(v3, v1, v2, v0, d3, d1, d2, d0, -1); break;
//major case C: 2 vs. 2 -> quad
case 3: addQuad(v0, v1, v2, v3, d0, d1, d2, d3); break;
case 5: addQuad(v0, v2, v3, v1, d0, d2, d3, d1); break;
case 6: addQuad(v1, v2, v0, v3, d1, d2, d0, d3); break;
//quad cases inverted
case 12: addQuad(v2, v3, v0, v1, d2, d3, d0, d1); break;
case 10: addQuad(v1, v3, v2, v0, d1, d3, d2, d0); break;
case 9: addQuad(v3, v0, v2, v1, d3, d0, d2, d1); break;
}
}
private void addTri(Vector4 v0, Vector4 v1, Vector4 v2, Vector4 v3, float d0, float d1, float d2, float d3, float dir)
{
if (dir < 0) mesh.addTriangle(surface(v0, v3, d0, d3), surface(v0, v2, d0, d2), surface(v0, v1, d0, d1));
else mesh.addTriangle(surface(v3, v0, d3, d0), surface(v2, v0, d2, d0), surface(v1, v0, d1, d0));
}
private void addQuad(Vector4 v0, Vector4 v1, Vector4 v2, Vector4 v3, float d0, float d1, float d2, float d3)
{
mesh.addQuad(surface(v2, v1, d2, d1), surface(v3, v1, d3, d1), surface(v3, v0, d3, d0), surface(v2, v0, d2, d0));
}
//interpolate edge
private Vector4 surface(Vector4 v0, Vector4 v1, float d0, float d1)
{
float f = -d0 / (d1 - d0);
return v0 + (v1 - v0) * f;
}
//--------------------------------- some sdf stuff
//classic sphere
private float sphereDist(Vector4 samplePos, Vector4 center, float rad, float iso = 0)
{
return (samplePos.Xyz - center.Xyz).Length - rad - iso;
}
//smooth union of spheres
private float unionDist(Vector4 samplePos, float smooth, float iso)
{
float d = float.MaxValue;
for (int i = 0; i < blobs.Count; i += 4)//data: x,y,z,rad
{
float d2 = sphereDist(samplePos, new Vector4(blobs[i], blobs[i + 1], blobs[i + 2], 1), blobs[i + 3]);
if (smooth > 0) d = smoothUnion(d, d2, smooth);
else d = Math.Min(d, d2);
}
return d;
}
//smoothing func
private float smoothUnion(float d1, float d2, float k)
{
float h = 0.5f + 0.5f * (d2 - d1) / k;
if (h < 0) h = 0;
if (h > 1) h = 1;
return d2 * (1 - h) + d1 * h - k * h * (1.0f - h);
}
//field gradient
private static float e = 0.001f;
private static Vector4 exp = new Vector4(e, 0, 0, 0);
private static Vector4 exn = new Vector4(-e, 0, 0, 0);
private static Vector4 eyp = new Vector4(0, e, 0, 0);
private static Vector4 eyn = new Vector4(0, -e, 0, 0);
private static Vector4 ezp = new Vector4(0, 0, e, 0);
private static Vector4 ezn = new Vector4(0, 0, -e, 0);
private Vector3 getGradient(Vector4 samplePos, float smooth, float iso)
{
float x0 = unionDist(samplePos + exp, smooth, iso);
float x1 = unionDist(samplePos + exn, smooth, iso);
float y0 = unionDist(samplePos + eyp, smooth, iso);
float y1 = unionDist(samplePos + eyn, smooth, iso);
float z0 = unionDist(samplePos + ezp, smooth, iso);
float z1 = unionDist(samplePos + ezn, smooth, iso);
Vector3 dir = new Vector3(x1 - x0, y1 - y0, z1 - z0).Normalized();
return dir;
}
}
Zuletzt geändert von joeydee am 24.08.2021, 15:30, insgesamt 1-mal geändert.
-
- Establishment
- Beiträge: 135
- Registriert: 29.08.2003, 14:22
- Kontaktdaten:
Re: Showroom - Aktuelle Arbeiten und Projekte
Spannend und tatsächlich würde ich mich dann auch wegen der Übersichtlichkeit der Fälle für die Tetrahedons entscheiden.
Hast du Vergleichsbilder Endergebnis Cubes vs Tetrahedons?
Oder sind die beiden Screenshots bereits die Vergleichsbilder? Das lila Bild sieht doch wesentlich smoother aus.
Hast du Vergleichsbilder Endergebnis Cubes vs Tetrahedons?
Oder sind die beiden Screenshots bereits die Vergleichsbilder? Das lila Bild sieht doch wesentlich smoother aus.
>>> http://www.bug-soft.net <<<
Re: Showroom - Aktuelle Arbeiten und Projekte
Joeydee:
Hammer was Du hier immer von dir gibst.
Und danke für den Link. Auch wenn ich dieses MC nie richtig verstanden habe^^
Aber wollte nur mal erwähnen, dass ich deinen Output hier schon beeindruckend finde.
Naja...Anyway:
Wollte es mal erwähnt haben :D
Hammer was Du hier immer von dir gibst.
Und danke für den Link. Auch wenn ich dieses MC nie richtig verstanden habe^^
Aber wollte nur mal erwähnen, dass ich deinen Output hier schon beeindruckend finde.
Naja...Anyway:
Wollte es mal erwähnt haben :D
Zuletzt geändert von joggel am 24.08.2021, 21:53, insgesamt 1-mal geändert.
Re: Showroom - Aktuelle Arbeiten und Projekte
"Hast du Vergleichsbilder Endergebnis Cubes vs Tetrahedons?"
Nein, da ich MC nicht implementiert habe. Optisch gibts da wahrscheinlich kaum generelle Unterschiede, ist beides diskretes Sampling mit all seinen Facetten, und hier wie da kann es sehr schmale/kleine Dreiecke geben. Ob das bei MT wahrscheinlicher dazu kommt als bei MC, habe ich nicht untersucht, könnte aber theoretisch sein.
Das Smooth-Bild ist einfach nur mit Normalen gerendert, die sich aus dem Dichtefeld-Gradienten ergeben. (Nicht dasselbe Set, da es per Zufall erzeugt wird)
"Auch wenn ich dieses MC nie richtig verstanden habe"
Im Prinzip ist es relativ simpel. Grob gesagt, man teilt den Raum nahtlos in Zellen (z.B. Tetras in meinem Fall) und untersucht für jede Zellenecke gegenüber einer 3D-Dichtefunktion (z.B. die Kugel-Abstandsfunktion als simpelstes Beispiel), ob die Eckposition einen Wert >=0 (liegt außerhalb) oder <0 (liegt innerhalb) zurückliefert. Dann wird in die Zelle ein Polygon gezeichnet, welches die "inneren" von den "äußeren" Ecken trennt (in meiner Skizze untere Zeile: schwarze von weißen Punkten trennen).
Die Polygon-Ecken liegen dabei immer auf einer Kante, die von einem schwarzen zu einem weißen Punkt führt. Die genaue Position auf dieser Kante kann man durch die Messwerte der beteiligten Punkte interpolieren.
"Marschiert" man nun alle Zellen innerhalb einer Raumeinheit durch, ergibt sich aus diesen Polygonen die zusammenhängende Iso-Surface der Dichtefunktion.
Nein, da ich MC nicht implementiert habe. Optisch gibts da wahrscheinlich kaum generelle Unterschiede, ist beides diskretes Sampling mit all seinen Facetten, und hier wie da kann es sehr schmale/kleine Dreiecke geben. Ob das bei MT wahrscheinlicher dazu kommt als bei MC, habe ich nicht untersucht, könnte aber theoretisch sein.
Das Smooth-Bild ist einfach nur mit Normalen gerendert, die sich aus dem Dichtefeld-Gradienten ergeben. (Nicht dasselbe Set, da es per Zufall erzeugt wird)
"Auch wenn ich dieses MC nie richtig verstanden habe"
Im Prinzip ist es relativ simpel. Grob gesagt, man teilt den Raum nahtlos in Zellen (z.B. Tetras in meinem Fall) und untersucht für jede Zellenecke gegenüber einer 3D-Dichtefunktion (z.B. die Kugel-Abstandsfunktion als simpelstes Beispiel), ob die Eckposition einen Wert >=0 (liegt außerhalb) oder <0 (liegt innerhalb) zurückliefert. Dann wird in die Zelle ein Polygon gezeichnet, welches die "inneren" von den "äußeren" Ecken trennt (in meiner Skizze untere Zeile: schwarze von weißen Punkten trennen).
Die Polygon-Ecken liegen dabei immer auf einer Kante, die von einem schwarzen zu einem weißen Punkt führt. Die genaue Position auf dieser Kante kann man durch die Messwerte der beteiligten Punkte interpolieren.
"Marschiert" man nun alle Zellen innerhalb einer Raumeinheit durch, ergibt sich aus diesen Polygonen die zusammenhängende Iso-Surface der Dichtefunktion.
Re: Showroom - Aktuelle Arbeiten und Projekte
Habe noch meinen Testcode im Originalpost angehängt. Der Algorithmus selbst ist nur ca. 100 Zeilen lang. Der Rest des Codes baut die Demo-Blobs und stellt die Dichtefunktion.
Re: Showroom - Aktuelle Arbeiten und Projekte
Jetzt war ich doch angefixt und habe an der Spacesim etwas weitergebastelt.
So:
... konnte das ja nicht bleiben ;)
UI geskinnt, etwas mit generischen bunten Nebeln und entsprechender Szenenbeleuchtung experimentiert, hier und da ein paar (ebenfalls generische) Klötzchenburgen in den Raum geworfen sowie eine Referenzkugel (kein Planet).
Ich spamme euch mal mit ein paar Eindrücken von unterwes zu:
Das ist lediglich eine simple Space-Sandbox für Coding-Experimente und zum entspannten Umherfliegen. Realismus ist dabei nicht das Ziel.
Planetenoberflächen stehen vorerst nicht auf der Liste. Und insgesamt bleibt es grafisch ziemlich Oldschool. Der Look kann sich auch noch ein paarmal ändern, das generische Pseudorandom-Zeugs ist erst in den Anfängen.
Evtl. packe ich irgendwann grob das ursprüngliche Elite-Gameplay oder was Ähnliches hintendran, für ein einfaches Game.
So:
... konnte das ja nicht bleiben ;)
UI geskinnt, etwas mit generischen bunten Nebeln und entsprechender Szenenbeleuchtung experimentiert, hier und da ein paar (ebenfalls generische) Klötzchenburgen in den Raum geworfen sowie eine Referenzkugel (kein Planet).
Ich spamme euch mal mit ein paar Eindrücken von unterwes zu:
Das ist lediglich eine simple Space-Sandbox für Coding-Experimente und zum entspannten Umherfliegen. Realismus ist dabei nicht das Ziel.
Planetenoberflächen stehen vorerst nicht auf der Liste. Und insgesamt bleibt es grafisch ziemlich Oldschool. Der Look kann sich auch noch ein paarmal ändern, das generische Pseudorandom-Zeugs ist erst in den Anfängen.
Evtl. packe ich irgendwann grob das ursprüngliche Elite-Gameplay oder was Ähnliches hintendran, für ein einfaches Game.
- Schrompf
- Moderator
- Beiträge: 5047
- Registriert: 25.02.2009, 23:44
- Benutzertext: Lernt nur selten dazu
- Echter Name: Thomas
- Wohnort: Dresden
- Kontaktdaten:
Re: Showroom - Aktuelle Arbeiten und Projekte
Auch schon im IRC geschwärmt: sehr cool!
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Re: Showroom - Aktuelle Arbeiten und Projekte
Ich musste einfach mal wieder ein Bild machen. Zusammengeflucht in Bforartists ...
Re: Showroom - Aktuelle Arbeiten und Projekte
Cooles Bild!!
Aber wenn ich diese Covid-Viren sehe.... du da könnte ich gleich:
Zum Glück bin ich aber geimpft!!
p.s.:
Wieso "zusammengeflucht"?
Ist das eine neue Technik, oder weil es umständlich war das zu modellieren?
Aber wenn ich diese Covid-Viren sehe.... du da könnte ich gleich:
Zum Glück bin ich aber geimpft!!
p.s.:
Wieso "zusammengeflucht"?
Ist das eine neue Technik, oder weil es umständlich war das zu modellieren?
Re: Showroom - Aktuelle Arbeiten und Projekte
Danke :)
Das ist meine spezielle Inhouse Technik :D
Das Projekt hat einfach kein Ende genommen. Immer wieder erstaunlich wie viel Arbeit in so einem Bild steckt. Das waren jetzt vier Wochen Arbeit. Gut, teil der Arbeit war auch den Bforartists Tracker zu befüllen, was auch geglückt ist. Ich habe so einige Sachen gefunden. Aber eigentlich wollte ich ein cooles Raumschiff vor einem noch cooleren Sternennebel bauen. Damit ging das Drama los. Ihr seht ja was draus geworden ist ^^
Das ist meine spezielle Inhouse Technik :D
Das Projekt hat einfach kein Ende genommen. Immer wieder erstaunlich wie viel Arbeit in so einem Bild steckt. Das waren jetzt vier Wochen Arbeit. Gut, teil der Arbeit war auch den Bforartists Tracker zu befüllen, was auch geglückt ist. Ich habe so einige Sachen gefunden. Aber eigentlich wollte ich ein cooles Raumschiff vor einem noch cooleren Sternennebel bauen. Damit ging das Drama los. Ihr seht ja was draus geworden ist ^^
Zuletzt geändert von Tiles am 04.09.2021, 11:20, insgesamt 1-mal geändert.
Re: Showroom - Aktuelle Arbeiten und Projekte
Also ich finde es gut!
Ist halt nichts realistisches, eher etwas comichaftes. Ich weiß nicht wie man diesen Stil nennt...
Ist halt nichts realistisches, eher etwas comichaftes. Ich weiß nicht wie man diesen Stil nennt...
Re: Showroom - Aktuelle Arbeiten und Projekte
Ja, Illustratorisch halt. Knallige Farben. Realismus war gar nicht mein Ziel :)
Re: Showroom - Aktuelle Arbeiten und Projekte
Erinnert mich vom Stil her ein wenig an Gubble 2. Damals, als Spiele noch 2D waren, aber Leute anfingen, ihre Sprites aus gerenderten 3D Modellen zu machen.
Gubble 2 war übrigens ein großartiges Spiel und falls ich es jemals schaffe, Spiele in Rust zu programmieren, wäre das vermutlich mein erstes Projekt. Es ist ein isometrisches Puzzle / Geschicklichkeitsspiel und man hat einfach einen Haufen Spielelemente, die man zu interessanten Leveln kombinieren kann. Außerdem ist alles bunt und knuffig :)
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
https://jonathank.de/games/