Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Schrompf

Alter Hase

  • »Schrompf« ist der Autor dieses Themas

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

1

02.02.2016, 17:47

Normalenberechnung mit Freiheitsgraden

Kopie des Threads im ZFX unter http://zfx.info/viewtopic.php?f=5&t=3966

Moin,

ich bastle trotz baldigem Ende immernoch am Voxelprojekt. Da habe ich jetzt ein Problem mit der Beleuchtung. Ich berechne pro Voxel eine Normale anhand der 3^3 bzw. 5^3 umgebenden Voxel. Dabei kommt es immer wieder vor, dass ein Voxel absolut symmetrisch von Nachbarvoxeln umgeben ist, so dass die momentane Normalenberechnung den Nullvektor ergibt. Was ich also eigentlich suche, ist eine erweiterte Normalenberechnung, die irgendwie die Freiheitsgrade zur aktuellen Umgebungssituation ermittelt und irgendwie in die Normale mitkodiert.

Folgende Szenarien sind möglich:

a) der Voxel ist Teil einer ein-voxel-dicken Schicht. Die Normale für diesen Fall ist eigentlich durch die Ebene definiert, kann aber zwei Richtungen sein. Also quasi schlichte doppelseitige Beleuchtung.

b) der Voxel ist Teil einer ein-voxel-dicken Strecke. Die Normale ist also nur als Senkrechte auf dieser Strecke festgelegt, kann aber frei um diese Achse rotiert werden.

c) der Voxel ist freistehend. Die Normale ist völlig frei.

Von diesen drei Szenarien ist eigentlich nur a) wirklich lösenswürdig. Egal, wie dick man die Wände eines Hauses macht, schon in wenigen hundert Metern Distanz sind die Wände durch's LOD nur noch einen Voxel dick. b) kommt auch gelegentlich vor, ist aber selten genug, um auf Nice-To-Have herabgestuft zu werden. c) Ist nahezu ausgeschlossen nach meinem bisherigen Kenntnisstand.

Mein Gedanke war jetzt, dass ich zusätzlich zur Normale noch irgendwie kodiere, welche Freiheitsgrade diese Normale hat, und dann bei der Beleuchtung die Normale relativ zum Betrachter innerhalb dieser Freiheitsgrade anzupassen. Bei Fall a) der doppelseitigen Beleuchtung wäre das die schlichte Auswahl der Richtung, die zum Betrachter hinzeigt. Bei Fall b) wird's schon spannender - entweder ich beleuchte dann den Voxel beim Rendern pro Fragment, oder ich bestimme mir eine Normale, die innerhalb der zulässigen Ebene zum Betrachter hin rotiert ist.

Meine Fragen sind also:

1) welche mathematischen Tricks und Ideen gibt es, die Normalen und Freiheitsgrade zu berechnen?

und 2) wie kodiere ich die dann? Ich werde wahrscheinlich nicht mehr mit nur 3 Komponenten pro Voxel auskommen, aber das ist eh unvermeidlich.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

02.02.2016, 20:06

Das grundlegende Problem hier ist, dass du Information über eine Oberfläche suchst, dabei aber mit Daten arbeitest, für die rein prinzipiell nichtmal sowas wie das Konzept einer Oberfläche existiert. Du kannst, unter der Annahme, dass deine Voxeldaten durch Samplen eines entsprechenden Objektes entstanden sind, versuchen, eine mögliche Oberfläche zu rekonstruieren, was du ja auch tust. Eine solche Rekonstruktion ist aber selbstverständlich bestenfalls den üblichen, samplingtheoretischen Einschränkungen unterworfen.

Dein momentaner Ansatz basiert auf der Annahme, dass in der Nachbarschaft eines Voxel maximal eine Oberfläche liegt. Sobald diese Annahme, beispielsweise durch zu niedrige Samplingrate, verletzt wird, funktioniert natürlich nichts mehr. Ich bin leider kein Experte auf dem Gebiet, aber ich denk, dass das hier dich zumindest interessieren wird... ;)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (02.02.2016, 20:13)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

3

02.02.2016, 20:21

Spontan fällt mir ein einen Spline über die Oberfläche zu werfen und auf denen lässt sich prima eine Normale konstruieren.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Schrompf

Alter Hase

  • »Schrompf« ist der Autor dieses Themas

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

4

03.02.2016, 12:14

Danke für den Input. Ob das nun "eine" Oberfläche ist, ist relativ egal, fürchte ich. Für eine Voxelstrecke wäre es auch nur "eine" Oberfläche, aber die halt ein Zylinder.

Ich habe anscheinend die Wahl, auch für nicht-so-eindeutige Voxelszenarien eine Normale zu berechnen und die für die Beleuchtung zu nutzen, oder das Beleuchtungsintegral vom Urschleim her für Voxelszenarien zu lösen. Meine aktuelle Idee besteht darauf, die Voxel der Nachbarschaft als Punktwolke zu nehmen und eine Hauptachsen-Transformation zu probieren. Die müsste zumindest dominante Achsen finden und auch Ebenen und Strecken abseits der Hauptachse halbwegs zuverlässig erkennen.

Leider wird sie für solche aliasing-geplagten Minisituationen mit ein paar dutzend umgebenden Voxeln auch gern mal falsch liegen. Das ist der Punkt, der mir aktuell Sorgen macht. Ob ich das auch in ein paar Millisekunden live bei der Meshgenerierung hinbekomme, ist die andere Frage.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

Werbeanzeige

Ähnliche Themen