2015-07-23 2 views
0

У меня есть следующая (относительно простая) проблема. Я разрабатываю рэйтрэйсер и я следую учебник объяснил в этой ссылке:Из формулы формулы координат пикселя в мир

http://www.scratchapixel.com/code.php?id=3&origin=/lessons/3d-basic-rendering/introduction-to-ray-tracing

Существует формула я не получаю, хотя, который используется для отображения пикселя (I, J), чтобы мировые координаты. Формула такова:

float fov = 30, aspectratio = width/height; 
float angle = tan(M_PI * 0.5 * fov/180.); 
float xx = (2 * ((x + 0.5) * invWidth) - 1) * angle * aspectratio; 
float yy = (1 - 2 * ((y + 0.5) * invHeight)) * angle; 

В этом учебнике камера находится в точке (0,0,0) и вверх/вправо/LookAt вектор не используется. Кажется, что в каждом учебном пособии для сопоставления пикселя используется другая формула, и мне не удается получить причину. Кроме того, что, если моя камера не помещена в (0,0,0), но в другом положении, которое я могу решить? Как изменится формула? Можете ли вы мне помочь? Благодаря!

+0

Вы можете смотреть на движение двумя разными способами: 1) камера движется и мир неподвижен, 2) мир движется, и камера неподвижна. Если вы зафиксируете камеру на (0, 0, 0) и направлениях вверх/вправо/смотреть в локальных направлениях y/x/z, то, если вы хотите переместить камеру с помощью вектора 'v', вы можете вместо этого перемещать мир с помощью '-v' и использовать этот же код. То же, что и вращение, вместо поворота камеры на 'theta', вращайте мир на' -theta'. –

+0

Все объяснено в этом уроке: http://scratchapixel.com/lessons/3d-basic-rendering/3d-viewing-pinhole-camera Я не могу поверить, что некоторые люди настолько ленивы, что не читают работу, которую люди приложите много усилий и просто идите прямо к SO, чтобы задать вопрос, упомянутый в ссылке, которую они упоминают. – user18490

ответ

1

http://scratchapixel.com/lessons/3d-basic-rendering/3d-viewing-pinhole-camera

Если вы сделали еще некоторое исследование на этом сайте, вы бы нашли ответ. Весь смысл этого сайта - объяснить эту технику. Просто приложите усилия, прежде чем ожидать, что кто-либо из вас ответит за вас. Ваш вопрос должен быть сильно проголосован. Это чистая ленивость.

-1

Я рекомендую вам следовать этой ссылке: https://www.opengl.org/wiki/Compute_eye_space_from_window_space

Вашего й диапазон в экране [0 координатах, WindowWidth]. В первой строке вы вычисляете его в нормализованных устройствах (NDC), которые находятся в диапазоне [-1,1].

x_NDC = (x_Screen *2/WindowWidth) - 1; 

Вы можете проверить это, установив x_Screen на Maximum (WindowWidth) и Minimum (0). Вы получаете 1 и -1. То же самое для y Координата:

y_NDC = (y_Screen *2/WindowHeight) - 1; 

Ваш диапазон z [Ближний, Дальний].

z_NDC = (z_Screen - Near)/(Far - Near); // Here you have it scaled to [0,1] 
z_NDC = 2*NDC -1 //Scaled to [-1,1]; 

После вы получили ваши COORDS NDC, просто умножьте его с обратной матрицы проекции и обратного ModelView Matrix, чтобы получить мировые COORDS.

+0

В вашем объяснении нет никакой ценности. – user18490

Смежные вопросы