Ich habe mir den Quellcode dieser raytracer angesehen. Auf der Datei algebra3.cpp
in Zeile 145 Namen können wir diese Funktion sehen:Warum ist dieser Rückgabetyp gültig?
inline vec2 operator * (const mat3& a, const vec2& v) {
vec3 av;
av.n[VX] = a.v[0].n[VX]*v.n[VX] + a.v[0].n[VY]*v.n[VY] + a.v[0].n[VZ];
av.n[VY] = a.v[1].n[VX]*v.n[VX] + a.v[1].n[VY]*v.n[VY] + a.v[1].n[VZ];
av.n[VZ] = a.v[2].n[VX]*v.n[VX] + a.v[2].n[VY]*v.n[VY] + a.v[2].n[VZ];
return av;
}
Es stattdessen ein vec2
Objekt zurückgeben sollte ich ein vec3
zurück. Warum das?
Der Quellcode oben lautet: 'Ein Vektor einer Dimension (2d, 3d oder 4d) kann in einen Vektor einer höheren oder niedrigeren Dimension umgewandelt werden. Bei der Umwandlung in eine höhere Dimension wird die neue Komponente standardmäßig auf 1.0 gesetzt, es sei denn, ein Wert ist angegeben: vec3 a (1.0, 2.0, 3.0); vec4b (a, 4,0); // jetzt b == {1.0, 2.0, 3.0, 4.0}; Beim Gießen in eine niedrigere Dimension wird der Vektor in der unteren Dimension homogenisiert. Wenn z. B. ein 4d {X, Y, Z, W} in 3d umgewandelt wird, ist der sich ergebende Vektor {X/W, Y/W, Z/W}. Es liegt an dem Benutzer sicherzustellen, dass die vierte Komponente vor dem Gießen nicht Null ist. ' – EdChum
Es besagt, dass die Vektoren auf verschiedene Arten von höheren/niedrigeren Dimensionen umgewandelt werden können – EdChum
Könnte ein Fehler sein, könnte absichtlich sein. Sieht so aus, als ob der Compiler von vec3 zu vec2 konvertiert. –