sowas wie ComputeNormals() auch für Punktmengen (gerendert als D3DPT_TRIANGLESTRIP)?



  • Hallo allerseits!

    Ich würde Punktmengen (gerendert als D3DPT_TRIANGLESTRIP bzw. D3DPT_TRIANGLELIST) gerne beleuchten.
    Dazu braucht man ja zu jedem Punkt eine Normale.
    Bei Meshes gibt es dazu die Funktion ComputeNormals(), gibt es für reine Punktmengen etwas ähnliches oder muss ich da die Normalen selbst berechnen?

    Danke und Gruß,
    Dong



  • Um eine Normale zu berechnen, brauchst du eine Ebene. Eine Ebene wird durch mindestens drei Punkte bestimmt, die in der Ebene Liegen. Die Normale lässt sich einfach durch das Kreuzprodukt, der Vektoren berechnen, die die Ebene aufspannen.

    Wenn die ortsverktoren a\vec a b\vec b und c\vec c sind, dann ist das relativ leicht berechnet:
    n=(ba)×(ca)\vec n = (\vec b - \vec a) \times (\vec c - \vec a)



  • Ja danke schön, das weiß ich und das meinte ich mit "selbst berechnen".

    Ich meinte eher sowas wie die Funktion ComputeNormals(), die das alles automatisch erledigt, ohne dass man es selbst explizit implementieren müßte.
    Aber soweit ich verstanden habe, geht das eben nur für Meshes, daher wollte ich eben wissen, ob es auch für nicht-meshes etwas ähnliches gibt.



  • Wie soll man denn für eine Punktwolke, über deren Punkte man keine Informationen außer ihrer Position hat, einen Normalenvektor berechnen?



  • TomasRiker schrieb:

    Wie soll man denn für eine Punktwolke, über deren Punkte man keine Informationen außer ihrer Position hat, einen Normalenvektor berechnen?

    Naja, man hat eben doch durchaus eine Information:
    Die Punktmenge ist so angeordnet, dass sie sich als D3DPT_TRIANGLESTRIP bzw. D3DPT_TRIANGLELIST rendern läßt.
    Also: 3 (bzgl. ihrer Indizes) aufeinanderfolgende Punkte bilden eine Fläche --> Daraus läßt sich theoretisch ein Normalenvektor bestimmen.

    Wobei mir sowieso komisch vorkommt, dass einem Punkt ein Normalenvektor zugeordnet wird. [Wie ich meine im Directx Tutorial 4: "Setting up Lights" verstanden zu haben.] Das ist nämlich z.b. an Ecken und Kanten unsinnig...
    ...oder habe ich da was falsch verstanden?

    Na ja, ich sehe schon, ich muss die Normalen also von Hand berechnen.
    Dann dazu eben eine weitere Frage:

    Müssen die Normalen normalisiert sein (also Länge 1 haben)?

    Danke und Gruß,
    Dong



  • dong schrieb:

    Wobei mir sowieso komisch vorkommt, dass einem Punkt ein Normalenvektor zugeordnet wird. [Wie ich meine im Directx Tutorial 4: "Setting up Lights" verstanden zu haben.] Das ist nämlich z.b. an Ecken und Kanten unsinnig...
    ...oder habe ich da was falsch verstanden?

    Der Sinn ist, dass du einem Dreieck 3 Normalenvectoren zuweist, ist der, dass quasi ein Farbverlauf für die Beleuchtung erstellt wird, so dass aus den vielen Dreiecken ein runder körper wird. Sonst könnte man die Grenzen von jedem Dreieck an einem Helligkeitssprung erkennen.

    dong schrieb:

    Müssen die Normalen normalisiert sein (also Länge 1 haben)?

    Bei OpenGL schon, probiers für DirectX doch einfach aus.



  • dong schrieb:

    Also: 3 (bzgl. ihrer Indizes) aufeinanderfolgende Punkte bilden eine Fläche --> Daraus läßt sich theoretisch ein Normalenvektor bestimmen.

    Wobei mir sowieso komisch vorkommt, dass einem Punkt ein Normalenvektor zugeordnet wird. [Wie ich meine im Directx Tutorial 4: "Setting up Lights" verstanden zu haben.] Das ist nämlich z.b. an Ecken und Kanten unsinnig...
    ...oder habe ich da was falsch verstanden?

    Ne, das ist schon richtig. Berechne einfach für jedes Dreieck die Normale. Als Normale eines Punktes nimmst Du dann einfach den Durchschnitt aller an diesem Punkt angrenzenden Dreiecke.



  • Ah ja! 🙂

    Bei größeren Flächen ist das mit 3 Normalen pro Dreieck wohl tatssächlich sinnvoll, aber in einem Fall rendere ich hauptsächlich Quaderförmige Strukturen, sprich, die Punkte liegen nie auf Flächen, sondern immer auf Ecken und Kanten.
    In diesem Fall ist ja auch der angesprochene Farbverlauf auf den Dreiecken nicht sinnvoll, die Seiten eines Quaders (welche ja aus zwei Dreiecken bestehen) sollen natürlich einheitlich beleuchtet werden.
    Was mach ich also im Fall von beleuchteten Quadern?

    Was die Normierung der Normalen betrifft:
    Ja, ich verwende DirectX. Ich habe einer Normalenkategorie jetzt mal die Länge 2 zugeordnet und es ergab sich kein offensichtlicher Fehler.

    Gruß,
    Dong



  • afaik müssen die normalen weder bei opengl noch bei direct3d normalisiert sein, man kann in einem state angeben ob die API sich um das normalisieren kümmern soll.
    im allgemeinen sollte man aber, da das in die performance geht, davon absehen diese states zu verwenden und lieber beim laden selber normalisieren.



  • Berechne halt alle Normalen selbst, dann hast du volle Kontrolle. f'`8k

    Gruß, TGGC (\-/ has leading)



  • Ergänzung:
    Bei einer weißen Fläce scheint die Normalenlänge egal zu sein. Bei farbigen Flächen sind Gebiete mit Normalenlänge < 1 dunkler als normal.



  • evtl. solltest du dir mal ansehen wofür die normalen gut sind...

    stichwort blinns lightning model 😉



  • dot schrieb:

    evtl. solltest du dir mal ansehen wofür die normalen gut sind...

    stichwort blinns lightning model 😉

    <a href= schrieb:

    Google Suche nach blinns lightning model">Ergebnisse 1 - 6 von ungefähr 8 für blinns lightning model

    Wäre es all zu viel Aufwand, den richtigen Namen mitzuteilen?
    Meine Suche nach möglichen Variationen brachte mich nämlich auch nicht viel weiter... 😉



  • Hier ist grad der Lighning eingeschlagen. Aber das List ist aus. f'`8k

    Autocogito

    Gruß, TGGC (\-/ has leading)



  • blinn heißt der typ ders erfunden hat, alternativ kannst du auch nach phong suchen. der unterschied liegt eigentlich nur in der berechnung vom specular anteil.

    also such einfach z.b. nach "blinn lightning"...



  • Worauf TGGC hinaus will:

    Lightning = Blitz/Gewitter



  • lol, omg^^
    is mir gleich so komisch vorgekommen...

    sry 😃



  • TGGC schrieb:

    Hier ist grad der Lighning eingeschlagen. Aber das List ist aus. f'`8k

    Autocogito

    😡
    Unterstelle mir bitte zutreffenderes, von mir aus Faulheit. Einem Unwissenden aber ein bisschen von seinem Wissensvorsprung profitieren zu lassen sollte insbesondere dann, wenn dieser Gnadenakt doch nur aus der Vermittlung von Zugang zu Wissen und nicht der Vermittlung von Wissen selbst besteht, doch hoffentlich nicht all zu unverschämt sein.

    Jetzt, da ich mehr Zeit hatte, konnte ich mit den Hinweisen durchaus etwas anfangen, danke @ dot. 🙂



  • Wie war das, getroffene Hunde bellen? f'`8k

    Autocogito

    Gruß, TGGC (\-/ has leading)



  • TGGC schrieb:

    Wie war das, getroffene Hunde bellen? f'`8k

    Natürlich belle ich, wenn mir unzutreffendes vorgeworfen wird. Und der Vorwurf, der einem nach Abruf des Links fast Bildschirmgroß gemacht wird (unter vollständier Unterschlagung anderer möglicher Beweggründe...), ist Dummheit:

    TGGC schrieb:

    Autocogito

    Und da TGGC scheinbar zu ... ...äh.. ein zu zu beschränktes Vorstellungsvermöge besitzt, will ich mal einen bedeutenden Grund nennen:
    Zeit-Effizienz:

    Ein bedeutendes Problem bei Unwissenden kann sein, dass sie nicht wissen, was sie nicht wissen. Wissende können hingegen schnell erkennen, worin das jeweils relevante Unwissen des Unwissenden besteht.

    Wenn man also akzeptiert, dass sich nicht jeder mit jedem Detailproblem / jeder Detailfrage stundenlang auseinandersetzt [man beachte im hiesigen Fall: Das Problem war ja längst gelöst, bei meiner Rückfrage handelte es sich lediglich um eine Empfehlung, der zu folgen ich noch nicht einmal eine unmittelbare Motivation hatte!], so ist die Befragung von Wissenden legitim.

    Zumal:
    Wozu sollte es bitte schön überhaupt Foren dieser Art geben, wenn nicht zum Wissensausausch? Man findet doch alles mit goolen raus... 😉
    (...unter anderem, weil Google auch ettliche Foren durchsuct...?)

    Gruß,
    Dong

    P.S.:
    1. Wenn mir hingegen etwas zutreffendes vorgeworfen wird, dann mache ich das, was Hunde in diesem Fall auch machen: Betroffen zu Boden schauen und ganz still sein.
    Nur für den Fall, dass mit "getroffene Hunde bellen" (wie allgemein fälschlicherweise üblich) "Menschen wehren sich gegen zutreffende Unterstellungen" gemeint ist.
    2. Von mir aus kann der Thread geschlossen werden. Es handelt sich hier schließlich um eine reine Off-Topic Diskussion, die Frage (gibt es sowas wie ComputeNormals() auch für nicht Meshes) ist ja schon längst beantwortet (und meine Normalen längst berechnet - übrigens nicht mit dem Vektorprodukt sondern simpler Geometrie des für mich relevanten Spezialfalls :))



  • rrrrrhhh, wauh. Hehe. f'`8k

    Autocogito

    Gruß, TGGC (\-/ has leading)


Anmelden zum Antworten