Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Sa Jun 08, 2024 06:01

Foren-Übersicht » DGL » Feedback
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 61 Beiträge ]  Gehe zu Seite 1, 2, 3, 4, 5  Nächste
Autor Nachricht
 Betreff des Beitrags: Octree-Tutorial
BeitragVerfasst: Mo Apr 04, 2005 21:47 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Hi,

Als ich kürzlich, ungläubig die FPS in der Titelleiste anstarrend, mir das Beispielprogramm vom Octree-Tutorial genauer anschaute, entdeckte ich an manchen Stellen, dass an am Bildrand manchmal einige Polygongruppen abgesägt wurden.
Daraufhin inspizierte ich auch das Octree-Tutorial genauer und fand dann die Erklärung:
Zitat:
HINWEIS: Hierzu ist zu sagen, dass die Funktion "PolygonIn" nicht perfekt ist. Wenn sich mindestens ein Vektor des Polygons im Node befindet, dann wird das Polygon angenommen. Polygone, die unseren Node schneiden, aber trotzdem außerhalb liegen, werden nicht erkannt. Allerdings hatte ich damit bis jetzt keine Probleme.

Und ich dachte schon... Ach keine Ahnung ;)

Allerdings stören mich diese abgesägten Polygone, denn in einem Level wo der Boden bespielsweise nicht aus einer stark tesselierten Oberfläche, sondern z.B. nur aus einem Quad besteht, dürfte es schon ziemlich auffallen, wenn auf einmal der Boden nicht mehr da ist. Meine Frage also: Wie kann man die Funktion "PolygonIn" perfekt machen?

Es geht immernoch um das Vermeiden von dem Effekt, der auf dem Bild sichtbar ist.

Bye,
Frase

P.S.: Ein paar Bilder mehr im Tutorial könnten nicht schaden. Aber ansonsten ist es ein klasse Tutorial.


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 04, 2005 21:54 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7804
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Die könntest auch die Flächen die die Node nur schneiden als innen liegend annehmen. Dadurch zeichnest du wenige doppelt. Es entstehen aber keine Fehlstellen.
(Denk ich mal...;) )

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 04, 2005 21:55 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Zitat:
[EDIT 12.03.2005 vom Autor]
Habe was SEHR wichtiges vergessen. Anstatt alle Polygone zu überprüfen, ist es sehr(und ich meine SEHR) viel schneller, nur die Polygone, des übergeordneten Nodes zu testen. Ein Implentation sollte nicht all zu schwer sein: Einfach für jedes Node einen Pointer auf den Mother-Node setzten und die Polygone immer in die Array speichern, und dann bei der Überprüfung sich auf die polygon-array des Mother-Nodes beziehen. Sollte die Performance deutlich steigern. Ich endschuldige mich für meinen Fehler ;)
[/EDIT]

Die rote Meldung macht sich gut im Tutorial ;)
Und wieso Fehler? Das Lesen des Nachtrags löste zwar bei mir ein mentales Hand-auf-die-Stirn-Schlagen aus, aber ich wäre da von alleine wohl erst sehr viel später darauf gekommen. Und das sehr darf man ruhig so sehr betonen wie Shadow es im Nachtrag gemacht hat ;)

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 04, 2005 21:56 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Flash hat geschrieben:
Die könntest auch die Flächen die die Node nur schneiden als innen liegend annehmen. Dadurch zeichnest du wenige doppelt. Es entstehen aber keine Fehlstellen.
(Denk ich mal...;) )


Meinst du das hier?:
Zitat:
Das zweite Problem bei dieser Funktion ist, dass Polygone, die sich in mehreren Nodes befinden, auch allen zugeordnet werden und dann eventuell mehrmals gezeichnet werden. Allerdings fand ich noch nicht die Zeit diese Probleme zu beheben.
Falls jemand eine bessere Methode hat, so kann er diese Prozeduren einfach erweitern (verbessern). Ich würde mich sehr über Ratschläge freuen. Eine Möglichkeit ist es, das Polygon an den Nodes in zwei Polygone zu schneiden (Auch Splitting genannt).


Mir fällt nämlich sonst auch spontan nichts anderes ein.

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 04, 2005 21:58 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7804
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Genau das. Nur wenn das in dem Beispiel schon drinnen ist, sollte der obige Effekt net auftreten. Sieht eher danach aus, dass die Flächen in genau eine Node sortiert werden.s

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 04, 2005 22:31 
Offline
DGL Member

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
ich würde polygone, auf die das zutrifft, einfach zerteilen und die reste dann in die entsprechenden quads verteilen. solange die quads nicht allzuklein werden und riesige polygone mit im spiel sind, erhöht das die polygonzahl nicht merklich.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 05, 2005 18:39 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Hi,

