原文发布时间: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必须非零。
该转换器属性如下
首先说明一下这个公式:
仿射变换可以理解为
(1)对坐标进行放缩,旋转,平移后取得新坐标的值。
(2)经过对坐标轴的放缩,旋转,平移后原坐标在在新坐标领域中的值。
你可以使用一个4×4的矩阵将任何点变换到另一个点。用一个矩阵对点(x, y, z)进行变化,产生了一个新的点(x', y', z'):
对点(x, y, z)进行一下运算,会得到一个新点(x', y', z'):
这就是上面公式的由来。
如何设置公式中的12个参数呢?
最常用的变换包括:平移(translation),旋转(rotation)和缩放(scaling)。我们可以将这些变换合并起来,组成一个矩阵,同时进行几种变换。
矩阵以行列号的形式来描述,矩阵如下所示:
1、平移
下面的变化将一个点(x, y, z)平移到另一个点(x', y', z'):
上式变化对x-, y-, 和z-方向上分别平移了Tx、Ty、Tz。
这里我们用的变化都是在左手坐标下进行的,它可能与你在其它地方所见的有一些不同。要了解详细的内容,见“三维坐标系统”部分。
下面的变换将一个点(x, y, z)沿x-轴进行旋转,得到了一个新的点(x', y', z'):
下面的变化沿y-轴进行旋转:
下面的变换沿z-轴进行旋转:
这里要注意一点,希腊字母θ代表旋转的角度,用弧度来表示。从旋转轴向原点看,这个角度按顺时针方向来度量。
缩放
下面的变换在x-, y-, 和z-方向选择任意的值对点(x, y, z)进行缩放,得到一个新的点(x', y', z'):
在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 -0.5 1 0|
|0 0 0 1|
对照上面转换器公式介绍,知道该矩阵表示立体几何沿x轴顺时针旋转了30°,转换后的图形为:
使用公式设置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)
|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|