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

Sluggy

Frischling

  • »Sluggy« ist der Autor dieses Themas

Beiträge: 30

Wohnort: Spardorf

Beruf: Schüler

  • Private Nachricht senden

1

07.08.2006, 15:35

Berechnung von Normalenvektoren

Servus,

ich bin gerade beim Kapitel über Beleuchtung und es geht mal wieder gar nichts.

Materialien und Lichter sind mir zwar klar, aber ich verstehe nicht ganz, wie man Normalenvektor der Vertizes berechnen soll. Das Beispielprogramm im Buch kann mir überhaupt nicht weiterhelfen, da dort nur X-Modelle gerendert werden.

Im buch habe ich zur berechnung folgendes gefunden:

Zitat

(...) Um den Vertexnormalenvektor zu erhalten, muss man erst einmal all diese Dreicke finden (die Dreiecke, in denen der Vertex vorhanden ist). Dann bildet man den normalisierten Mittelwert ihrer Normalenvektoren, und schon hat man den gesuchten Vektor!


Den normalenvektor bildet man in 2D mit der Funktion tbVertex3Cross(Vertex1, Vertex2), aber wie geht das in 3D?

Und wie ist das mit dem Mittelwert zu verstehen?

Wenn ich z.B. den Normalenvektor eines Vertex in einem Würfel berechnen will, muss ich dann für alle 6 angrenzende Dreiecke den Normalenvektor berechnen und dann den Mittelwert finden? Wie geht das?

Wie ihr seht blicke ich überhaupt nicht durch, hoffentlich kann mir trotzdem jemand helfen...
LIFE SUCKS!!!

CW_Kovok

Alter Hase

Beiträge: 836

Wohnort: nähe Bonn

Beruf: Schüler

  • Private Nachricht senden

2

07.08.2006, 15:45

1. auch in 3D berechnest du den normalenvektor übers Kreuzprodukt.
2. Das mit dem Mittelwert ist so gemeint: stell dir einen Würfel vor, da wird eine Ecke von 3 Dreiecken benutzt, nur bekommst du als normalen Vektor mal (1,0,0) (0,1,0) und mal (0,0,1), so würdest du nur einen willkürlich davon nehmen, dann würde es Fehler bei der Beleuchtung geben, bildest du hingegen den Mittelwert, der hier (0.5 , 0.5 , 0.5) Den du noch normalisieren musst. Also schräg auf dem Würfel, was der Beleuchtung auch dann wesentlich näher liegt
Was es alles gibt, das ich nich brauche - Aristoteles

Sluggy

Frischling

  • »Sluggy« ist der Autor dieses Themas

Beiträge: 30

Wohnort: Spardorf

Beruf: Schüler

  • Private Nachricht senden

3

07.08.2006, 18:06

@CW_Kovok:

1. Grenzen in einem Würfel nicht 6 Dreiecke an einen Vertex (3 Seitenflächen/Vierecke *2)?
2. Wie kommst du auf deinen Mittelwert?
Müsste man nicht alle zusammenzählen und dann durch die Anzahl teilen?

Rechnung: ((1,0,0) + (0,1,0) + (0,0,1)) / 3 = (1,1,1) / 3 = (0.3,0.3,0.3)

Oder geht das anders?

Hier hab ich mal den Code für den Normalvektor von einem Vertex eines Würfels, wie ich ihn mir vorstelle:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// Vertexstruktur

    struct SVertex
    {
        tbVector3 vPosition;
        tbVector3 vNormal;
    };

    // Vertices für Würfel

    SVertex Vertices[8];

    // Positionen der Eckpunkte des Würfels

    Vertices[0].vPosition = tbVector3( -1.0f,  1.0f, 1.0f);
    Vertices[1].vPosition = tbVector3(  1.0f,  1.0f, 1.0f);
    Vertices[2].vPosition = tbVector3(  1.0f,  1.0f,-1.0f);
    Vertices[3].vPosition = tbVector3( -1.0f,  1.0f,-1.0f);
    Vertices[4].vPosition = tbVector3( -1.0f, -1.0f, 1.0f);
    Vertices[5].vPosition = tbVector3(  1.0f, -1.0f, 1.0f);
    Vertices[6].vPosition = tbVector3(  1.0f, -1.0f,-1.0f);
    Vertices[7].vPosition = tbVector3( -1.0f, -1.0f,-1.0f); 

    // Normalvektor für 1. Vertex

    Vertices[0].vNormal = tbVector3Normalize(                                   // Normalisieren

        (tbVector3Cross(Vertices[0].vPosition, Vertices[2].vPosition)+
         tbVector3Cross(Vertices[0].vPosition, Vertices[2].vPosition)+
         tbVector3Cross(Vertices[0].vPosition, Vertices[5].vPosition)+
         tbVector3Cross(Vertices[0].vPosition, Vertices[5].vPosition)+
         tbVector3Cross(Vertices[0].vPosition, Vertices[7].vPosition)+
         tbVector3Cross(Vertices[0].vPosition, Vertices[7].vPosition))  / 6);   // Mittelwert


