Доброго времени.
Дайте ссылку на проверенную реализацию 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;Всё нашёл!!!
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;
И о чудо!