在Sketchup中,move工具使用的非常广泛,,可以移动、拉伸和复制几何体,也可以用来旋转组件。举一个简单地例子。
我们要做一个建筑物的尖顶,如下图所示,就是使用move工具实现的。
接下来我们就要学习如何使用ruby实现这样的功能。
实体类(Entities)提供了transform_entities方法来实现move的功能,transform_entities需要两个参数,一个或一系列实体对象和一个变换对象(Transformation)。
例如,上图中屋顶中间的线我们叫做roof_line,下面的代码实现把这条线沿着Z轴网上移动5个单位(英寸)。
ents = Sketchup.active_model.entities
tr = Geom::Transformation.translation [0, 0, 5]
ents.transform_entities tr, roof_line
在第二行,前缀“Geom::”是必须的,这是因为Transformation类包含于Geom模型,这在接下来的章节中会介绍它是如何使用的。在这个例子中,tr是一个transformation对象,用于把roof_line从一个位置移动到另一个位置。
transformation可以实现平移、旋转和缩放。
1、平移
在讲平移之前,我们要先了解一个概念,平移向量。我们在高中学习过,从一个点移动到另一个点,如从点(1,2,3)移动到点(3,4,5),只需要知道起点和移动向量就能到达终点,这个移动向量是用终点坐标减去起点坐标,即向量(2,2,2)。这里的平移向量类似于移动向量。
SketchUp API提供了三种方法来实现平移动能。
下面用一个例子演示如何使用这三种方法,这个例子是将一个面移动三次,首先沿着X轴正向移动4个单位,然后Y轴正向6个单位,最后沿X轴负向移动3个单位。
# 创建一个正方形面
ents = Sketchup.active_model.entities
tran_face = ents.add_face [-1, -1, 0],
[-1, 1, 0], [1, 1, 0], [1, -1, 0]
# T沿着X轴正向移动4个单位
t = Geom::Transformation.new [4, 0, 0]
ents.transform_entities t, tran_face
# Y轴正向6个单位
t = Geom::Transformation.new [0, 6, 0]
ents.transform_entities t, tran_face
# X轴负向移动3个单位
ents.transform_entities [-3, 0, 0], tran_face
2、旋转
去旋转一个图形,我们需要三个参数。
看下图更有助于理解。
系统提供两种方法用Transformation对象实现旋转功能
例如,要实现上图把圆围绕(0,0,0)和Z轴旋转30度,代码写为:
tr = Geom::Transformation.new [0, 0, 0], [0, 0, 1], 30.degrees
tr = Geom::Transformation.rotation [0, 0, 0], [0, 0, 1], 30.degrees
另外需要注意的是如果旋转角度是正值,则按‘逆时钟方向’旋转,如果是负值,就按顺时针方向旋转。
3、缩放
在Sketchup中,缩放工具可以改变图形的大小形状和改变图形的位置。在用代码实现时,我们创建的缩放Transformation对象即会缩放图形的大小也会缩放相对于默认点(0,0,0)的距离,例如下面的代码缩小了图形的大小,也减小了到(0,0,0)的距离。
#创建一个正方形
ents = Sketchup.active_model.entities
tran_face = ents.add_face [-1, -1, 0],
[-1, 1, 0], [1, 1, 0], [1, -1, 0]
#沿X轴正向移动4个单位
t = Geom::Transformation.new [4, 0, 0]
ents.transform_entities t, tran_face
#把正方形缩放为原来的一半,即改变形状也改变距原点的长度
t = Geom::Transformation.new 0.5
ents.transform_entities t, tran_face
实现缩放功能还可以用如下代码,效果跟上面的一样。
ents = Sketchup.active_model.entities
t = Geom::Transformation.scaling 0.5
ents.transform_entities t, shape
除此之外,我们还可以改变默认缩放的源点,即上面的(0,0,0)。例如,下面的代码实现把图形放大2倍并把源点变为(5,5,5),相信在以后的应用中,这种写法会比较常见。
t = Geom::Transformation.scaling [5, 5, 5], 2
为实现基于坐标轴缩放,需要调用Transformation.scaling结合三个参数,即X,Y,Z所缩放值,例如,下面代码实现减小X轴的一半,扩大Y轴的3倍,保持Z轴不变。
t = Geom::Transformation.scaling 0.5, 3, 1
scaling最后一种用法是结合以上三种,即,改变源点和x,y,z的缩放值,例如,设置源点为(5,5,5),相对于源点,实现减小X轴的一半,扩大Y轴的3倍,保持Z轴不变代码如下。
t = Geom::Transformation.scaling [5, 5, 5], 0.5, 3, 1
总结:
在本节中我们实现了平移、旋转和缩放功能,下一节中我将简单介绍将三种方法结合使用。