Render.ru

OpenGL и raytracer engine. help!!!

Melvin

Пользователь сайта
Рейтинг
2
#1
Доброе время суток! Уважаемые знатоки, помогите разобраться с этой проблемой! Прошу прощения, если не в нужную тему форума воткнулся!

Что есть: 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. Пожалуйста не отвечайте – “А посмотри там …. там давно все решено и за тебя сделано” или что-то подобное.
 

GhostCoderPPetrov

Пользователь сайта
Рейтинг
2
#3
пусть 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 -- куда
// ИЗМЕНИЛ
global_ray_dir = ray_dir * mtx_result
global_ray_orig = ray_orig * mtx_result // НУЖНА ТАКЖЕ RAY ORIG пропустить через обратную матрицу
result_ray_dir = global_ray_dir – global_ray_orig -- само направление // ВЫЧИСЛЯЕМ НАПРАВЛЕНИЕ ЛУЧА В МИРОВЫХ КООРДИНАТАХ
Normalize( result_ray_dir ) -- нормализация

Думаю, что так будет работать.
Можешь рассказать поподробней что за проект?
 
Сверху