- // ensures that rotation axii in a matrix are orthogonal and have unit length
- procedure MatrixOrtho(var M: TMatrix);
- var
- xa,
- ya : TVec;
- begin
- xa := VectorCross(TVec(Addr(M.c20)^), TVec(Addr(M.c10)^));
- ya := VectorCross(TVec(Addr(M.c00)^), TVec(Addr(M.c20)^));
- if (xa.x*M.c00 + xa.y*M.c01 + xa.z*M.c02) < 0.0 then begin
- xa.x := - xa.x;
- xa.y := - xa.y;
- xa.z := - xa.z;
- end;
- if (ya.x*M.c10 + ya.y*M.c11 + ya.z*M.c12) < 0.0 then begin
- ya.x := - ya.x;
- ya.y := - ya.y;
- ya.z := - ya.z;
- end;
- M.c00 := xa.x;
- M.c01 := xa.y;
- M.c02 := xa.z;
- M.c10 := ya.x;
- M.c11 := ya.y;
- M.c12 := ya.z;
- VectorNormalize(TVec(Addr(M.c00)^));
- VectorNormalize(TVec(Addr(M.c10)^));
- VectorNormalize(TVec(Addr(M.c20)^));
- end;