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

Edward

Frischling

Beiträge: 18

Wohnort: Bremen

Beruf: Fachinformatiker

  • Private Nachricht senden

11

18.02.2004, 13:34

Normalvektoren

Hallo David.

Kannst du mir sagen, wie man am besten die Vertexnormalvektoren berechnet?
Ich bin gerade dabei, mich einzuarbeiten und habe eine ganze Reihe von
Würfeln, die ich gern beleuchten würde.
Ich habe auch eine Kugel (aus dem Modell, welches du auf der CD mitlieferst)
eingefügt. Diese wird korrekt beleuchtet. Der Rest nicht.

Vielen Dank.

Alex
Um zu wissen, wo die Grenze ist muss man sie erst durchbrechen.

12

18.02.2004, 18:00

Also ich mach es immer so.

Ich setze alle Normalenvektoren (xyz) immer auf NULL. Dann lauf ich durch alle Dreiecke und errechne für jedes Dreieck einen Normalenvektor und Addiere diesen dann zu den drei Normalenvektoren der Vertice vom Dreieck.

Danach geh ich dann alle Vertice noch einmal durch und Normalisiere jeden Normalenvektor. Das Ergebnis ist, das die Lichtberechnung weichere Übergänge von einem Dreieck zum anderen Dreieck haben. Beim Würfel würde das also heißen das die Normalenvektoren in einem 45° Winkel auf der XYZ-Achse abstehen und nicht im 90° Winkel.

Am besten geht diese Methode mit einer Indizierten Dreiecksliste.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Edward

Frischling

Beiträge: 18

Wohnort: Bremen

Beruf: Fachinformatiker

  • Private Nachricht senden

13

18.02.2004, 19:57

Klappt nicht so richtig...

Also irgendwie krieg ich das nicht hin...

Ich berechne die Vertexnormalvektoren wie folgt:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
tbVector3 v1 = pVertexBufferDaten[Indizes[i + 0] + iStartVertex].vPosition;
tbVector3 v2 = pVertexBufferDaten[Indizes[i + 1] + iStartVertex].vPosition;
tbVector3 v3 = pVertexBufferDaten[Indizes[i + 2] + iStartVertex].vPosition;
    
// Durch Subtraktion werden die Verbindungsvektoren (sind auch
// Richtungsvektoren) ermittelt.
tbVector3 vVerb1 = v2 - v1;
tbVector3 vVerb2 = v3 - v2;

// Aus diesen Richtungsvektoren kann das Kreuzprodukt
// (der senkrecht darauf stehende Vektor) gebildet werden
tbVector3 vNorm = tbVector3Cross(vVerb1, vVerb2);

// Der normalisierte Vektor wird dem Normalvektor des Vertex zugewiesen
pVertexBufferDaten[Indizes[i + 0] + iStartVertex].vNormalvektor = tbVector3Normalize(vNorm);
pVertexBufferDaten[Indizes[i + 1] + iStartVertex].vNormalvektor = tbVector3Normalize(vNorm);
pVertexBufferDaten[Indizes[i + 2] + iStartVertex].vNormalvektor = tbVector3Normalize(vNorm);


Erklärung:

- i ist die Zählvariable der Schleife, in der die Indizes ihrem Buffer zugeordnet werden
- iStartVertex ist der Index, an dem der jeweilige Vertex für den nächsten (bzw. aktuellen) Würfel
gespeichert ist
- Indizes ist das Array mit den 36 Indizes, die für die DrawIndexedPrimitive() Funktion benutzt werden

Danach müssten die Vertizes eines Dreiecks doch alle den gleichen normalisierten
Richtungsvektor besitzen, oder nicht?

Vielleicht liegt es aber auch an der Beleuchtung selbst:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Licht.Type = D3DLIGHT_POINT;
Licht.Ambient = tbColor(0.25f, 0.25f, 0.25f);
Licht.Attenuation0 = 0.0f;
Licht.Attenuation1 = 0.0f;
Licht.Attenuation2 = 0.0f;
Licht.Diffuse = tbColor(0.25f, 0.25f, 0.25f);
Licht.Position = tbVector3(0.0f, 3.0f, 0.0f);
Licht.Range = 1000.0f;

g_pD3DDevice->SetLight(0, &Licht);
g_pD3DDevice->LightEnable(0, TRUE);

Material.Ambient = tbColor(1.0f, 1.0f, 1.0f);
Material.Diffuse = tbColor(0.25f, 0.25f, 0.25f);
Material.Specular = tbColor(1.0f, 1.0f, 1.0f);
Material.Power = 10.0f;
Material.Emissive = tbColor(0.0f, 0.0f, 0.0f);

