FME 的3D转换器介绍(一)

时间:2024-03-15 18:51:56

原文发布时间:2010-06-25

作者:毛毛虫

下面对FME的3D操作的主要转换器介绍一下。

这篇文章主要说一下3DAffiner转换器。 

对要素执行3D仿射转换。

这个转换改变了x、y值,转换公式如下:

x' = Ax + By + Cz + D

y' = Ex + Fy + Gz + H

z' = Ix + Jy + Kz + L

系数<A>, <F> 和 <K> m必须非零。

该转换器属性如下

    FME 的3D转换器介绍(一)

首先说明一下这个公式:

仿射变换可以理解为

(1)对坐标进行放缩,旋转,平移后取得新坐标的值。

(2)经过对坐标轴的放缩,旋转,平移后原坐标在在新坐标领域中的值。

你可以使用一个4×4的矩阵将任何点变换到另一个点。用一个矩阵对点(x, y, z)进行变化,产生了一个新的点(x', y', z'):

    FME 的3D转换器介绍(一)

对点(x, y, z)进行一下运算,会得到一个新点(x', y', z'):

    FME 的3D转换器介绍(一)

这就是上面公式的由来。

如何设置公式中的12个参数呢?

最常用的变换包括:平移(translation),旋转(rotation)和缩放(scaling)。我们可以将这些变换合并起来,组成一个矩阵,同时进行几种变换。

    矩阵以行列号的形式来描述,矩阵如下所示:

    FME 的3D转换器介绍(一)

    

1、平移

  下面的变化将一个点(x, y, z)平移到另一个点(x', y', z'):

    FME 的3D转换器介绍(一)

上式变化对x-, y-, 和z-方向上分别平移了Tx、Ty、Tz。

这里我们用的变化都是在左手坐标下进行的,它可能与你在其它地方所见的有一些不同。要了解详细的内容,见“三维坐标系统”部分。

  下面的变换将一个点(x, y, z)沿x-轴进行旋转,得到了一个新的点(x', y', z'):

        下面的变化沿y-轴进行旋转:

    FME 的3D转换器介绍(一)

    下面的变换沿z-轴进行旋转:

    FME 的3D转换器介绍(一)

    这里要注意一点,希腊字母θ代表旋转的角度,用弧度来表示。从旋转轴向原点看,这个角度按顺时针方向来度量。

    缩放

  下面的变换在x-, y-, 和z-方向选择任意的值对点(x, y, z)进行缩放,得到一个新的点(x', y', z'):

FME 的3D转换器介绍(一)

在x-, y-, 和z-方向上分别进行了以系数为Sx、Sy、Sz的缩放。

对这些公式的理解大家可以参考相关的文章,再次不在累述。

我在使用这个转换器时,遇到一些问题,转换后在Viewer中查看属性时,显示的坐标并非转换后的坐标,而是转换前的坐标与使用的转换矩阵。

 

该转换器不能应用于2D图层,否则会报错:

3DAffiner: Cannot perform 3D Affine transformations on 2D feature

 

下面就这个转换器的应用举一个例子:

有一个3D图层,使用公式设置3Daffiner转换器:

x' = x

y' = y + 0.5z

z' =-0.5y + z

转换为矩阵后,分别为:

       |1 0    0   0|

      |0 1    0.5 0|

      |0 -0.5 1   0|

      |0 0    0   1|

对照上面转换器公式介绍,知道该矩阵表示立体几何沿x轴顺时针旋转了30°,转换后的图形为:

FME 的3D转换器介绍(一)

使用公式设置3Daffiner转换器:

x' = x + 0.5z

y' = y + 0.5z

z' =-0.5x + z

即转换矩阵为:

      |1     0    0.5  0|

      |0     1    0.5  0|

      |-0.5 0    1    0|

      |0     0    0    1|

对照上式转换器公式介绍,知道该矩阵表示立体几何沿y轴顺时针旋转了30°,转换后的图形为:

还有一个问题需要注意,就是转换后在Viewer中查看的坐标问题。

例如,转换之前某个要素的几何属性如下:

Bounding Cube:

 Lower Left:   (489678.1057224,5459351.0762331)

 Upper Right:  (489698.3952505,5459351.0762331)

 Z Range: 0.0 to 10.0

 

Geometry Type: IFMECompositeSurface

Sidedness: `1-sided'

   Front Appearance Reference: `<no_appearance>'

Number of Surfaces: 1

--------------------------------------

Surface Number: 0

   Geometry Type: IFMEFace

   Sidedness: `1-sided'

      Front Appearance Reference: `<no_appearance>'

   Area:

      Geometry Type: IFMEPolygon

      Boundary:

         Geometry Type: IFMELine

         Number of Coordinates: 5 -- Coordinate Dimension: 3

         0: (489698.395250503,5459351.0762331,0)

         1: (489678.105722396,5459351.0762331,0)

         2: (489678.105722396,5459351.0762331,10)

         3: (489698.395250503,5459351.0762331,10)

         4: (489698.395250503,5459351.0762331,0)

使用公式

x' = x

y' = y + 0.5z

z' =-0.5y + z

对转换器3DAffiner进行了设置后,转换后该要素的几何属性如下:

Bounding Cube:

 Lower Left:   (489678.1057224,5459351.0762331)

 Upper Right:  (489698.3952505,5459356.0762331)

 Z Range: -2729675.5381166 to -2729665.5381166

 

Geometry Type: IFMECompositeSurface

Sidedness: `1-sided'

   Front Appearance Reference: `<no_appearance>'

Number of Surfaces: 1

--------------------------------------

Surface Number: 0

   Geometry Type: IFMEFace

   Sidedness: `1-sided'

      Front Appearance Reference: `<no_appearance>'

   Area:

      Geometry Type: IFMEPolygon

      Boundary:

         Geometry Type: IFMELine

         Number of Coordinates: 5 -- Coordinate Dimension: 3

         0: (489698.395250503,5459351.0762331,0)

         1: (489678.105722396,5459351.0762331,0)

         2: (489678.105722396,5459351.0762331,10)

         3: (489698.395250503,5459351.0762331,10)

         4: (489698.395250503,5459351.0762331,0)

   Transformation Matrix:

      |1 0    0   0|

      |0 1    0.5 0|

      |0 -0.5 1   0|

      |0 0    0   1|

比较之后发现,两个数据的几何属性完全相同,只是转换后的几何属性后面多了转换矩阵:

  Transformation Matrix:

      |1 0    0   0|

      |0 1    0.5 0|

      |0 -0.5 1   0|

      |0 0    0   1|