Я нашел способ как вращать шадоумапу для точечного источника. Но это просто тест и ничего более, как попытка определить, где хотя бы нужно изменять.
Оригинал
C++ Source Code:
ShadowOmni(-var_LightVec, u_ShadowParams);
Я попробовал повернуть вектор. Нашел формулу, правда она для 2д (для 3д матрицы что ли надо юзать?) и поигрался с числами:
Повторюсь, это просто тест и попытка повернуть вектор хотя бы в 2д. Выяснилось, что при определенных значениях gl_test шадоумапа ложится идеально на конкретную модель (которая повернута). Только почему идет прибавка к углу angles я пока не понимаю.
TL: DR нужно в shadowomni повернуть вектор var_LightVec в зависимости от angles модели. Вот только как это сделать я пока не разобрался. Есть идеи у кого-нибудь?
Добавлено 23-12-2021 в 13:49:
Нашел прямую зависимость. Горизонтальный поворот шадоумапы для всех моделей адекватный. Остался вертикальный.
А в чём прикол теней и света в локальном пространстве, зачем оно вообще используется?
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
Как результат, тени ложатся всегда идеально на модели в горизонтальном повороте. А вот дальше я пока не совсем понимаю. Сейчас я сделал поворот шадоумапы по одной из осей. Мне нужно получается сделать еще 2 матрицы, а в конце записать так:
vec3 ShadowVec = m * m1 * m2 * vec3(1.0);
Я хоть на правильном пути? Подскажите.
Добавлено 23-12-2021 в 21:58:
Так, вот сделал все 3 матрицы. Для каждой из осей.
Та первая, вот еще две.
Я вчера ошибся в том, что каждую матрицу считал из изначального вектора. А надо было брать вектор, посчитанный предыдущей матрицей. Но есть проблема - модель может быть повернута только в одной плоскости, чтобы тень не съезжала. Кажется, я был прав, что для омни-теней нужно повернуть var_lightvec и загнать его в shadow.
Ну что, все пофикшено. Оказалось, нужно было просто матрицы записать в обратном порядке. Наконец-то проблема со светотенью полностью разрешилась. Правильно или нет - у меня уже нет ни сил, ни желания притрагиваться. Несколько месяцев попыток прошли не зря. Однако ж, без Дяди Миши и советом про матрицу с обратным скейлом я бы еще долго сидел.
Получается так? Но я сделал это в шейдере. Сделал копию var_LightVec перед тенями и повернул его в зависимости от angles модели. Я долго делал то же самое в коде, но почему-то ничего не получалось. Почем и решил взять уже вектор, который был трансформирован в вертексном шейдере. Не прогадал однакось!