Transform3D.Transform方法在WPF中意外输出

本文关键字:意外 输出 WPF Transform 方法 Transform3D | 更新日期: 2023-09-27 18:26:12

我需要定义一个3D变换,并将其应用于点p={1000,0,0}。

例如,假设需要围绕z轴应用Pi/2旋转。我使用MatrixTransform3D定义了转换。来自以下代码:

预期输出:trPoint={0,1000,0}

实际输出:trPoint={0,-1000,0}。

问题:也许Transform3D.Transform方法应用逆变换?

    private void testTransformationMat() {
        Point3D p = new Point3D(1000, 0, 0);
        double angle = System.Math.PI / 2;
        double cos = System.Math.Cos(angle);
        double sin = System.Math.Sin(angle);
        Matrix3D mat_z = new Matrix3D(cos, -sin, 0, 0,sin, cos, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
        Transform3D tr = new MatrixTransform3D(mat_z);
        Point3D trPoint = tr.Transform(p);
        Debug.WriteLine(trPoint);
    }

编辑:为了弄清楚,据我所知,齐次变换是将4x4矩阵乘以4x1向量。对于绕z轴旋转+45度,根据右手惯例,我们得到:

0.707 -0.707 0 0         1000        707
0.707 0.707 0 0     X    0       =   707
0 0 1 0                  0           0
0 0 0 1                  1           0

如果我们反转矩阵,乘法返回一个负y分量,该分量与Z周围+45度的旋转不相干。

0.707 0.707 0 0         1000        707
-0.707 0.707 0 0     X    0       =  -707
0 0 1 0                  0           0
0 0 0 1                  1           0

Transform3D.Transform方法在WPF中意外输出

来自3D转换概述

注意:Windows Presentation Foundation(WPF)3-D是右手系统,这意味着旋转的角度值为正值绕轴线逆时针旋转。