Я следую учебным пособиям LearnOpenGL и возился с отбрасыванием теней. Пока все работает правильно, но есть эта очень специфическая проблема, когда я не могу отбрасывать тени от чисто вертикального направленного света. Давайте добавим немного кода. Моя космическая матрица освещения выглядит следующим образом:
glm::mat4 view = glm::lookAt(-direction, glm::vec3(0.0f), glm::vec3(0.0f, 1.0f, 0.0f));
return glm::ortho(-10.0f, 10.0f, -10.0f, 10.0f, -10.0f, 10.0f) * view;
направление - это вектор с направлением света, конечно же, в качестве направления. Все работает хорошо, пока этот вектор направления не будет установлен на (0, -1,0), потому что он параллелен вектору вверх (0,1,0). Чтобы построить матрицу lookAt
, glm выполняет перекрестное произведение между вектором вверх и разницей между центром и глазом (так что в этом случае это в основном направление),но это перекрестное произведение не даст никакого результата, так как два вектора параллельны.
Зная все это, мой вопрос будет таким: как мой lookAt
должен видеть матрицу, когда вектор вверх и направлениесвет идет параллельно?
Редактировать: Спасибо за ваш ответ, я изменил свой код на это:
if(abs(direction.x) < FLT_EPSILON && abs(direction.z) < FLT_EPSILON)
view = glm::lookAt(-direction, glm::vec3(0.0f), glm::vec3(0.0f, 0.0f, 1.0f));
else
view = glm::lookAt(-direction, glm::vec3(0.0f), glm::vec3(0.0f, 1.0f, 0.0f));
return glm::ortho(-10.0f, 10.0f, -10.0f, 10.0f, -10.0f, 10.0f) * view;
и теперь все работает отлично!