Оно задается обратной матрицей к T, то есть такой матрицей T1, что [ 1 0 0 ] T * T1 = T1 * T = [ 0 1 0 ] [ 0 0 1 ]
Обратная матрица, вообще говоря, существует далеко не всегда, да и вычисление ее в общем случае - достаточно неприятная задача. Однако в данном случае из-за специального вида матрицы T (конкретнее, из-за того, что T - ортогональная матрица) она не только всегда существует, но и считается очень просто: [ qx*2/xSize rx*2/ySize px/dist ] [ qx1 rx1 px1 ] T = [ qy*2/xSize ry*2/ySize py/dist ] = [ qy1 ry1 py1 ] [ qz*2/xSize rz*2/ySize pz/dist ] [ qz1 rz1 pz1 ] [ qx1/lq qy1/lq qz1/lq ] T1 = [ rx1/lr ry1/lr rz1/lr ] [ px1/lp py1/lp pz1/lp ]
где
lp = px1*px1 + py1*py1 + pz1*pz1
lq = qx1*qx1 + qy1*qy1 + qz1*qz1
lr = rx1*rx1 + ry1*ry1 + rz1*rz1
Сделав сначала параллельный перенос, совмещающий s и Ss, а потом полученное преобразование, как раз и получим преобразование, переводящее произвольную камеру в стандартную.
Теперь надо выяснить, как, собственно посчитать координаты p, q, r через имеющиеся у нас характеристики: положение, направление, угол зрения и угол поворота. 3D Studio (и мы вслед за ней) рассчитывает эти вектора по такому алгоритму:
1. Считаем p = target - location
2. Если p.x == 0 и p.z == 0, то q = (0, 0, 1); иначе q = (p.z, 0, -p.x)
3. Считаем r = crossProduct(p, q) - векторное произведение p на q
4. Считаем lp = length(p) - длина p
5.