2012-03-10 2 views
0

Я попытался понять математику за матрицей проекции, и я нашел this page. Матрица с этой страницы:Матрица проектирования

Matrix

Я нашел эту матрицу похожа на матрицу XNA.

Я понял, как они добрались до столбцов m33 и m44 матрицы, но как они добрались до m11 и m22? И я не понял, почему мне нужно дать соотношение сторон, если я уже даю поле зрения.

Последнее, что я хочу знать: что такое уравнение для переноса из пространства ndc в пространство окна и как они доходят до этого уравнения?

+0

Ссылка изображения матрицы проекции такова: http://medialab.di.unipi.it/web/IUM/Waterloo/img284.gif –

+0

Этот ответ может помочь? http://stackoverflow.com/questions/28286057/trying-to-understand-the-math-behind-the-perspective-matrix-in-webgl/28301213#28301213 – gman

ответ

0

FOV было бы достаточно, если бы экраны были круглыми ... но они прямоугольные, поэтому недостаточно FOV. FOV задается для экрана, а другой - в поле FOV, когда отношение ширины экрана к высоте.

m11 может быть хотя бы способом масштабирования FOV в направлении ширины. m22 можно рассматривать как способ масштабирования FOV в направлении высоты.

+0

Спасибо за быстрый ответ, но масштаб до окна подходит (xndc + 1) * width * 0.5 + x ywin = (yndc + 1) * height * 0.5 + y ' –

+0

нет, если вы перетаскиваете окно в окно и умножаете каждое x, y на это уравнение: Этот код похож на то, что вы использовали бы для преобразования компонента позиции (от -1 до +1 пробела, вывода WVP после рассмотрения FOV) в положение экрана в зависимости от размеров экрана, а также обеспечивает трансляционный сдвиг для размещения ссылки на начало в верхнем левом углу. Это не имеет ничего общего с различием FOV в направлениях X и Y. Как правило, этот расчет, который вы только что показали, выполняется для вас в конвейере графического процессора между шейдером вершин и пиксельным шейдером, поскольку ваше графическое устройство знает ваши размеры видовых экранов. Вы вручную определяете 2d позиции экрана трехмерных позиций? –

+0

Нет, я просто пытаюсь понять, как работает «матрица проекции». Когда мы что-то понимаем, тем легче работать. мой вопрос в том, почему мне нужно масштабировать x, если это уже было сделано, когда мы преобразуемся в положение экрана. –

0

Вы можете изменить поле зрения, просто масштабируя результирующие координаты x и y: вы масштабируете их, вы получите меньшее поле обзора (увеличение), вы уменьшите масштаб изображения, вы получите больше поля просмотр (уменьшение). Перспективная проекция, используемая в 3D-программном обеспечении, является прямолинейной, поэтому, если ваше поле зрения достаточно велико, искажение по краям будет серьезным, и вы не можете иметь поле зрения более 180 °.

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

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