ПрограммированиеФорумОбщее

Реализация gluUnProject

#0
16:48, 4 июля 2026

Доброго времени.
Дайте ссылку на проверенную реализацию gluUnProject.
Чтобы так же матрицы column-major
Чтобы 1 в 1 цифры совпадали для double

Или у кого глаз намётан, поможите, вот мой код:

function inverse( var dest:TDMat4; const src:TDMat4 ):boolean;
var
  r,c:byte;
  d:double;
begin
  d := det(src);
  if abs(d) < deps then
    exit(false);

  d := 1 / d;
  for r:=0 to 3 do
    for c:=0 to 3 do
      dest.col[c].v[r] := power( -1, r+c+2 )*det( src.mat3[r,c] )*d;

  Result := True;
end;

function unproject( const win:TDVec3; const model,proj:TDMat4; const port:TIVec4; var obj:TDVec3 ):Boolean;
var ndc:TDVec4;
    inv:TDMat4;
begin
  ndc.x := 2*(win.x-port.x) / port.z - 1;
  ndc.y := 2*(win.y-port.y) / port.w - 1;
  ndc.z := 2*win.z - 1;
  ndc.w := 1;

  if not inverse( inv, model*proj )then
    exit( false );

  ndc := inv*ndc;
  if abs( ndc.w ) < deps then
    exit( false );

  obj := ndc.xyz / ndc.w;
  Result := true;
end;
#1
21:39, 4 июля 2026

Всё нашёл!!!
dest.col[c].v[r] := power( -1, r+c+2 )*det( src.mat3[r,c] )*d;
поменял на
dest.col[c].v[r] := power( -1, r+c )*det( src.mat3[c,r] )*d;
И о чудо!

ПрограммированиеФорумОбщее