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

botlin

Treue Seele

  • »botlin« ist der Autor dieses Themas

Beiträge: 139

Wohnort: Berlin

Beruf: Fachinformatiker für Anwendungsentwicklung, Student Internationale Medieninformatik

  • Private Nachricht senden

1

31.08.2011, 15:40

Indoor Culling

Hallo Leute,

ich bräuchte mal wieder euren Rat.
Im Anhang findet ihr ein Bild was die Situation verdeutlichen soll.

Auf dem Bild seht ihr Räume oder Sektoren einer Indoor Szene.
Die Sektoren habe ich alle mit einem Buchstaben versehen.
Die einzelnen Sektoren sind mit Portalen untereinander verbunden. Das sind die roten Striche.
Der Spieler ist der grüne Punkt. Die grünen Linien stellen das sichtfeld dar.
Die Grau ausgemallten Sektoren werden mit Frustum Culling weggeschnitten.
Die Schrafierten Sektoren sollten von der aktuellen Position aus nicht sichtbar sein und weggeschnitten werden.


Zum Problem:

Ich habe eine Indoorstruktur die aus den Sektoren und den Portlen besteht.
Ich prüfe ob ein Portal sichtbar ist. Ist es Sichtbar Rendere ich den an dem Portal hengenden Raum und prüfe dessen Portale auf sichtbarkeit. Sind diese Ebenfalls sichtbar rendere ich auch deren Räume usw.

Momentan bin ich soweit das ich ein Frustum Culling eingebaut habe. Dieses würde in der Angegebenen Situation die Grau ausgemalten Räume K,L,M und N wegschneiden.

Das Problem sind die Portale die zwar in meinem Frustum liegen aber durch andere Räume verdeckt wären. Zb: die Portale von Raum E.
Diese wären ja eigentlich von Raum B und C verdeckt.

Da ich aber nur ein Frustum Culling durchführe und wie in diesem ungünstigen Fall fast alle Portale in meinem Sichtfeld liegen würden, würde fast die gesamte Scene gezeichnet werden.

Ich suche einen Weg um festzustellen ob Portale von anderen Sachen verdeckt werden oder nicht.

Möglchkeiten dir mir jetz einfallen würden wären:

Occlusion Querry mit Hilfe von OpenGL- soll wohl nicht so gut sein weil man beim Test auf die Graphikkarte warten muss.

Händisch die Scene begehen und in eine Tabelle für jeden Sektor alle möglichen angrenzenden sichtbaren Sektoren eintragen - könnte eventuell etwas aufwendig und ungenau werden.

Das sind meine ersten Ideen.
Ich wollte mir mal nen Rat einholen bevor ich mich an die umsetzung mache.

Habt ihr vorschläge oder kennt ihr möglichkeiten das Problem anzugehen?
»botlin« hat folgendes Bild angehängt:
  • culling.jpg

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

2

31.08.2011, 16:16

Ehrlich gesagt versteh ich nicht so ganz wo das Problem liegt:

Zitat

Ich prüfe ob ein Portal sichtbar ist. Ist es Sichtbar Rendere ich den an dem Portal hengenden Raum und prüfe dessen Portale auf sichtbarkeit. Sind diese Ebenfalls sichtbar rendere ich auch deren Räume usw.


