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

1

27.09.2011, 14:23

Nicht sichtbare Kanten ermitteln

Hi,

ich habe ein 3D-Objekt, welches sich ausschließlich aus Dreiecken zusammensetzt. Aktuell zeige ich es als ganz primitives Wireframe an.

Das soll auch so bleiben. allerdings möchte ich die Rückseite (d.h. all diejenigen Linien, deren zugehörige Kanten gerade nicht zu sehen sind) optional ausblenden.

Die Orientierung der Dreiecke meines Objektes sagt dabei nichts darüber aus, ob die entsprechende Fläche von irgend einer Seite sichtbar wäre oder nicht. Auch gibt es keine zweidimensionalen Flächen, es gibt zu jeder Fläche "vorne" auch eine zweite Fläche "hinten" (plus natürlich die Seitenflächen drumherum, die dieses Objekt abschließen). Ich muss mir also keine Gedanken darum machen, ob ein Dreieck vielleicht vorne und hinten gleichzeitig ist, sowas kommt nicht vor.

Auch ist es im ersten Schritt egal, ob eine Fläche, die nach vorne zeigt, auf Grund der Form des 3D-Objektes von einer weiteren Fläche, die ebenfalls nach vorne zeigt verdeckt wird.

Was das ganze spannend macht: es kommt kein OpenGL oder ähnliches zum Einsatz, ich muss also alles komplett selbst berechnen.

Tja, wie stellt man sowas nun am cleversten an?

xardias

Community-Fossil

Beiträge: 2 731

Wohnort: Santa Clara, CA

Beruf: Software Engineer

  • Private Nachricht senden

2

27.09.2011, 14:33

Da kannst du dir am besten auch anschauen wie es auf der GPU gemacht wird, Stichwort: Culling Mode.

Im Prinzip legt man dabei fest, welche Dreiecke gerendert werden sollen: Dreiecke deren Vertices in Clockwise Richtung angegeben wurden oder in Counter-Clockwise Richtung (oder beide). Sobald ein Dreieck von seiner Rückseite gezeigt wird, dreht sich diese Richtung um.

Nachteil ist natürlich, dass du dann dein Modell so gestalten musst, dass du Vertices immer mit der richtigen Reihenfolge angeben musst.

Am besten schaust du dir mal an wie OpenGL/DirectX das über die GPU machen und implementierst dann etwas Ähnliches.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

3

27.09.2011, 15:02

Culling wäre hier nur eine Lösung, wenn die Objekte konvex sind.
Da er das nicht gesagt hat, gehe ich mal davon aus, dass sie nicht konvex sind.

Ich würde die Dreiecke einfach erstmal ganz normal solide rendern (mit Z-Buffer, in einen unsichtbaren Speicherbereich). Dann gehst du alle Kanten durch und verfolgst sie im Bild nach. Vergleiche entlang der Kante den Wert im Z-Buffer mit dem "Soll-Wert" für Z. Wenn der Wert im Z-Buffer an einer Stelle kleiner ist, weißt du, dass die Kante zumindest teilweise verdeckt ist. Ist er überall kleiner, ist die Kante komplett verdeckt.

4

27.09.2011, 17:44

Die Idee mit dem Culling fällt in der Tat aus, da die Dreiecke eben nicht in der Form georndet sind, sprich es kann Modelle geben, bei denen Dreiecke auf der gleichen Fläche unterschiedliche Orientierungen haben können.

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

5

27.09.2011, 18:40

glCullFace(GL_FRONT);

6

27.09.2011, 18:42

"es kommt kein OpenGL oder ähnliches zum Einsatz" "Culling fällt in der Tat aus"
...

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

7

27.09.2011, 18:48

Lest doch einfach mal die Beiträge, bevor ihr antwortet!

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

28.09.2011, 00:01

Die Art der Lösung wird sich nach der Art des gewünschten Output richten. Willst du als Ergebnis eine Rastergrafik? Dann bau dir einfach selbst einen z-Buffer (oder verwend einfach OpenGL). Willst du eine Vektorgrafik? Dann wirst du eine analytische Lösung implementieren müssen. Stichwort: hidden line removal.

9

28.09.2011, 08:25

Es soll eine Vektorgrafik werden ... das PDF schaue ich mi mal an.

Werbeanzeige