Bei der Kreuzmultiplikation nehme ich immer den Vertex selber und für jede 2 Dreiecke eines angrenzenden Vierecks den gegenüberliegenden Eckpunkt (die sind ja auf jeden Fall im dazugehörigen Dreieck).

Aber irgentwie funktioniert nix und es kommt mir auch sehr kompliziert vor, das für jeden einzelnen Vertex zu so zu berechnen...
LIFE SUCKS!!!

CW_Kovok

Alter Hase

Beiträge: 836

Wohnort: nähe Bonn

Beruf: Schüler

  • Private Nachricht senden

4

07.08.2006, 18:09

jupp beim mittelwert verrechnet kommt aber aufs selbe raus.
zu deiner sache 24 Dreiecke 8 Ecken -> jede ecke wird 3 mal verwendet
Was es alles gibt, das ich nich brauche - Aristoteles

big_muff

Alter Hase

Beiträge: 460

Wohnort: Schweiz

Beruf: Informatikstudent (4. Semester)

  • Private Nachricht senden

5

07.08.2006, 20:08

Re: Berechnung von Normalenvektoren

Zitat von »"Sluggy"«

Den normalenvektor bildet man in 2D mit der Funktion tbVertex3Cross(Vertex1, Vertex2), aber wie geht das in 3D?

tbVertex3Cross() ist 3D, ausserdem gibt es in 2D nicht wirklich Normalenvektoren, denn ein Normalenvektor ist ein Vektor, der senkrecht auf zwei andere steht und da in 2D alle Vektoren planar sind, ragt der Normalenvektor aus der zweiten Dimension heraus...

Und ja, der Vertexnormalenvektor ist der Mittelwert der Normalenvektoren aller diesen Vertex enthaltenden Dreiecke (Mann, ist das ein Satz!). Allerdings musst du das nicht so genau wissen, da in der Praxis die Normalenvektoren nie (ja, es gibt Ausnahmen, ich weiss...) berechnet werden, man lädt die aus den Modelldateien. Trotzdem ist es sicher gut, die Theorie dahinter zu kennen...
Nur Idioten halten Ordnung, ein Genie beherrscht das Chaos.[size=7]

[/size]HardFate - Ein Start, Ein Ziel, Viele Wege[size=7]

[/size]Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.

Sluggy

Frischling

  • »Sluggy« ist der Autor dieses Themas

Beiträge: 30

Wohnort: Spardorf

Beruf: Schüler

  • Private Nachricht senden

6

07.08.2006, 20:30

Schon klar, aber wenn man mal so zum "Probieren" ein Dreieck (oder auch einen Würfel) selber zeichnen und diesen beleuchten will dann benötigt Direct3D doch den Vektor, oder?
LIFE SUCKS!!!

big_muff

Alter Hase

Beiträge: 460

Wohnort: Schweiz

Beruf: Informatikstudent (4. Semester)

  • Private Nachricht senden

7

07.08.2006, 20:46

Ja, zum Beleuchten wird immer ein Noralenvektor benötigt. Allerdings musst du nur für "runde" Objekte oder "runde" Teile eines Objektes die Normalenvektoren mit dem Mittelwert berechnen. Für ein Dreieck oder einen Würfel also nicht. Aber das steht ja im Buch...
Nur Idioten halten Ordnung, ein Genie beherrscht das Chaos.[size=7]

[/size]HardFate - Ein Start, Ein Ziel, Viele Wege[size=7]

[/size]Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.

Sluggy

Frischling

  • »Sluggy« ist der Autor dieses Themas

Beiträge: 30

Wohnort: Spardorf

Beruf: Schüler

  • Private Nachricht senden

8

09.08.2006, 12:11

Re: Berechnung von Normalenvektoren

Hi,

sorry, dass ich nochmal wegen den komischen vektoren nerve...

Zitat von »"big_muff"«

Allerdings musst du das nicht so genau wissen, da in der Praxis die Normalenvektoren nie (ja, es gibt Ausnahmen, ich weiss...) berechnet werden, man lädt die aus den Modelldateien. Trotzdem ist es sicher gut, die Theorie dahinter zu kennen...


Aus welchen Format lädst du die Normalenvektoren?
Ich arbeite gerade an einem 3ds-loader, aber ich bin mir nicht so sicher ob da ein chunk für normalenvektoren ist...
LIFE SUCKS!!!

Phili

unregistriert

9

09.08.2006, 12:20

@Sluggy
Normalenvektoren gibts in wirklich jedem 3D-Format.

Black-Panther

Alter Hase

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

10

09.08.2006, 13:20

@Phili
Stimmt nicht... 3ds zB hat keine...
Ich lad auch aus 3ds... wenn du willst, poste ich dir den Code zum berechnen der Normalvektoren...
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

Werbeanzeige