3D-координата 2D-точки по заданной камере и плоскости обзора - PullRequest
7 голосов
/ 29 марта 2010

Я хочу генерировать лучи от камеры через плоскость обзора.Чтобы сделать это, мне нужно положение моей камеры («глаз»), вверх, вправо и в направлении векторов (где направление - это вектор от камеры в направлении объекта, на который смотрит камера) и P,точка на смотровой плоскости.Как только я получу их, луч, который будет сгенерирован:

ray = camera_eye + t*(P-camera_eye);

, где t - расстояние вдоль луча (пока предположим, что t = 1).

Мой вопрос: как мнеполучить трехмерные координаты точки P, учитывая, что она расположена в положении (i, j) на плоскости обзора?Предположим, что заданы верхний левый и нижний правые углы плоскости обзора.

ПРИМЕЧАНИЕ. На самом деле плоскость просмотра не является плоскостью в том смысле, что она не распространяется бесконечно во всех направлениях.Скорее, можно думать об этой плоскости как о ширине и высоте изображения.В направлении х диапазон составляет 0 -> ширина, а в направлении у - 0 -> высота.Я хочу найти трехмерную координату (i, j) -го элемента, 0

Ответы [ 3 ]

2 голосов
/ 29 марта 2010

Общее решение раздела линии и плоскости см. http://local.wasp.uwa.edu.au/~pbourke/geometry/planeline/

В вашей конкретной графической библиотеке (OpenGL / DirectcX и т. Д.) Может быть стандартный способ сделать это

edit:Вы пытаетесь найти трехмерное пересечение точки экрана (например, курсора мыши) с 3D-объектом в вашей сцене?

0 голосов
/ 01 апреля 2010

Когда я непосредственно подключил предложенные формулы к своей программе, я не получил правильных результатов (возможно, потребовалась некоторая отладка). Моя первоначальная проблема заключалась в неправильном понимании (x, y, z) координат интерполирующих угловых точек. Я рассматривал x, y, z-координаты отдельно, где я не должен (и это может быть специфичным для приложения, поскольку камера может быть ориентирована в любом направлении) Вместо этого решением оказалась простая интерполяция угловых точек плоскости обзора:

  • интерполировать нижние угловые точки в направлении i, чтобы получить P1
  • интерполировать верхние угловые точки в направлении i, чтобы получить P2
  • интерполировать P1 и P2 в направлении j, чтобы получить мировые координаты конечной точки
0 голосов
/ 29 марта 2010

Чтобы определить P, вам нужно расстояние от камеры до ближней плоскости отсечения (экрана), размер окна в ближней плоскости отсечения (или угол обзора, вы можете определить размер окна из угол обзора) и размер визуализируемого окна.

  1. Масштабирование положения экрана до диапазона -1
  2. Масштаб нормализован х, у по размеру окна просмотра
  3. Масштабирование по правому и верхнему векторам камеры и суммирование результатов
  4. Добавьте вектор, масштабированный по расстоянию отсечения

В результате вы получите:

p = at * near_clip_dist + x * right + y * up

где х и у:

x = (screen_x - screen_centre_x) / (width / 2) * view_width
y = (screen_y - screen_centre_y) / (height / 2) * view_height
...