Ist das nicht schon die Lösung? Frustum Culling nimmt schonmal die Räume raus die sowieso nicht im Sichtbereich liegen. Durch deinen Test würde Raum B, C und evt. D gerendert werden (sofern der Winkel aus Raum A zu Raum D passt. Alles andere Renderst du einfach nicht.
Also erst Frustum Culling und danach noch testen ob ein Portal das zu einem Raum gehört im Frustum liegt oder nicht. Wenn ja auch für den Raum der dardurch gerendert wird testen usw.

3

31.08.2011, 16:25

Nein das ist eben nicht schon die Loesung da er will das dieser Raum dessen Portale zwar im Frustum liegen aber nicht sichtbar sind nicht gerendert werden.

Du koenntest "Blockerpolygone" einfuehren - sprich das z.B. nur Waende als Blocker fuer Portale fungieren. Hierdurch musst du dann zwar noch einmal ueberpruefen ob auf dem Weg zum Portal die Wand ist und mit den Blockern kollidiert aber das sollte nicht all zu ineffizient sein.

botlin

Treue Seele

  • »botlin« ist der Autor dieses Themas

Beiträge: 139

Wohnort: Berlin

Beruf: Fachinformatiker für Anwendungsentwicklung, Student Internationale Medieninformatik

  • Private Nachricht senden

4

31.08.2011, 16:53

War gerade duschen und hatte ne Idee die aber etwas aufwendiger wird. Sie setzt auf die Idee des händischen Prüfens auf.

Ich schreibe ein tool was mir die Szene Rendert.
Dann Prüfe ich für jeden Sektor welche anderen Sektoren sichtbar sind.

Ich würde also einen Raum rastermäßig mit punkten Füllen.
Der Ratserabstand würde sich scallieren lassen. Dann würde ich von jedem Punkt aus die Kamera in alle Richtungen rotieren lassen und die einzelnen Bilder auswerten.

Die Portale würde ich dann mit einem Farbcode zeichnen.
Ist ein Bild gemacht werden die Pixel nach Farbcodes durchsucht.
Wurde ein Portal gefunden wird es in die Liste der Sichtbaren Portale für diesen Sektor eingetragen.
hat die Kamera alle richtungen einmal Fotografiert und sind die Bilder Ausgewertet springt die Kamera an den Nächsten Punkt im Raum und macht das selbe von diesem.

Und das geschieht dann für jeden raum.
Die Positionsabstände würden sich Skallieren lassen und die Rotationsstuffen auch.
Ist ein Raum fertig beginnt das selbe Spiel beim nächsten Raum.

Am Ende erzeugt das Tool ein fertiges "Indoorfile" mit der Fertigen struktur und den dazugehörigen sichtbarkeitstabellen.

Rechenbeispiel:

Bei einem Raum von 10*10*2,5 Metern und einer Positionsabstuffung von 0,25 m wären das 16000 positionen
und jede Position hätte bei einer 1° rotationsabstuffung 720 Bilder. Das
wären für diesen Raum 11,5 millionen Bilder die Ausgewertet werden müssen.
Rechnen wir mal mit 20 Bildern pro Sekunde würde das gerade mal 160 Stunden für diesen einen Raum dauern :wacko:

Okay vieleicht kann man ja noch optimieren... das sollte aber fast alles erschlagen. Ich denke nur das man dann manuell doch schneller wäre.

5

31.08.2011, 18:01

Ich hätte da noch so ne andere idee...
du nimmst erstmal die räume die an den aktuellen angrenzen, und machst da frustum culling basierend auf dem sichtfeld. Für die Portale, die dann nicht wegfallen, nimmst du die jeweilige silhuette und die kameraposition für ein neues Frustum, und cullst mit dem dann die vom entsprechenden raum weiterführenden portale. Das ganze lässt sich in sofern verfeinern, das du das aktuelle frustum nicht nur aus dem letzten portal, sondern allen auf dem aktuellen pfad durchschrittenen portalen bildest. Ist natürlich die frage, wo man dann an die leistungsgrenze für ne Echtzeitanwendung stößt, aber zumindest die einfache variante sollte praktikabel sein.

botlin

Treue Seele

  • »botlin« ist der Autor dieses Themas

Beiträge: 139

Wohnort: Berlin

Beruf: Fachinformatiker für Anwendungsentwicklung, Student Internationale Medieninformatik

  • Private Nachricht senden

6

31.08.2011, 18:37

Das ist eigentlich gar keine so schlechte Idee...
Zumindest hört sich das schon mal sehr gut an.

Hab das gerade mal grob durchdacht und in gimp mal versucht nachzuvollziehen und es sollte gehen.
Ich versuch das mal umzusetzen und melde mich dann wieder wenn ich Ergebnisse hab.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

31.08.2011, 21:30

Ja, genau so macht man das normalerweise: Man verkleinert einfach das Frustrum, sodass es dem Umriss des Portals entspricht. Ich würde, der Einfachheit halber, das Frustrum wohl einfach auf das projizierte Bounding-Rectangle des Portals reduzieren.

botlin

Treue Seele

  • »botlin« ist der Autor dieses Themas

Beiträge: 139

Wohnort: Berlin

Beruf: Fachinformatiker für Anwendungsentwicklung, Student Internationale Medieninformatik

  • Private Nachricht senden

8

01.09.2011, 07:24

Ich glaube da gabs auch so ein Verfahren für Außenlandschaften. Da wurden glaube ich solche Cullingflächen in den Bergen platziert um alles hinter den Bergen wegzuschneiden.

Werbeanzeige