ich würde im Moment mehr zu Flashs Lösung tendieren, bzw. zu der, die angeblich in der Octree-Klasse eingebaut ist, im Endeffekt aber nur auf dem Papier vorhanden ist.
Und zwar einmal deswegen, weil mir das Splitten von Polygonen nicht ganz geheuer ist, wenn der Algorithmus dafür von mir kommt ;)... Auserdem dürfte es leichter zu implementieren sein.
Das einzige, was mich noch verunsichert ist die Reaktion von OpenGL auf doppelt gezeichnete Flächen.
Normalerweise entsteht ja wunderschönes Z-Fighting an den Stellen, wo 2 Polygone an der gleichen Stelle gezeichnet werden. Darum hat ja Sascha in seinem Bomberman-Tutorial die Schatten auch ein bisschen über dem Boden gezeichnet.
...
Ich glaub, ich stand grad ein bisschen auf der Leitung. Man sieht ja vom Z-Fighting gar nichts, wenn die Polygone absolut identisch sind :D .

Was ist aber, wenn das Dreieck nicht nur in 3 Würfeln, sondern in 4 Würfeln zu sehen ist/sein soll? Wenn das Dreieck so groß ist, dass die drei Eckpunkte gar nicht in 3 Würfel reinpassen? Wenn nur ein Würfel sichtbar ist, der gar keinen Eckpunkt von dem Dreieck enthält, das Dreieck aber trotzdem teilweise durch diesen Würfel geht? Funktioniert das mehrmals Zeichnen dann auch, bzw. wird das Dreieck überhaupt ein einziges Mal gezeichnet? Die Splitting-Methode müsste ja auch diesen Fall abfangen, aber was ist mit der anderen Methode? :?

EDIT:
Zitat:
ich würde polygone, auf die das zutrifft, einfach zerteilen und die reste dann in die entsprechenden quads verteilen. solange die quads nicht allzuklein werden und riesige polygone mit im spiel sind, erhöht das die polygonzahl nicht merklich.

Wie einfach ist "einfach"? "einfach zerteilen" klingt so, als ob es das leichteste der Welt wäre. Kann ich mir aber beim besten Willen nicht vorstellen...

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 05, 2005 22:29 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7804
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Dein Einwand mit den großen Dreiecken ist durchaus berechtigt und Problematisch. Man müsste zu diesem Zweck bereits beim erstellen des Baums bei Dreiecken die in mehreren Nodes liegen checken, ob diese auch so einen Fall hervorrufen (sollte durch einfache Untersuchung der Nachbarschaftsbeziehungen der Nodes machbar sein).

Zu Nicos "einfach": Ein Tesselierungs Algoithmuss wäre jetzt ma interessant und würde auch gut ins Wiki passen: http://wiki.delphigl.com/index.php/Tesselierung 8)

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 05, 2005 22:41 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Eine andere Idee ist, die Polygone nicht zu zerteilen und auch nicht mehrfach in den geschnittenen Knoten zu speichern, sondern genau einmal in dem kleinsten Knoten abzulegen, der das Dreieck gerade noch enthält.
In dem Tutorial werden die Dreiecke glaube ich nur auf der untersten Ebene des Baumes gespeichert, aber es ist ja auch durchaus möglich die Dreiecke, die nicht in einen der unteren Knoten passen auf den jeweils höheren Ebenen zu speichern.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 05, 2005 22:48 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7804
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Stimmt. Gute Idee. Damit kanns aber auch Polys geben die Quasi immer gezeichnet werden, wenn Sie sich im Zentrum des Baums befinden und dort Grenzen überschneiden. Allerdings wird sich diese Polyanzahl wohl sehr beschränken.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 05, 2005 23:08 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Ja klar, aber wenn sie so groß sind,werden sie auch sowieso sichtbar sein. Der ungünstigste Fall ist eine große Fläche, die eine Seite des ganzen Levels bedeckt und daher in den obersten Block kommt, obwohl sie bei Unterteilung dann in jeder Menge kleinster Würfel wäre. Kann ungünstiger sein, aber die Unterteilung bringt auch jede Menge neuer Flächen.

Ob so ein regelmäßiger Occtree generell die beste Lösung ist, ist sowieso fraglich. Es wäre ja auch denkbar, dass sich die inneren Knoten überlappen können und nicht gleich groß sein müssen. Das wichtigste ist ja für das Frustum Culling nur, dass die Knoten jeweils inneinander geschachtelt sind. Die Lage ist ja ansonsten egal.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mai 06, 2005 00:42 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7804
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
So ein großes Polygon ist nichtmal das Problem, da es ja trotz der größe nur ein Poly ist. Eventuell verdeckt es sogar andere Polygone was günstig sein kann. Der WorstCase is in dem Fall eher ne Menge kleiner Polys welche die Zentralen Knotengrenzen überschreiten. Die würden dann alle gezeichnet werden, was mies ist.

