Одноточечная перспектива и точка с отрицательной глубиной - PullRequest
0 голосов
/ 12 июня 2019

Я пытаюсь создать игру, используя одноточечную перспективу. Все хорошо работает для точек в пределах вида, но с отрицательной глубиной идет не так. Я понимаю перспективу, показанную на следующем рисунке ( источник ).

enter image description here

В общем, я взял точку на некотором расстоянии от левого правого вертикального края рамки вдоль нижней горизонтальной линии (в данном случае 5 точек), соединил ее с точкой O '(линия H'O' ) и где линия пересекает вертикальную линию (в точке H ') - это линия глубины (в данном случае 5). Это хорошо работает даже для отрицательной глубины (так как линия H'O 'пересекает вертикальную линию ниже точки обзора). Однако, если глубина больше, чем расстояние O '(это означает, что точка будет справа от O'), линия переворачивается, а H 'заканчивается сверху точки обзора (хотя она должна заканчиваться ниже) .

Как мне исправить это, чтобы точка с отрицательной глубиной была правильно преобразована (среднее из трехмерного пространства в двумерное пространство)?


EDIT Это изображение, вероятно, лучше.

enter image description here

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

enter image description here

1 Ответ

0 голосов
/ 13 июня 2019

Точки справа от точки O 'вдоль линии, определяемой нижним краем рамки, соответствуют точкам, которые находятся позади наблюдателя, поэтому технически наблюдатель не может их видеть.Чтобы увидеть точки позади вас, это означает, что вам нужно развернуться, поэтому вам нужно изменить положение экрана.Нарисуйте копию рамки черного квадрата справа от точки O ', чтобы новый квадрат был зеркально симметричным изображением исходного квадрата рамки относительно линии, ортогональной линии горизонта и проходящей через точку O'.

Редактировать: Точки с отрицательной глубиной справа от точки O '(т. Е. Точка позади наблюдателя) предполагается отображать выше синей горизонтальной линии ,Это правильный путь.

Я предполагаю, что ваша система координат в трех измерениях берет свое начало в нижнем правом углу квадратной рамки на вашем изображении.Ось x (я думаю, как вы измеряете ширину) проходит вдоль нижнего горизонтального края кадра, а ось y (то, что вы называете высотой) - вдоль правого вертикального края кадра.Ось глубины находится в трех измерениях и перпендикулярна плоскости квадратной рамки (поэтому она параллельна земле).Начинается с нижнего правого угла квадрата рамки.Предположим, что расстояние от точки O 'до правого вертикального края квадрата равно S, а координаты точки C равны {C1, C2} (C1 - это расстояние от точки C до правого вертикального края, а C2 - эторасстояние C от нижнего горизонтального края квадрата).

Учитывая координаты {w, h, d} (w - ширина, h - высота, d - глубина) точки в трех измерениях, ее представление на двухмерном квадратном экране задается формулами:

x = (S*w + C1*d)/(S+d)
y = (S*h + C2*d)/(S+d)

Таким образом, точки, которые вы привели в качестве примера в комментариях: P1 = {h = 5, w = 5, d = 5} и P2 = {h = 5, w = 5, d = -10} Их представление на экране:

P1_screen = {(S*5 + C1*5)/(S+5), (S*5 + C2*5)/(S+5)}
P2_screen = {(S*5 - C1*10)/(S-10), (S*5 - C2*10)/(S-10)}

независимо от ваших параметров S, C1 and C2.Представление (бесконечной) линии, соединяющей точки P1 и P2, представляется на экране в виде (бесконечной) линии, соединяющей точки P1_screen и P2_screen.Однако, если вы хотите, чтобы 2D-представление видимой части сегмента , соединяющего P1 и P2, необходимо провести (бесконечную) линию между P1_screen и P2_screen и исключить следующие два сегмента: сегмент [P1_screen, P2_screen] и сегмент from P2_screen along the line up towards the upper top edge.Вы должны нарисовать на экране только отрезок от бесконечной линии, соединяющей P1_screen и P2_screen, которая начинается от P1_Screen и идет вниз к нижнему горизонтальному краю экрана.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...