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.06.2009, 12:39

Problem mit Licht: Spotlight-Taschenlampe

HI Leuts,

hab mal ne Frage zu dem Lichtkapitel.

Zitat

Schreiben Sie das Beispielprogramm mit den Würfeln, so um, dass es eine rotierende Spotlichtquelle gibt die sozusagen die Funktion eines Luchtturms hat


Ich wollte halt anstatt des Leuchturmeffekts ne Art Taschenlampe machen. Sprich immer einen Lichtkegel von einem Weg.

Für die Lampe hab ich da dann folgendes eingefügt:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    // Das Punktlicht wird nun erstellt.
    ZeroMemory(&SpotLight, sizeof(D3DLIGHT9));
    SpotLight.Type          = D3DLIGHT_SPOT;                                // Punktlicht
    SpotLight.Diffuse       = tbColor(1.0f, 1.0f, 1.0f);                    // Weiße Streufarbe
    SpotLight.Ambient       = tbColor(1.0f, 1.0f, 1.0f);                    // Weiße Hintergrundfarbe
    SpotLight.Specular      = tbColor(1.0f, 1.0f, 1.0f);                    // Weiße Glanzfarbe
    SpotLight.Position      = g_vCameraPosition;    
    SpotLight.Direction     = g_vCameraPosition + tbVector3(sinf(g_fCameraAngle),
                                                           0.0f,
                                                           cosf(g_fCameraAngle)),
    SpotLight.Range     = 100.0f;                                       // 100 Einheiten Reichweite
    SpotLight.Falloff = 1;
    SpotLight.Theta = 20;
    SpotLight.Phi= 30;
    SpotLight.Attenuation0  = 0.0f;                                         // Lichtabschwächung
    SpotLight.Attenuation1  = 0.025f;                                       // ...
    SpotLight.Attenuation2  = 0.0f;                                         // ...

    // Licht einsetzen und aktivieren
    g_pD3DDevice->SetLight(0, &SpotLight);
    g_pD3DDevice->LightEnable(0, TRUE);

    // Globales schwaches rotes Hintergrundlicht einstellen
    g_pD3DDevice->SetRenderState(D3DRS_AMBIENT, tbColor(0.25f, 0.0f, 0.0f));


Es gibt dabei auch ein funktionierendes Spotlicht, aber das bewegt sich irgendwie komisch unabhängig der Kamera (spriuch zwischendurch sieht man es immer wenn man sich nen bisschen hin und her bewegt) und nicht mit der Kamera.

Hat jemand ne Ahnung was ich falsch mache?

Danke schonmal!

Snapper[/quote]

2

27.06.2009, 13:03

Ups falsches Forum :?

3

27.06.2009, 13:05

Ich vermute, die Richtung stimmt nicht.
Wieso addierst du dort noch die Kameraposition dazu?

4

27.06.2009, 13:10

Weil das bei der Kameramatrix auch so gemacht wurde:

Quellcode

1
2
3
4
5
    mCamera = tbMatrixCamera(g_vCameraPosition,
                             g_vCameraPosition + tbVector3(sinf(g_fCameraAngle),
                                                           0.0f,
                                                           cosf(g_fCameraAngle)),
                             tbVector3(0.0f, 1.0f, 0.0f));


Und da sollte ja Blickrichtung = Leuchtrichtung stimmen.

5

27.06.2009, 14:40

Hast du es anders versucht?

6

27.06.2009, 14:54

Jopp, habs gleich mal versucht. Klappt aber net :/ das Licht steht irgendwo im Raum.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

27.06.2009, 15:34

Zitat von »"Snapper"«

Weil das bei der Kameramatrix auch so gemacht wurde:


Bei der Kameramatrix ist aber auch net die Richtung sondern der lookat Punkt gefragt, also ne Position...
Das Addieren der Position da ist auf jeden Fall falsch.

Was heißt "es steht irgendwo im Raum"? Kannst du den Fehler evtl. mit einem Screenshot/Video illustrieren!?

8

27.06.2009, 17:56

Ahh es geht nun...habe das ganze mal mit -1 malgenommen:

C-/C++-Quelltext

1
2
3
    SpotLight.Direction     = [b]-1[/b]*tbVector3(sinf(g_fCameraAngle),
                                                           0.0f,
                                                           cosf(g_fCameraAngle)),


Scheinbar hat das direkt in die falsche RIchtung geleuchtet (funktionierte nur wenn man direkt vor nem Kubus stand - dann blitzte der auf).

Danke nochmal für den Tipp das das kein Positionsvektor war :)

Gruß
Snapper

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

27.06.2009, 18:07

Ja das denk ich mir, aber warum schließt du daraus sofort dass die Position nicht stimmt!?

Sofern du die Fixed Function Pipeline verwendest wird die Belechtung nur pro Vertex berechnet und die Werte an den Vertices über das Polygon interpoliert (Gouraud Shading). Wenn die Vertices jetzt außerhalb des Kegels deines Spotlight liegen werden die alle schwarz sein. Dann wird über den Rest des Würfels interpoliert und es kommt, oh Wunder, schwarz raus ;)

Für das was du machen willst (Taschenlampe) ist ein Spotlight nur sehr bedingt geignet. Damit das funktioniert und einigermaßen gut aussieht musst du deine Geometrie hoch auflösen (also z.B. die Flächen des Würfels aus sehr vielen kleinen Vierecken zusammensetzen).

Alternativen: Entweder Per Pixel Lighting für deinen Spot verwenden oder Projective Texturemapping (Die klassiche Technik für die Taschenlampe im Shooter). ich weis nicht wie weit fortgeschritten du bist. Für einen totalen Anfänger ist beides evtl. noch ein bisschen viel aber wenn du dich schon ein bisschen sicherer fühlst kannst dus dir ja mal anschauen. Projective Texturemapping kommt ohne Shader aus.

10

27.06.2009, 18:11

Ich hab mich da ja eigentlich nur auf die Aufgabe im Buch bezogen, wo ja die Idee war ein sich drehendes Spotlight zu machen. Das ich damit keine geniale Lampe erschaffen habe ist mir bewusst :)

Werbeanzeige