Bei den unsymetrischen/regelmäßigen Nodes gibts aber auch wieder zig verschiedene Spezialfälle zu beachten, wo wied er andere Polys von NodeA nach NodeB ragen. Es ist schon ganz schön vertrackt. Deshalb ist die lösung mit der Tesselierung der Polys sicherlich die einfachste lösung, auch wenn sie kompiliert zu machen ist. Klingt seltsam is aber vermutlich so. :roll:

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mai 06, 2005 01:53 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Diese Methode scheint wohl darauf angewiesen zu sein, dass man die Unterteilung an günstigen Ebenen macht. Bei einem normalen Level könnte da einiges an Geometrie hinzukommen. Das betrifft ja dann eigentlich alle Ebenen, dass die Dreiecke mindestens eins hochgestuft werden.
Mit den unsymetrischen Knoten ist es ja eigentlich noch einfacher. Man muß diese ganze Menge nur in mehrere Gruppen zerteilen, so daß das ganze halbwegs balanciert ist. Die Größe der Boxen würden sich ja dann automatisch ergeben. Das Unterteilen in diese Gruppen kann man machen indem man die Gravitation zwischen den Dreiecken simuliert (ungetestet). Alle Flächen die dann auf einem Klumpen sitzen, waren dann vorher wohl schon dicht zusammen, so daß man sie in einen Knoten packen kann.
Wenn man das unterteilt, hat man den Vorteil, dass die paar Flächen nichts kosten, aber Lichter viel feiner abgestimmt werden und z.B. ein kleines Licht in der Mitte einer Fläche weniger Fragment Shader kostet, weil man nicht die ganze Fläche damit render muß. Andererseits ist jedes halbwegs detaillierte Level sowieso schon zwangsläufig gut unterteilt, so daß man sich bei den regelmäßigen Unterteilungen unnatürliche Schnitte in die Geometrie macht. Das finde ich recht unschön an dem Occtree.
Ich persönlich denke, dass ein BSP Baum, in dem man nur die Bounding Boxen der Objekte zur Unterteilung nutzt, also die Objekte ganz läßt, eine sehr gute Wahl ist.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mai 06, 2005 07:00 
Offline
DGL Member

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
Also von wegen einfach: Besonders kompliziert ist es in jedem Falle nicht ;-) Aus einem schon eine weile herumliegendem Code habe ich eine Datei extrahiert, die das zerschnipseln von Dreiecken übernimmt. Was sie nicht macht ist die Texturkoordinaten anpassen, da ich die Funktion damals nur für die Kollisionsbaum-Erzeugung gebraucht habe, aber das dürfte nicht so schwierig werden. Fragen kann ich natürlich beantworten, aber an einigen wesentlichen Stellen sind einige Kommentare untergebracht.
Irgendwie bekomme ich das Attatchment gerade nicht hoch - werde es als Code ablegen:
[code mit mir inzwischen unbekannter herkunnft]


Zuletzt geändert von Delphic am Mo Jul 13, 2009 20:10, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mai 07, 2005 12:33 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Hehe... Da schaut man einmal nicht in den Thread und schon fängt das zu wachsen an... ;)

Die Dreiecks-Zerschnipsel-Methode ist in etwa so umfangreich, wie ich es befürchtet hab ;)
Ich bin nicht so der Fan von Vektoren und Matrizen usw... Ich find zwar toll, was man damit alles machen kann und freu mich auch schon, wenn wir das mal in der Schule machen, aber im Moment ist mir v.a. die Welt der Matrizen noch etwas unheimlich. Und so hab ich eine konsequente Scheu vor zu großen Ansammlungen Algebra entwickelt...

Im Moment gefällt mir Lars' Idee vom Speichern der Polygone in den nächsthöheren Knoten am Besten. Besonders weil ich die Idee in etwa zeitgleich hatte ;).

Und dann hätte ich noch etwas zu sagen zu den BSPs... Ich weiß zwar nur ungefähr, wie die Dinger funktionieren, aber AFAIK kennen BSPs doch keine Fließkommawerte und nehmen Vertex-Positionen nur als Ganzzahlen entgegen, weswegen die Vertices erst quantisiert werden müssen. Im Gegenzug sind sie schneller als Octrees.
Octrees können aber die Daten von einem 3D-Programm (Maya, 3DS Max, Blender etc.) aber IMHO direkt verwerten.


Erm... Was wird eigentlich meistens bei einem Octree verwendet? (Methodenmäßig). Das höhere Einstufen von großen Polygonen? Das teselieren? Das Zerschnipseln? Oder einfach gar nichts (wie im Octree-Tutorial)?

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 61 Beiträge ]  Gehe zu Seite 1, 2, 3, 4, 5  Nächste
Foren-Übersicht » DGL » Feedback


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.011s | 14 Queries | GZIP : On ]