-
Привет! Подскажите пожалуйста, как в формуле проекции учесть наклон камеры?
Использую такую:
X := (P.x * fov / P.z) + cx;
Y := (P.y * fov / P.z) + cy;
Получается просто горизонт:
http://hostingkartinok.com/show-image.php?id=42189f5c31f415e0e66ac15bed3aa8e9
Вращать, двигать объект возможность есть, но нужно повернуть именно камеру. -
Pavia © (05.01.17 12:32) [1]Какой наклон?
Вначале вращаем весь мир в соответствии с камерой, а затем уже проецируем.
http://courses.graphicon.ru/files/courses/cg/2012/lectures/cg2012_08_opengl.pdf -
>Вначале вращаем весь мир
1. У меня не OpenGL. Свой аналог типа DirectX. Пока простенький.
2. Вращать весь мир накладно по производительности. -
Хотя судя по формуле проекции придется каждую точку сцены пересчитать для проекции :(
-
Pavia © (05.01.17 16:27) [4]1. DirectX от OpenGL отличается только системой умножения матриц. Домножение с лева или с права.
2. Весь мир вращается только один раз на кадр. Для этого однотипные преобразования накапливаются в матрице. Так называемая матрица проецирования.
После умножения всех координат на матрицу все значения делятся на w, которая равна z+NearPlane.
Вот это деление называется перспективным преобразованием или перспективным делением.
Накладно да, но не так накладно как всё остальное. По большей части это векторные преобразования. :( Жаль что не целиком. Из-за свойств перспективы координату надо рассчитывать для каждой точке! Поэтому рассчитывают только для части, а далее линейно интерполируют между 10-20 точками.
По поводу умножения на матрицу. К примеру исключить транспонирование при хранении матрицы или взять быструю формулу с минимальным числом умножений 12.
Intel одно время специально публиковала алгоритм быстрого умножения матрицы на матрицу и матрицы на вектор оптимизированные под их процессор.
4*3 тактов на чтение вектора и 16*3 на чтение матрицы 4*6 такта на умножение =84
3*50 тактов деление = 150 -
ЯЧтсия (09.01.17 14:48) [5]Удалено модератором
-
Pavia © (20.01.17 10:57) [6]Нашёл ссылку тут по лучше расписано.
http://graphicon.ru/oldgr/courses/cg99/notes/lect10/ogl_vvol.htm