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

18.12.2013, 18:15

[DirectX9_C++]Nebel

Ich habe ein Haus gemacht und möchte nun einen gelben Nebel machen der bei dem ersten Vertex des Hauses beginnt und nach einer Länge von 0.5f dann so stark wird,dass man alles, was dahinter ist nicht mehr sieht.
Ich habe das zurzeit so realisiert:


g_pD3DDevice->SetRenderState(D3DRS_FOGENABLE,TRUE);
g_pD3DDevice->SetRenderState(D3DRS_FOGTABLEMODE, D3DFOG_LINEAR);
g_pD3DDevice->SetRenderState(D3DRS_FOGVERTEXMODE, D3DFOG_NONE);
g_pD3DDevice->SetRenderState(D3DRS_FOGCOLOR,(DWORD)(1.f,1.f,0.f));
g_pD3DDevice->SetRenderState(D3DRS_FOGSTART,(DWORD)(g_aTriangleVertex[1].vPosition.x,g_aTriangleVertex[1].vPosition.y,g_aTriangleVertex[1].vPosition.z));
g_pD3DDevice->SetRenderState(D3DRS_FOGEND,(DWORD)(0.5f,0.5f,0.5f));
g_pD3DDevice->SetRenderState(D3DRS_FOGDENSITY,0.40f);
g_pD3DDevice->SetRenderState(D3DRS_RANGEFOGENABLE, FALSE);

Bei der Positionsangabe habe ich den ersten Vertex von meinem Haus genommen, da ich das Haus bewegen,rotieren... kann und da sich da ja die Position ändert.

Das Problem ist nur, dass das Haus dann !schwarz! wird(nur die Flächen) und der Raum ist ganz normal....
wäre sehr freundlich wenn mir jemand behilflich sein könnte

GENESIS
»GENESIS« hat folgende Bilder angehängt:
  • Mit_Nebel.gif
  • Ohne_Nebel.gif

FSA

Community-Fossil

  • Private Nachricht senden

2

18.12.2013, 18:32

Du musst deine Vertizes in Weltkoordinaten transformieren.

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

3

18.12.2013, 19:59

Wie kann ich das machen?

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

18.12.2013, 20:31

Die Zeile hier ist totaler Quatsch:

g_pD3DDevice->SetRenderState(D3DRS_FOGSTART,(DWORD)(g_aTriangleVertex[1].vPosition.x,g_aTriangleVertex[1].vPosition.y,g_aTriangleVertex[1].vPosition.z));

Was wird da gemacht?
Nun, du gibst 3 float-Werte an (x, y, z).
Solch ein Konstrukt liefert in C++ den letzten Wert, hier also z (siehe http://en.wikipedia.org/wiki/Comma_operator).
x und y werden ignoriert und weggeworfen.

z wird nun zu DWORD gecastet.
Auch das ist falsch.
Du musst die Adresse von z nehmen und die in einen DWORD-Zeiger verwandeln, diesen dann dereferenzieren:

*reinterpret_cast<const DWORD*>(&z)

Und das übergibst du dann.

Aber wie FSA schon sagte, berücksichtigst du dadurch nicht die Welt- und die Kamera-Matrix.
Der Nebel wird aber im Kameraraum berechnet. Du musst den Punkt also in den Kameraraum transformieren und dann den z-Wert nehmen.
Wie das geht? Mit der Weltmatrix und der Kameramatrix.

5

18.12.2013, 22:18

Danke für die schnelle Antwort ich schau mal ob ich zusammenbringe ...
dh. ich muss z dann mit der kameramatrix multiplizieren?

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

18.12.2013, 22:20

Nein, nicht z, sondern den ganzen Punkt.
Erst mit der Weltmatrix, dann mit der Kameramatrix.
Vom Ergebnis nimmst du z und castest es wie ich es gezeigt habe nach DWORD.
Streng genommen ist das kein Casting, sondern die Bits des float-Werts werden einfach als DWORD interpretiert.

7

18.12.2013, 22:29

Und wie soll ich es zuerst mit der Welt dann der Kamera Matrix multiplizieren?
Dachte man muss zuerst Kamera dann Welt


C-/C++-Quelltext

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));g_pD3DDevice->SetTransform(D3DTS_VIEW, (D3DMATRIX*)(&mCamera));

    mRotation = tbMatrixRotationY(TB_DEG_TO_RAD(g_fRotationAdd));mTranslation = tbMatrixTranslation(tbVector3(0.00f, -0.50f, 2.0f));mWorld = mRotation * mTranslation;

g_pD3DDevice->SetTransform(D3DTS_WORLD, (D3DMATRIX*)(&mWorld));


Wie soll ich da zuvor Welt dann Kamera-Matrix?

Und von welchem Ergebnis Z?
Bei Weltmatrix hab ich ja nur Rotation*Translation

FSA

Community-Fossil

  • Private Nachricht senden

8

18.12.2013, 22:32

Vertexposition * World * View

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

9

18.12.2013, 22:34

dass dann in den zeiger reinpacken und beim erstellen des nebels als z punkt nehmen?

10

18.12.2013, 22:45

vielen dank funktioniert^^

Werbeanzeige