Отменить масштабное преобразование камеры в Viewport3D
У меня есть основной Viewport3D
с mCamera
, который контролируется TrackballDecorator
, Что я хочу, это создать еще один Viewport3D
с кубом, представляющим текущее направление камеры в главном окне просмотра.
Этот код:
Matrix3D TransformationMatrix = mCamera.Transform.Value;
// ?
OrientationCamera.Transform = new MatrixTransform3D(TransformationMatrix);
работает хорошо, кроме того, что я не хочу OrientationCamera
применить масштаб в качестве основного (я хочу, чтобы он просто вращался).
Я вижу, что только значения M11
, M22
, M33
матрицы меняются при работе с масштабированием с помощью основной камеры, но они также меняются, когда я поворачиваю ее, и любые изменения, которые я пытаюсь применить к тем, привели к тому, что мой куб предварительного просмотра неожиданно трансформировался.
Кто-нибудь есть идеи, как отказаться от ScaleTransform
из матрицы преобразования? Или, может быть, есть другой способ сделать это?
1 ответ
Первые три строки (или столбцы) в чистой матрице вращения являются единичными векторами. Если вы примените масштаб, эти векторы больше не будут иметь длину единицы. Вы можете применить обратную шкалу, чтобы избавиться от шкалы. Предполагая, что масштаб равен во всех трех направлениях:
var m11 = TransformationMatrix.M11;
var m12 = TransformationMatrix.M12;
var m13 = TransformationMatrix.M13;
var length = Math.Sqrt(m11 * m11 + m12 * m12 + m13 * m13);
var factor = 1 / length;
TransformationMatrix.Scale(new Vector3D(factor, factor, factor));