Форум: "Игры";
Текущий архив: 2009.08.30;
Скачать: [xml.tar.bz2];
ВнизОбратная матрица. Найти похожие ветки
← →
@!!ex_ (2007-06-12 20:14) [0]m_matrix - массив из 16 элементов, матрица 4х4.
glGetFloatv(GL_MODELVIEW_MATRIX, @M.m_matrix[0]);
MatrixInvert(M.m_matrix,M2.m_matrix);
vLight:=transform(vLight,M2);
Матрица так инвертится:function MatrixInvert(Const a: MatrixArray; Var q: MatrixArray): Boolean;
var
DetInv: Single;
begin
Result := False;
if (abs(a[15]) > 0.001) or
(abs(a[12]) > 0.001) or
(abs(a[13]) > 0.001) or
(abs(a[14]) > 0.001) then
Exit;
DetInv := 1 /( a[0] * ( a[5] * a[10] - a[9] * a[6] ) -
a[4] * ( a[1] * a[10] - a[9] * a[2] ) +
a[8] * ( a[1] * a[6] - a[5] * a[2] ) );
q[0] := DetInv * ( a[5] * a[10] - a[9] * a[6] );
q[4] := -DetInv * ( a[4] * a[10] - a[8] * a[6] );
q[8] := DetInv * ( a[4] * a[9] - a[8] * a[5] );
q[12] := 0;
q[1] := -DetInv * ( a[1] * a[10] - a[9] * a[2] );
q[5] := DetInv * ( a[0] * a[10] - a[8] * a[2] );
q[9] := -DetInv * ( a[0] * a[9] - a[8] * a[1] );
q[13] := 0;
q[2] := DetInv * ( a[1] * a[6] - a[5] * a[2] );
q[6] := -DetInv * ( a[0] * a[6] - a[4] * a[2] );
q[10] := DetInv * ( a[0] * a[5] - a[4] * a[1] );
q[14] := 0;
q[3] := -( a[3] * q[0] + a[7] * q[1] + a[11] * q[2] );
q[7] := -( a[3] * q[4] + a[7] * q[5] + a[11] * q[6] );
q[11] := -( a[3] * q[8] + a[7] * q[9] + a[11] * q[10] );
q[15] := 1;
Result := True;
end;
Получается косяк. Источник света уходит в неизветсном направлении, за пределы сцены.
← →
Sapersky (2007-06-12 20:50) [1]TMatrix = record
Case integer of
0 : (_11, _12, _13, _14: Single;
_21, _22, _23, _24: Single;
_31, _32, _33, _34: Single;
_41, _42, _43, _44: Single);
1 : (m : array [0..3, 0..3] of Single);
end;
DetInv := 1 /( a._11 * ( a._22 * a._33 - a._23 * a._32 ) -
a._12 * ( a._21 * a._33 - a._23 * a._31 ) +
a._13 * ( a._21 * a._32 - a._22 * a._31 ) );
Видно, что a._11, a._12, a._13 соответствуют a[0], a[1], a[2].
← →
@!!ex_ (2007-06-12 20:55) [2]> [1] Sapersky (12.06.07 20:50)
Действительно... Не понимаю как так получилось. Буду сидеть проверять, видать где то еще накосячил...
← →
@!!ex_ (2007-06-12 22:38) [3]Вот что получается.
Без преобразования координат источника:
http://afera-net.narod.ru/SV_notransform.JPG
Все предсказуемо. SV повернуты, но вроде корректные.
А вот с кодом приведенным выше. Вроде проверил, ошибок больше не нашел... Может переделать тип, как здесь... Не знаю. Но сейчас получается лажа:
http://afera-net.narod.ru/SV_bugtransform.JPG
← →
Sapersky (2007-06-13 13:44) [4]Проверил с примером из DX SDK - работает.
Может, в преобразовании координат источника света
vLight.x := Lx*m._11 + Ly*m._21 + Lz*m._31 + m._41;
vLight.y := Lx*m._12 + Ly*m._22 + Lz*m._32 + m._42;
vLight.z := Lx*m._13 + Ly*m._23 + Lz*m._33 + m._43;
тоже индексы перепутаны?
← →
@!!ex_ (2007-06-18 16:57) [5]> [4] Sapersky (13.06.07 13:44)
Неа. Это же умножение вектора на матрицу? Пользуюсь проверенной функцией для этого.
Страницы: 1 вся ветка
Форум: "Игры";
Текущий архив: 2009.08.30;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.005 c