我有Viewport3D
主mCamera
,由TrackballDecorator
控制。我想要的是创建另一个Viewport3D
,其中只有一个立方体来表示主视口上的当前摄像机方向。
此代码:
Matrix3D TransformationMatrix = mCamera.Transform.Value;
// ?
OrientationCamera.Transform = new MatrixTransform3D(TransformationMatrix);
效果很好,除了我不希望OrientationCamera
将缩放应用为主要缩放(我希望它只是旋转)。
我可以看到,当使用主相机进行缩放操作时,矩阵的值M11
,M22
,M33
会发生变化,但是当我旋转它时它们也会发生变化,我尝试应用于那些更改导致我的预览多维数据集以一种意想不到的方式进行转换。
有没有人知道如何从转换矩阵中丢弃ScaleTransform
?或者也许有另一种方法可以做到这一点?
答案 0 :(得分: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));