Frozen_Light писал(а):
Эмм... интересно, какой порядок точности ты задал?
Ну даблы, вообще-то...
Но не в этом дело! Прикинь хоть навскидку количество операций, необходимое для вычисления детерминанта матрицы 15-го порядка.
smt005 писал(а):
Так там твои шейдеры, забил уже на них ?
Я в тенях завяз же! А встроенный функционал ОпенГЛ я уже не юзаю вапще - всё только шейдерами. Под любой плевок свой шейдер.
smt005 писал(а):
Очень интересно, но нифига не понятно!
Обана! Ну чё тут непонятного - уравнения плоскости в средней школе не проходили разве?
Имеет такой вид:
A*x+B*y+C*z+D=0;
Все точки {x,y,z}, что при подставлении в это уравнение дают требуемый ноль, лежат в плоскости, этим уравнением описываемой. Чтобы составить уравнение плоскости, нужно знать нормаль к ней (вектор n) и какую-нибудь точку, которая лежит в этой плоскости (точка p):
A = nx;
B = ny;
C = nz;
D = -nx*px - ny*py - nz*pz;
Вот так можно составить уравнение любой плоскости - нормаль определяет ориентацию плоскости в пространстве, а точка устанавливает положение.
При подставлении координат абстрактной точки в готовое уравнение плоскости получается некоторое число. Оно является расстоянием от точки до плоскости (если нормаль к плоскости имеет единичную длину). Напомню, нормаль к плоскости - это {A,B,C}.
Ну так вот матрица трансформации 4х4 представляет собой просто сборку из четырёх плоскостей: каждый ряд матрицы - это отдельное уравнение плоскости. Первый ряд (горизонтальный ряд, НЕ столбец) - это уравнение плоскости, перпендикулярной оси Ох. Второй ряд матрицы - это уравнение плоскости, перпендикулярной оси Oy. И так далее. Три первых плоскости пересекаются в некоторой точке, являющейся центром координат - это единственная точка, принадлежащая всем трём плоскостям.
Как известно, трансформация вершины с помощью матрицы происходит путём умножения строк матрицы на столбец-вектор. Выходит, что координата x' получается подставлением координат вершины в уравнение первой плоскости, координа y' - это расстояние от вершины до второй плоскости (второй ряд матрицы) и т.д. Всё ведь так очевидно, оказывается!
Ну а теперь практическая задача. Допустим, тебе нужно составить матрицу трансформации, и ты знаешь направление взгляда наблюдателя (вектор f), направление макушки (вектор u), направление "вправо" (вектор r) а также точку, где наблюдатель находится. Разумеется, все три вектора единичной длины и перпендикулярны друг другу. Знач, задача проста: составить уравнения четырёх плоскостей (трёх) и записать их в виде матрицы. Поехали!
Первая плоскость перпендикулярна оси Ох. Ось Ох - это направление "вправо". Строим уравнение этой плоскости (плоскость "1"):
A1 = rx;
B1 = ry;
C1 = rz;
D1 = -rx*px - ry*py - rz*pz;
Готово! Полученное уравнение плоскости (числа A1,B1,C1,D1) - это первый ряд матрицы.
Вторая плоскость перпендикулярна оси Оу. Ось Оу - это направление макушки наблюдателя. Строим уравнение этой плоскости (плоскость "2"):
A2 = ux;
B2 = uy;
C2 = uz;
D2 = -ux*px - uy*py - uz*pz;
Только что мы вычислили второй ряд матрицы.
С третьим рядом нужно быть осторожным - это плоскость, перпендикулярная оси Oz, и, как известно, у ОпенГЛ с этой осью путаница из-за того, что за начало координат взят левый нижний угол экрана, а не верхний, как в Директе, а ось Oz всё так же смотрит вглубь экрана. Короче говоря, направление взгляда наблюдателя нужно инверсировать:
F = {-fx,-fy,-fz}
Вот, теперь можно составить уравнение плоскости номер 3 - плоскости, перпендикулярной оси Oz:
A3 = Fx;
B3 = Fy;
C3 = Fz;
D3 = -Fx*px - Fy*py - Fz*pz;
Вот и третий ряд матрицы готов!
Четвёртый ряд - это плосксть, перпендикулярная волшебной оси Ow. Расстояние до этой плоскости (четвёртая псевдо-координата, w') используется для масштабирования расстояний до трёх других плоскостей. Благодаря этому можно получить искажения, симулирующие перспективу. В модельновидовой матрице перспективных искажений нет. Посему требуется, чтобы расстояние от этой четвёртой плоскости всегда было равно 1, вне зависимости от положения трансформируемой вершины. Это делается так:
A4 = 0;
B4 = 0;
C4 = 0;
D4 = 1;
Разумеется, это уже не плоскость, а полная липа, именуемая "гиперплоскостью". Расстояние от неё до любой точки пространства одинаково и равно 1.
В общем, это четвёртый ряд матрицы.
Если глянуть на описание функции
gluLookAt, то видно полное соответствие результатов.