|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
Camera::ray Camera::getRay(float x, float y){
ray r;
calculateViewMatrix();
calculateProjectionMatrix();
mat4 pv = (m_projectionMatrix*m_viewMatrix).inverse();
float w = x/(float(m_viewport[2]-m_viewport[0])/2.0f)-1.0f;
float h = -(y/(float(m_viewport[3]-m_viewport[1])/2.0f)-1.0f);
vec4 n = pv*vec4(w, h, -1.0f, 1.0f);
n /= n.w;
vec4 f = pv*vec4(w, h, 1.0f, 1.0f);
f /= f.w;
r.position = vec3(n);
r.direction = vec3(f).normalize();
return r;
}
|
So device Koordinaten stimmen schon mal, links -1.0 rechts 1.0 oben 1.0 unten -1.0.
Dann meintest du das so in der vierten Zeile? Projektionsmatrix*Viewmatrix?
Dann die beiden vec4 Punkte aufgesetzt * der inversen der pv und / w teilen?
Mögliche Ausgabe:
|
Quellcode
|
1
|
-10.8186|-10.5365|0.289706|-0.71762|-0.696084|0.0221132
|
Vorne erster Punkt, hinten Richtung...
Vorne x und y kann schon mal sein, wenn ich rauszoome und die Kamera zu Anfang bei -5, -5 steht. Allerdings ändert sich das auch nicht wenn ich rotiere... Dann z vorne könnte auch sein.
Hinten die Richtung ändert sich auch kaum.
Also könnte schon passen, aber ändert sich nicht wenn ich rotiere, so wie vorher.
Das die Matrizen ja richtig berechne sehe ich an der Ausgabe.
Vielleicht liegt es an der Matrixmultiplikation?
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
|
vec4 mat4::operator*(const vec4 &v){
vec4 r = vec3();
r.x = values[0]*v.x+values[4]*v.y+values[8]*v.z+v.w*values[12];
r.y = values[1]*v.x+values[5]*v.y+values[9]*v.z+v.w*values[13];
r.z = values[2]*v.x+values[6]*v.y+values[10]*v.z+v.w*values[14];
r.w = values[3]*v.x+values[7]*v.y+values[11]*v.z+v.w*values[15];
return r;
}
|
Ich kann mir zwar die Idee hinter dem ganzen Verfahren erklären, aber naja, die lineare Abhängigkeit hier ist mir nicht so ganz klar.