Я хочу генерировать лучи от камеры до плоскости просмотра. Чтобы сделать это, мне нужно мое положение камеры ("глаз"), право, и к векторам (где к вектор от камеры в направлении объекта, что камера выглядит на), и P, точка на плоскости просмотра. После того как у меня есть они, луч, это сгенерировано:
ray = camera_eye + t*(P-camera_eye);
где t является расстоянием вдоль луча (примите t = 1 на данный момент).
Мой вопрос, как я получаю 3D координаты точки P, учитывая, что это расположено в положении (я, j) на плоскости просмотра? Предположите, что левые верхние углы и правые нижние углы плоскости просмотра даны.
Примечание: Плоскость просмотра не является на самом деле плоскостью в том смысле, что она не расширяется бесконечно во всех направлениях. Скорее можно думать об этой плоскости как об изображении widthxheight. В направлении X диапазон 0-> ширина, и в направлении Y диапазон 0-> высота. Я хочу найти 3D координату (я, j) th элемент, 0
Когда я напрямую подключал предложенные формулы в свою программу, я не получал правильных результатов (возможно, нужно было выполнить некоторую отладку). Моя первоначальная проблема, по-видимому, заключалась в неправильном понимании координат (x,y,z) интерполирующих угловых точек. Я рассматривал координаты x,y,z отдельно, где не должен (и это может быть специфично для приложения, так как камера может быть ориентирована в любом направлении). Вместо этого решением оказалась простая интерполяция угловых точек плоскости просмотра:
Общее решение внутреннего сечения прямой и плоскости см. http://local.wasp.uwa.edu.au/~pbourke/geometry/planeline/
Ваша конкретная графическая библиотека (OpenGL / DirectcX и т. Д.) Может иметь стандартный способ сделать это
правка: вы пытаетесь найти трехмерное пересечение точки экрана (например, курсора мыши) с трехмерным объектом в вашей сцене. ?
Чтобы вычислить P, вам нужно расстояние от камеры до ближней плоскости обрезания (экрана), размер окна на ближней плоскости обрезания (или угол обзора, вы можете вычислить размер окна по углу обзора) и размер отрисованного окна.
В итоге получаем:
p = at * near_clip_dist + x * right + y * up
где x и y:
x = (screen_x - screen_centre_x) / (width / 2) * view_width
y = (screen_y - screen_centre_y) / (height / 2) * view_height