Ich seh den Wald vor lauter BÄUMEN nicht

Design Patterns, Erklärungen zu Algorithmen, Optimierung, Softwarearchitektur
Forumsregeln
Wenn das Problem mit einer Programmiersprache direkt zusammenhängt, bitte HIER posten.
Antworten
hundvdf
Beiträge: 28
Registriert: 03.10.2002, 13:48
Kontaktdaten:

Ich seh den Wald vor lauter BÄUMEN nicht

Beitrag von hundvdf »

Hallo,
ich muss zur Zeit für die Uni als Projekt einen kleinen Raytracer schreiben. Um den zu beschleunigen will ich jetzt die Geometrie in Bäume aufteilen, damit ich nicht BruteForce jeden Strahl mit jedem Objekt/Dreieck testen muss.
Nun habe ich allerdings das Problem, dass ich die Vorlesung "Algorithmen und Datenstrukturen" leider erst im kommenden Wintersemester hören werde, und bräuchte aber eine kurze Auffrischung im Thema Bäume.

Wenn ich das richtig überlege, wäre es sinnvoll, den Raum so aufzuteilen, dass möglichst immer die Hälfte der Objekte im einen Teil, die andere Hälfte im anderen Teil sind.
  • Ein Octree teilt ja immer den Raum in 8 gleich große Würfel auf und ist daher meiner Meinung nach nicht optimal.
  • Ein k-d-Baum ist in der Hinsicht schon besser, da werden die Hyperebenen ja immer so gewählt, dass diese Bedingung möglichst gut erfüllt ist.
  • Allerdings gibts da ja auch noch die BSP-Bäume, die - sofern ich das richtig verstanden habe - gleich sind wie die k-d-Bäume mit dem Unterschied, dass hierbei die Hyperebenen nicht mehr an den Achsen ausgerichtet sind, sondern frei im Raum liegen können.
Ist das soweit denn richtig?

Wenn ja, dann würde ich sagen, dass ein BSP-Baum am schwierigsten zu berechnen ist und zudem auch noch die Kollision mit einem Ausschnitt schwerer zu berechnen ist, da es eben kein schöner Würfel mehr ist. Allerdings würde ein BSP-Baum die Geometrie am optimalsten aufteilen (Wie auch immer man das dann berechnen kann, da hab ich mir noch keine Gedanken dazu gemacht)
Ein k-d-Baum teilt die Geometrie auch noch recht sinnvoll auf und ist auch recht einfach zu berechnen (Mittelpunkt aller Objekte berechnen und dann aufteilen) und außerdem ist die Kollision von Strahl mit einer Achsenorientierten Box ja auch kein Hexenwerk.

Von dem Gesichtspunkt her würde ich mich spontan für einen k-d-Baum entscheiden, lasse mich allerdings auch eines Besseren belehren (falls ich mir z.B. die Kollision eines Strahls mit einem nicht-würfelförmigen Ausschnitts schwerer vorstelle als es wirklich ist :) )

Daher würde ich euch bitten, mir mal eure Meinung oder Erfahrungen dazu zu sagen (bzw. zu schreiben), was auch im Hinblick auf die Schnelligkeit des Raytracers sinnvoller ist (eine bessere Aufteilung nutzt evtl. nichts, wenn die Kollisionsberechnung dann langsamer ist)

Grüße und Danke
hundvdf
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: Ich seh den Wald vor lauter BÄUMEN nicht

Beitrag von dot »

Nunja, ein Octree hat halt gegenüber dem kd-Tree evtl. den Vorteil dass er nicht so tief wird, was weniger Traversal-Overhead bedeutet. Allerdings sind was Raytracing angeht kd-Trees die bevorzugte Beschleunigungsstruktur. Das Internet sollte eigentlich voll von Papers über das Thema sein. Für den Anfang schau vielleicht einfach mal hier:
http://www.devmaster.net/articles/raytr ... /part4.php
http://www.devmaster.net/articles/raytr ... /part7.php

Beachte dass so ein Baum erstmal ideal für statische Geometrie ist, aber sobald sich was in der Szene bewegt wirds sehr unangenehm...
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: Ich seh den Wald vor lauter BÄUMEN nicht

Beitrag von kimmi »

Da gibt es ein ziemlich gutes Buch: "Physical based rendering". Und die haben auch eine Website: http://www.physicallybasedrendering.com/ .
Besonders der sehr auf cache-optimierte KD-Tree ist für dich sicherlich nicht ganz uninteressant :).

Gruß Kimmi
hundvdf
Beiträge: 28
Registriert: 03.10.2002, 13:48
Kontaktdaten:

Re: Ich seh den Wald vor lauter BÄUMEN nicht

Beitrag von hundvdf »

dot hat geschrieben:Nunja, ein Octree hat halt gegenüber dem kd-Tree evtl. den Vorteil dass er nicht so tief wird, was weniger Traversal-Overhead bedeutet. Allerdings sind was Raytracing angeht kd-Trees die bevorzugte Beschleunigungsstruktur. Das Internet sollte eigentlich voll von Papers über das Thema sein. Für den Anfang schau vielleicht einfach mal hier:
http://www.devmaster.net/articles/raytr ... /part4.php
http://www.devmaster.net/articles/raytr ... /part7.php

Beachte dass so ein Baum erstmal ideal für statische Geometrie ist, aber sobald sich was in der Szene bewegt wirds sehr unangenehm...
Das ist ein sehr guter Link, den Artikel kannte ich noch nicht. Ich war nur etwas verwirrt, weil ich teilweise gelesen habe, dass hauptsächlich BSP-Trees bei Raytracern eingesetzt werden. Da ich nur statische Objekte bestrahlen soll, werd ich mich wohl für den kd-Tree entscheiden.

Ansonsten: hab ich denn die Trees zumindest richtig verstanden?

Dsnke
hundvdf
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: Ich seh den Wald vor lauter BÄUMEN nicht

Beitrag von dot »

Wo auch immer du das gelesen hast, rein technisch gesehen ist das garnichtmal falsch denn ein kd-Tree ist eigentlich ein Spezialfall eines BSP-Tree ;)
hundvdf
Beiträge: 28
Registriert: 03.10.2002, 13:48
Kontaktdaten:

Re: Ich seh den Wald vor lauter BÄUMEN nicht

Beitrag von hundvdf »

dot hat geschrieben:Wo auch immer du das gelesen hast, rein technisch gesehen ist das garnichtmal falsch denn ein kd-Tree ist eigentlich ein Spezialfall eines BSP-Tree ;)
kd-Tree==BSP-Tree mit achs-parallelen Hyperebenen, oder?

gelesen hab ich das auf Wiki:
http://de.wikipedia.org/wiki/Binary_Space_Partitioning hat geschrieben:BSP findet vor allem Verwendung bei Game Engines von Computerspielen (insbesondere bei Ego-Shootern) für Objekte oder Teile der „Welt“, die sich während des Spiels geometrisch nicht mehr verändern. Eine weitere Anwendung findet sich beim Raytracing.
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: Ich seh den Wald vor lauter BÄUMEN nicht

Beitrag von dot »

hundvdf hat geschrieben:kd-Tree==BSP-Tree mit achs-parallelen Hyperebenen, oder?
exakt.
Antworten