g_pD3DDevice->SetMaterial(&Material);


Danach werden die Würfel und davor (!) die Sterne gezeichnet. Doch keines von beiden
ist zu sehen.

In der Methode InitScene() setze ich die Renderstates wie folgt:

Quellcode

1
2
3
g_pD3DDevice->SetRenderState(D3DRS_LIGHTING, TRUE);
g_pD3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
g_pD3DDevice->SetRenderState(D3DRS_DITHERENABLE, TRUE);


Weißt du noch, woran es liegen kann, dass ich nur einen schwarzen Bildschirm sehe?
Um zu wissen, wo die Grenze ist muss man sie erst durchbrechen.

14

18.02.2004, 20:26

Deine Normalenvektoren sind schon richtig berechnet. Es könnte daran liegen das deine Lichtquelle in deinem Würfel liegt, oder keinen Würfel beleuchtet weil sie auserhalb der Reichweite sind.

Du hast zudem kein Globales Ambientes Licht gesetzt. Setz es mal auch einen Wert z.B. 0x202020. Dann sollten auf jeden fall alle Würfel sichtbar sein.

Beim Material las mal den ganzen Schnickschnak wie Glanzkraft (Power) etc. weg und konzentriere dich auf das wesentliche. Ambientes und Diffuses Licht.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Edward

Frischling

Beiträge: 18

Wohnort: Bremen

Beruf: Fachinformatiker

  • Private Nachricht senden

15

19.02.2004, 11:54

Das funktioniert schon einmal...

Danke für den Hinweis. Wahrscheinlich hat es gefehlt, die "Attenuation1" des Lichts auf einen Wert > 0 zu setzen...

Aber jetzt habe ich das Problem, dass auf den Würfeln keine Textur zu sehen ist. Wenn ich die zu ladende Textur verändere (also eine andere T. lade) verändern sich die Würfel zwar in der Farbe (zumindest etwas) aber von Texturen ist dort nichts zu sehen.

Woran kann das liegen?
Um zu wissen, wo die Grenze ist muss man sie erst durchbrechen.

Edward

Frischling

Beiträge: 18

Wohnort: Bremen

Beruf: Fachinformatiker

  • Private Nachricht senden

16

19.02.2004, 12:20

Hat sich erledigt...

Wenn man Texturen verwenden möchte, sollte man auch Texturkoordinaten angeben, gell? :lol: :wall:
Um zu wissen, wo die Grenze ist muss man sie erst durchbrechen.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

17

19.02.2004, 12:37

Muss man, sonst kann es nicht gehen.
Außer bei Environment-Mapping.

Edward

Frischling

Beiträge: 18

Wohnort: Bremen

Beruf: Fachinformatiker

  • Private Nachricht senden

18

19.02.2004, 13:09

Gut das du da bist...

Ich habe ja, wie bereits erwähnt, eine Reihe von Würfeln, die ich mit einer Textur bepflanzen möchte. Wie müssen denn dann die Texturkoordinaten für die Vertizes aussehen? Ich bin gerade so weit, dass ich nur die Texturkoordinaten für die Vorder- und Hinterseite festlege. Ringsherum wird die T. auch gut dargestellt.
Jedoch nicht auf der Ober- und Unterseite...

Wie kann, bzw. muss, ich die Koordinaten setzen?
Um zu wissen, wo die Grenze ist muss man sie erst durchbrechen.

19

19.02.2004, 16:22

Benutzt du nur 8 Vertice mit einer Indexliste? Wenn ja, hast du ein Problem. Ich glaub hier hatten wir schon einmal eine Diskusion darüber wie man hier die T. koord. setzt. Wenn ich mich recht erinnere: Es geht nicht. Bin mir da aber nicht ganz sicher.

Verwende einfach einen Fächer und spanne jede Seite des Würfels so auf. Das sind dann zwar 24 Vertice, aber was solls ;D
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Edward

Frischling

Beiträge: 18

Wohnort: Bremen

Beruf: Fachinformatiker

  • Private Nachricht senden

20

19.02.2004, 21:16

Also...

... ist es doch eigentlich sowieso besser, vorgefertigte Modelle aus einer X-Datei (oder 3ds-Datei) zu laden, oder nicht? Dann hat man doch diesen ganzen Trouble nicht, oder täusch ich mich da?
Um zu wissen, wo die Grenze ist muss man sie erst durchbrechen.

Werbeanzeige