0

我需要定义一个 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
4

1 回答 1

0

3-D 转换概述

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

于 2015-12-08T18:27:44.320 回答