-
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;
Получается косяк. Источник света уходит в неизветсном направлении, за пределы сцены.
-
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].
-
> [1] Sapersky (12.06.07 20:50)
Действительно... Не понимаю как так получилось. Буду сидеть проверять, видать где то еще накосячил...
-
-
Проверил с примером из 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; тоже индексы перепутаны?
-
> [4] Sapersky (13.06.07 13:44)
Неа. Это же умножение вектора на матрицу? Пользуюсь проверенной функцией для этого.
|