Доброе время суток! Уважаемые знатоки, помогите разобраться с этой проблемой! Прошу прощения, если не в нужную тему форума воткнулся!
Что есть: OpenGL пространство и рейтрейсерный движок.
Что нужно: Ориентируя камеру, т.е. манипулируя видовой и проекционной матрицами получить ориентацию луча в рейтресерном движке. Проще, даны две матрицы видовая и проекционная. Тупо читаемые из OpenGL glGetDoublev…. в рейтрейсере я должен как-то ориентировать луч также как и в OpenGL с учетом матриц из opengl. Не забывайте, что рейтрейсер отдельный от opengl приложения, передаются только матрицы и объекты.
Моя идея:
пусть mtx_mdl – видовая, mtx_proj – проекционная
mtx_result = mtx_mdl * mtx_proj -- перемножаем и заносим результат в mtx_result
Inverse(mtx_result) -- инвертируем
ray_orig – начало луча
ray_dir – направление
dx, dy – принадлежат интервалу [-1, 1], т.е. относительные координаты экрана
ray_orig.x = dx
ray_orig.y = dy
ray_orig.z = -1 -- откуда
ray_orig = ray_orig * mtx_result
ray_dir.x = dx
ray_dir.y = dy
ray_dir.z = 1 -- куда
ray_dir = ray_dir * mtx_result
ray_dir = ray_dir – ray_orig -- само направление
Normalize( ray_dir ) -- нормализация
Итог: как вы понимаете, толкового ничего не получилось! Если ручками луч задавать, а не через шматрицы, то все хорошо и красиво! Кстати, косяки в мат. библиотеке исключены. Вопрос в другом, как и какой правильный подход, применить к решению этой задачи( по возможности с примером )! Спасибо за оказанную помощь!
P.S. Пожалуйста не отвечайте – “А посмотри там …. там давно все решено и за тебя сделано” или что-то подобное.
Что есть: OpenGL пространство и рейтрейсерный движок.
Что нужно: Ориентируя камеру, т.е. манипулируя видовой и проекционной матрицами получить ориентацию луча в рейтресерном движке. Проще, даны две матрицы видовая и проекционная. Тупо читаемые из OpenGL glGetDoublev…. в рейтрейсере я должен как-то ориентировать луч также как и в OpenGL с учетом матриц из opengl. Не забывайте, что рейтрейсер отдельный от opengl приложения, передаются только матрицы и объекты.
Моя идея:
пусть mtx_mdl – видовая, mtx_proj – проекционная
mtx_result = mtx_mdl * mtx_proj -- перемножаем и заносим результат в mtx_result
Inverse(mtx_result) -- инвертируем
ray_orig – начало луча
ray_dir – направление
dx, dy – принадлежат интервалу [-1, 1], т.е. относительные координаты экрана
ray_orig.x = dx
ray_orig.y = dy
ray_orig.z = -1 -- откуда
ray_orig = ray_orig * mtx_result
ray_dir.x = dx
ray_dir.y = dy
ray_dir.z = 1 -- куда
ray_dir = ray_dir * mtx_result
ray_dir = ray_dir – ray_orig -- само направление
Normalize( ray_dir ) -- нормализация
Итог: как вы понимаете, толкового ничего не получилось! Если ручками луч задавать, а не через шматрицы, то все хорошо и красиво! Кстати, косяки в мат. библиотеке исключены. Вопрос в другом, как и какой правильный подход, применить к решению этой задачи( по возможности с примером )! Спасибо за оказанную помощь!
P.S. Пожалуйста не отвечайте – “А посмотри там …. там давно все решено и за тебя сделано” или что-то подобное.