Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.08.30;
Скачать: CL | DM;

Вниз

Обратная матрица.   Найти похожие ветки 

 
@!!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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.016 c
2-1246303725
Dm
2009-06-29 23:28
2009.08.30
Ctrl+Tab, эмуляция в чужом окне.


4-1215885177
Тын-Дын
2008-07-12 21:52
2009.08.30
Определить активного пользователя windows?


1-1213076858
Альф
2008-06-10 09:47
2009.08.30
Странное поведение Variant при импорте из Excel


3-1226395215
GRAND
2008-11-11 12:20
2009.08.30
cxGrid6 - Access Violation


2-1246349487
a.a.j.
2009-06-30 12:11
2009.08.30
Загрузить html из файла в WB и обновить данные с сервера