Я смотрел исходный код этого raytracer. В файл с именем algebra3.cpp
в строке 145 мы можем увидеть эту функцию:Почему этот тип возврата действителен?
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;
}
Он должен возвращать объект vec2
вместо его возвращающего vec3
. Почему это?
Исходный код в верхних положениях: «Вектор одного измерения (2d, 3d или 4d) может быть отнесен к вектору более высокого или более низкого измерения. Если лить в более высокий размер, , новый компонент устанавливается по умолчанию равным 1.0, если не указано значение : vec3 a (1.0, 2.0, 3.0); vec4 b (a, 4.0); // now b == {1.0, 2.0, 3.0, 4.0}; При отливке в нижний размер вектор гомогенизируется в нижнем измерении. Например, если 4d (X, Y, Z, W} отбрасывают в 3d, итоговый вектор представляет собой {X/W, Y/W, Z/W}. Пользователь должен до гарантировать, что четвертый компонент не равен нулю перед литьем. ' – EdChum
В нем указано, что векторы могут быть отлиты для разных типов более высоких/меньших размеров. – EdChum
Возможно, это будет ошибка. Похоже, что компилятор конвертирует с vec3 в vec2. –