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

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

1

11.09.2012, 13:51

Point Light Lichtvektor

Hey,

ich komme gerade nicht mehr darauf wie man den Lichtvektor für ein Pointlight errechnet. Eigentlich sollte es ja so funktionieren wie bei dem Directionallight nur dass der Lichtvektor zwischen modelview*vertex und Lichtposition liegt. Allerdings scheint das nicht zu funktionieren.
Die Position der Lichtquelle ist im world space und muss daher ja mit der Modelview der Kamera multipliziert werden (oder?). Wenn ich einen Vektor für die Lichtquelle vorgebe (z.B. die Position des Lichts) bekomme ich mein Directionallight mit attenuation...

Hier mal was ich im Moment habe:


(Link)


Wobei der Lichtvektor (L) so errechnet wird:

Quellcode

1
2
3
vec3 l = (mCamera*vec4(light0.position, 1.0)).xyz-V.xyz;
D = length(l);
L = normalize(l);


mCamera entspricht der untransformieren Modelview (Identity*Perspektive). V ist der Vertex der schon mit der Modelview des Models multipliziert wurde.
Im Fragment Shader wird dann direkt L verwendet:

Quellcode

1
2
3
4
5
6
7
void main(){
    vec4 color = material0.emissive+material0.ambient*light0.ambient;

    vec3 n = normalize(N);
    float NdotL = max(0.0, dot(n, normalize(L)));

    // ...


Ich kann mir das nicht erklären. Aber wahrscheinlich liegt irgendwas nicht im whatever space vor... Aber das ist ja nicht so meine Stärke^^
Ich hoffe ihr könnt mir helfen.

komplette Shader

Edit:

Es liegt an der Kameramatrix, bzw. daran wie ich die Lichtposition in den Worldspace bekomme. Wenn ich die Kamera nahe an den "Nullpunkt" (zwischen beide Kugeln) bewege und entlang der y-Achse gucke passt es. Jetzt weiß ich nur nicht genau wie ich dann von dahin komme. Also so wird sie im Moment berechnet (die mCamera):

Quellcode

1
2
3
4
5
mat4 m;
m.setIdentity();
m.lookAt(m_position.x, m_position.y, m_position.z, // 5 5 5 auf dem Bild oben
             m_lookAt.x, m_lookAt.y, m_lookAt.z, // normalisiert(0 0 0 - 5 5 5)
             m_up.x, m_up.y, m_up.z); // 0 0 1

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »DeKugelschieber« (11.09.2012, 14:56)


DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

2

11.09.2012, 15:26

Ich bin mir nicht sicher, aber muss nicht die Lichtposition in den Objectspace, so wie bei den Normalen?
Wenn ich allerdings die Modelmatrix des Objects nehme und diese invertiere + transponiere funktioniert das nicht. Wenn ich die Modelview nehme ebenfalls nicht. Die Lichtquelle in den Viewspace umrechnen funktioniert auch nicht... Irgendwie hab ich das noch nicht verstanden :(

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

11.09.2012, 15:29

Überleg dir, in welchen Spaces deine Koordinaten alle sind und dann überleg dir, wie genau du von dort in den Space kommst, in dem du deine Beleuchtung rechnen willst.

Was genau soll z.B. mCamera sein? Was soll die "untransformiere Modelview" sein? Was genau ist "Perspektive" in "(Identity*Perspektive)"!?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (11.09.2012, 15:35)


DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

4

11.09.2012, 16:02

Also mal von vorne:

Die Vertices liegen Viewspace vor (Modelview).
Die Normalen liegen im Worldspace vor weil sie mit der normalen Matrix die aus der Modelmatrix erstellt wird multipliziert werden.
Dann muss ich wohl die Lichtposition in den Viewspace bringen, den Lichtvektor errechnen und diesen dann in den Worldspace bringen (so wie die Normalen). Falls ich das jetzt richtig verstanden habe.

Mein Problem sind irgendwie die Begrifflichkeiten...
Der Viewspace ist doch Viewmatrix ("lookAt") mal Objektmatrix (Rotation, Transformation, ... des Objekts).
Der Objektspace ist dann nur die Objektmatrix.
Und der Worldspace ist quasi keines davon, also die "Rohdaten".

Im Shader läuft es ja auch so (glaube ich):
worldspace -> viewspace -> screenspace (oder wie man das nennt mit der Projektionsmatrix).
Meine Normalen rechne ich dann ja mit der invertierten, transponierten Modelview zurück in den Worldspace (da ich bei dem directional light den Lichtvektor auch so vorliegen habe?).

Jetzt hab ich bestimmt viel Mist geschrieben^^

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

5

11.09.2012, 16:12

Nee ...
Die Eckpunkte liegen erst einmal im Objektkoordinatensystem vor.
Dann transformiert man sie mittels der Weltmatrix in das Weltkoordinatensystem.
Von dort geht's über die Kameramatrix in das Kamerakoordinatensystem.
Dann kommt ganz zum Schluss die Projektionsmatrix.

Ich würde die Beleuchtung im Weltkoordinatensystem durchführen, das erscheint mir am logischsten.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

11.09.2012, 16:19

Die Vertices liegen wohl erstmal, gleich wie die Normalen im Objectspace (Modelspace), also relativ zum Ursprung des Models (so wie das Ding eben modelliert wurde). Die Model Matrix ist nicht der Objectspace, die Model Matrix transformiert vom Objectspace in den Worldspace. Die View Matrix ist nicht der Viewspace, die View Matrix transformiert vom Worldspace in den Viewspace. Die ModelView Matrix ist das Produkt der View mit der Model Matrix und transformiert demnach vom Objectspace direkt in den Viewspace.

Wenn du deine Vertices mit der ModelView Matrix transformierst, liegen sie im Viewspace.
Wenn du deine Normalen mit der inversen transponierten (weil Richtungsvektor) Model Matrix (?) transformierst, liegen sie im Worldspace vor.

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

7

11.09.2012, 16:25

Also

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
mat4 normalMatrix;
normalMatrix.setIdentity();
normalMatrix.translate(m_position.x+m_rotationPoint.x, m_position.y+m_rotationPoint.y, m_position.z+m_rotationPoint.z);
normalMatrix.rotate(m_rotation.x, 1, 0, 0);
normalMatrix.rotate(m_rotation.y, 0, 1, 0);
normalMatrix.rotate(m_rotation.z, 0, 0, 1);
normalMatrix.translate(-m_rotationPoint.x, -m_rotationPoint.y, m_rotationPoint.z);
normalMatrix.scale(m_scale.x, m_scale.y, m_scale.z);
normalMatrix.inverse();
normalMatrix.transpose();


Quellcode

1
N = vec3(normalize(mNormal*vec4(normal0, 1.0))); // mNormal = normalMatrix


Spuckt mir im Moment also die Weltkoordinaten für die Normalen aus.

Da ich die Lichtquelle an einem Festen Punkt habe der in light0.position steht müsste ich diesen jetzt ja auch in den Viewspace bringen (so wie den Vertex) und dann wieder in den Worldspace mit der mNormal (ohne transformation), oder ich rechne den Vertex in den Worldspace über die mNormal um. Stimmt das so in etwa?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

11.09.2012, 16:31

Richtungsvektoren haben ein w von 0 und nicht 1, wieso das normalize?
Wenn deine Lichtquelle schon im Worlspace ist, brauchst du gar nix damit tun, um sie in den Worldspace zu bekommen. Punkte (wie deine Vertexkoordinaten) haben ein w von 1 und werden nicht mit der inversen transponierten Transformiert:

Punkt: §\begin{pmatrix}x' \\ y' \\ z' \\ w'\end{pmatrix} = \mathrm{\mathbf{M}} \cdot \begin{pmatrix}x \\ y \\ z \\ 1\end{pmatrix}§
Richtung: §\begin{pmatrix}x' \\ y' \\ z' \\ w'\end{pmatrix} = (\mathrm{\mathbf{M}}^{-1})^T \cdot \begin{pmatrix}x \\ y \\ z \\ 0\end{pmatrix}§

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

9

11.09.2012, 16:40


(Link)


Quellcode

1
2
N = vec3(mNormal*vec4(normal0, 0.0)); // -> zu Worldspace
vec3 l = light0.position-(m*vec4(vertex0, 1.0)).xyz; // m = Model Matrix -> zu Worldspace


Die Lichtposition liegt ja bereits im Worldspace vor. Trotzdem stimmt das Bild so nicht, da die Kugeln sich bei -3 0 0 und 3 0 0 im Worldspace befinden und das Pointlight bei 0 0 0. Also müssten die Beleuchtungen sich quasi angucken. Immerhin dreht sich die Beleuchtung nicht mehr mit der Kamera...

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

11.09.2012, 16:43

Sind die beiden Kugeln separate Modelle? Verwendest du bei beiden die jeweils richtigen Matritzen? Zeig mal etwas mehr Code.

Abgesehen davon, würde ich dir die Lektüre eines dieser beiden Bücher wärmstens empfehlen:
http://www.amazon.de/Primer-Graphics-Dev…47374429&sr=8-1
http://www.amazon.de/Mathematics-Game-Pr…47374445&sr=8-1

Wenn du 3D Grafik machen willst, führt kein Weg daran vorbei, sich mal ernsthaft und in Ruhe die mathematischen Grundlagen anzueignen...

Werbeanzeige