Frustum eines Polygons



  • Hi!
    Wie kann ich den Frustum meiner Camera so verkleinern dass er genau an ein kovenxes Polygon angepasst ist (->Portal Engine)
    Ich brauch dazu ja mehere Ebenen und nicht nur 6 wie bei dem Frustum der Kamera, weil ein Polygon ja nicht unbeding 4-eckig sein muss.

    Ich habe absolute keine Ahnung wie ich das am besten machen kann.
    Ich berechne das Frustum der Kamera ja so indem ich die Proj. mit der Modelview Matrix multipliziere und dann de 6 ebenen des Frustums "extrahiere" ... aber bei einem Polygon kann ich das ja nicht so machen.
    Kennt wer gute Tutorials dazu oder kann mir hier jemand das ganze mal genauer erklären??

    danke im vorraus



  • An dem Problem sitz ich auch grad. Ich habe aber das Frustum immer auf 5 Ebenen beschränkt, halte ich irgendwie für die bessere Lösung. So komplizierte Frusti ( 😃 ) brauchen nämlich länger bei den restlichen Berechnungen.

    So hab ichs bis jetzt gemacht:
    Erst testen, ob das Portal überhaupt im Frustum ist. Wenn nicht, gleich abbrechen.
    Dann werden die Frustum-Ebenen, die nicht durch das Portal durchlaufen, an eine der Seiten (max. 4 bei mir) des Portals angelegt.

    Ich kann Dir noch keinen Code geben, es funz nämlich noch nicht so richtig weil es viele Ausnahmefälle gibt, zb. Wenn man fast im Portal drin steht.

    Tutorials hab ich dazu auch kein einziges gescheites Gefunden, musste also mal wieder mein Hirn auspacken 😮


  • Mod

    @gast

    du mußt das frustum nicht verkleinern, sondern ein neues generieren.

    ein frustrum besteht ja aus ebenengleichungen die einen raum in sich einschliessen.

    eine ebene entsteht aus einer normalen und d (verschiebung).

    normale bekommst du, indem du das kreuzprodukt von zwei vectoren rechnest.

    ein vector besteht von der cameraposition zur ecke (P1) von dem portal.
    ein vector ist die kante vom portale für die du die ebene berechnen möchtest.

    d erhälst du, indem du die "0 - (normale (dot) ecke(P1))" rechnest.

    wie 0x1 schon schrieb, cullst du erst die geometri vom portal gegen das aktuelle frustum, falls es zu sehen ist, generierst du ein zweites frustum und testest die objekte gegen beide (wobei ein objekt raus ist, sobald es durch eines nicht zu sehen ist, also könntest du mit dem fustrum des portals anfangen zu cullen, da dort die wahrscheinlichkeit größer ist, da etwas raus zu werfen.

    zur optimierung kannst du prüfen ob das portal teilweise oder vollkommen zu sehen ist, denn falls du es ganz sehen kannst, kannst du auf das cullen mit dem frustum eine ebene drüber verzichten.

    rapso->greets();

    ps. keine garantie dass ich mich da nicht irgendwie vertan habe...



  • Also nach dieser Beschreibung sind IMHO die Vorgehensweisen:
    - Alle Objekte testen, ob sie in zwei Mengen liegen
    - Alle Objekte testen, ob sie in der Schnittmege zweier Mengen liegen
    äquivialent.

    Was schneller ist hängt natürlich entscheident davon ab, wie schnell man gegen die Mengen und die Schnittmenge testen kann, ausserdem wie schnell man die Schnittmenge bilden kann. Da es sich hier bei den Mengen wohl um 3D- Räume, die durch Ebenen begrenzt sind, handelt, so kann die Schnittmenge nicht durch mehr Ebenen als die beide Menge zusammenbegrenzt sein. Daher würde ich sagen, das der Weg, zuerst die Schnittmenge zu bilden, zumindest eine geringere Komplexität hat.

    Um den Sichtkegel durch ein Portal zu bilden, würde ich zunächst mal die konvexe Hülle des Portals bilden (oder immer gleich nur diese abspeichern) und hernach wie bei rapso weiter.

    P.S. Liegt das Neue Frustum eigentlich im Alten drin bzw. unter welcher Bedingung tut es das?


  • Mod

    das neue liegt im alten, wenn das portal darin lag, wobei wenn man das optimiert, könnte es sein, dass die nearclippingplane anders ist.

    was man noch machen könnte, wäre anstatt ebenen zu generieren, einen kegel zum clippen zu generieren, das macht man normalerweise nicht, weil es zuviel gibt, was nocht als sichtbar erkannt wird, und nicht sichtbar ist, aber bei portalen könnte es sein, dass wenn sie selbst schon recht rund wirken und auch noch klein sind, der verschnitt nicht performancerelevant ist. dafür könnte man dann aber mit der schnellen generierung und dem sehr einfachen test sehr performant bouding spheres durch _viele_ portale testen.
    (z.B. wenn man vor einem hast steht und jedes fentser soll ein portal sein könnte ich mir die methode als schneller vorstellen)

    zu dem schnittmengen ding. also da ein portal meißt zu einem "sub"-frustum gehört, muss man nicht gegen beide clippen, oft kann es reichen gegen ein frustum zu clippen um zu wissen dass das element in beiden liegt. das hielt ich für einen vorteil gegenüber der methode viele ebenen zu haben gegen die man testen muss.
    wobei es ja noch passieren kann, dass die farclippingplanes nicht übereinstimmen, somit würde es vielleicht falsche ergäbnisse geben.

    rapso->greets();



  • Man hat ja nicht unbedingt viele Ebenen, und es kann auch nur eine far und near clipping plane in der Schnittmenge geben, da die andere nicht zur Schnittmenge gehört. Falls es reicht, gegen eine der Menge zu testen, so muss diese komplett in der Anderen enthalten sein. Daraus folgt, das die Schnittmenge, auch nur diese eine Menge sein kann, woraus wiederum folgt, das man auch hier keine Vorteile hat, beide Mengen statt der Schnittmenge zu betrachten.



  • @0x00000001
    könntest du mir den code bitte mal schicken??
    meine mail adresse: aon.912674719@aon.at

    danke!



  • @gast: hab ich gemacht.

    @die anderen beiden:
    Hab ich das jetzt richtig verstanden? Wenn man also ein optimales Frustum durch ein Portal durch haben will, muss man 2 Frusti benutzen? Also einmal das Ursprüngliche und dann noch eines das genau durch das Portal durchpasst.
    Die Idee ist einfach und gut.

    Ich habe jetzt seit Tagen versucht, aus diesen beiden Frusti ein einziges zu generieren, ohne Erfolg bis jetzt. Ich finde einfach keine richtige Methode, die immer funktioniert, und ich habe bestimmt schon 4 verschiedene Lösungswege getestet. Vielleicht fehlt es mir an mathematischen Kentnissen, bin nur Mathe-GK'ler.
    Habt ihr eine Ahnung, wie man sowas macht? Möglichst schnell und so, dass das Frustum immer nur 4 Seiten hat?

    Wenn das zu kompliziert ist nehm ich die Lösungen mit den 2 Frusti, das dürfte ich wenigstens noch hinkriegen 🙄



  • Original erstellt von 0x00000001:
    **
    @die anderen beiden:
    Hab ich das jetzt richtig verstanden? Wenn man also ein optimales Frustum durch ein Portal durch haben will, muss man 2 Frusti benutzen?
    **

    Nein, IMHO muss man die Schnittmenge beider benutzen. Und unter speziellen Voraussetzungen (haben beide Sichkegel die selbe Spitze?), ist es doch auch trivial diese Schnittmenge zu erstellen.



  • SichtKEGEL? Meinst Du nicht Sichtpyramide?

    Die Spitze ist schon immer die selbe, es ist immer die Position der Kamera.
    Und wie berechnet man die Schnittmenge jetzt?



  • Richtig erkannt, ich bezog mich auf den Kegelstumpf, der das Sichtfeld beschreiben soll. Wenn ich nun die Schnittmege beider bilden sollte, so würde ich zunächste die beiden konvexen Hüllen, aus denen ich beide aufgebaut habe, auf eine Ebene projezieren, und dort wiederrum die eine konvexe Hülle um die Schittmenge der konvexen Hüllen bauen. Jetzt müsste man noch wissen, ob sich die beiden near planes (bzw. far~) schneiden können, und diese Schnittmenge teilweise im Sichtkegel liegt.


Anmelden zum Antworten