2013-09-08 4 views
1

Я пытаюсь работать в LWJGL, чтобы отобразить простой квадратик с использованием собственных матриц. Я смотрел вокруг на некоторое время и нашел несколько реализаций в перспективе матрицы, эти два, в частности:Конвейер рендеринга OpenGL: Перспективная матрица

[cot(fov/2)/a 0   0     0] 
[0   cot(fov/2) 0     0] 
[0   0   -f/(f-n)   -1] 
[0   0   -f*n/(f-n)   0] 

и:

[cot(fov/2)/a 0   0      0] 
[0   cot(fov/2) 0      0] 
[0   0   -(f+n)/(f-n)   -1] 
[0   0   -(2*f*n)/(f-n)   0] 

Оба они обеспечивают тот же эффект, как и ожидалось (GOT их от here и here, соответственно). Проблема заключается в моем понимании того, как умножить это на матрицу модели, затем на вершину, а затем делить каждое значение x, y и z на его значение w дает координату экрана. Более конкретно, если я умножу любую из них на матрицу модели, то по вершине (10, 10, 0, 1) она дает w = 0. Это само по себе является большим ударом в лицо. Я заключу, что либо матрицы ошибаются, либо я чего-то не хватает. В моей реальной тестовой программе вершины даже не заканчиваются на экране, даже если положение камеры (0,0,0) и без вращения сделает это так. Я даже пробовал много разных значений z, положительных и отрицательных, чтобы убедиться, что это просто плоскость отсечения. Я что-то упустил?

EDIT: После большой проверки я сузил проблему, с которой я столкнулся. Самая большая проблема заключается в том, что ось z не отображается повторно в диапазон, который я указываю (от n до f). Любой объект просто немного увеличивает или уменьшает масштаб, когда я переводю его вдоль оси z, а затем выскакивает из существования, когда он перемещается за пределы диапазона [-1, 1]. Я думаю, что это еще больше смущает меня. Я установил свой дальний самолет до 100, а мой приблизился к 0,1, и он ведет себя не что иное, как.

+0

Я уже умножать в том порядке, в моей вершинных шейдеров.Спасибо за предложение. – CoderTheTyler

ответ

1

Оба они обеспечивают тот же эффект, как и ожидалось

В то время как вторая форма проекции матрицы является очень стандартной, первым из них дает другой эффект. Если у вас есть z==1 и w==0 проекция будет:

Матрица 1: -f/(f-n)/-f*n/(f-n) = f/f*n = 1/n

Матрица 2: -(f+n)/(f-n)/-(2*f*n)/(f-n) = (f+n)/(2*f2n)

Результат явно отличается. Вы всегда должны использовать вторую форму.

если умножить любой из них на видовую матрицу затем вершины (10, 10, 0, 1), он дает ш = 0. Это сам по себе является большим вкусом в лица

Для фокусного расстояния d проекции вычисляются как (без учета соотношения сторон):

x'= d*x/z = x/w 
y'= d*y/z = y/w 

где

w = z/d 

, если вы имеют z==0, это означает, что вы хотите проецировать точку, которая уже находится в глазу, и видны только точки за пределами d. На практике эта точка будет обрезана, так как z не находится в пределах диапазона n (рядом) и f (пока) (n, как ожидается, как положительная константа)

+0

Спасибо за разъяснение по этому вопросу, но это все еще не решает всей проблемы. Я немного добавлю к вопросу, чтобы уточнить – CoderTheTyler

+0

ближние и дальние плоскости находятся в пространстве камеры. «z» между ближним/дальним будет находиться в диапазоне [-1,1] после преобразования перспективы и проекции (w-деление). 'z' вне этого диапазона будет обрезано –

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