Конференция "Игры" » Обратная матрица.
 
  • @!!ex_ (12.06.07 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 (12.06.07 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_ (12.06.07 20:55) [2]
    > [1] Sapersky   (12.06.07 20:50)

    Действительно... Не понимаю как так получилось. Буду сидеть проверять, видать где то еще накосячил...
  • @!!ex_ (12.06.07 22:38) [3]
    Вот что получается.
    Без преобразования координат источника:
    http://afera-net.narod.ru/SV_notransform.JPG
    Все предсказуемо. SV повернуты, но вроде корректные.

    А вот с кодом приведенным выше. Вроде проверил, ошибок больше не нашел... Может переделать тип, как здесь... Не знаю. Но сейчас получается лажа:
    http://afera-net.narod.ru/SV_bugtransform.JPG
  • Sapersky (13.06.07 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_ (18.06.07 16:57) [5]
    > [4] Sapersky   (13.06.07 13:44)

    Неа. Это же умножение вектора на матрицу? Пользуюсь проверенной функцией для этого.
 
Конференция "Игры" » Обратная матрица.
Есть новые Нет новых   [134430   +4][b:0][p:0.002]