Face 类的方法访问相应形状的属性。area 方法 返回表面面积,edges 方法返回形成平面的 Edge 对象的数组,normal 方法返回平面的法向量,法向量确定与平面垂直的方向。例如,face1.normal 返回 [0, 0, 1],因为 +z 方向垂直于 x-y 平面。当然,[0, 0, -1] 向量也是垂直的,可以通过调用 reverse! 方法翻转 Face 对象的法向量。
挤压 3-D 图形
从 2-D 平面形成 3-D 图形的过程称作挤压。Face 类包含两个执行挤压的方法:pushpull 和 followme。特别要记住,SketchUp 没有单独用于 3-D 图形的类。在挤压过程中,SketchUp 创建形成图形的 Edge 和 Face 对象。
pushpull 方法是两个方法中较容易使用的一个,它执行与 SketchUp 的 pushpull 工具相同的操作。也就是说,它在 Face 对象的法向量方向上进行挤压,创建一个 3-D 图形。该方法惟一需要的参数是一个数值距离,表明挤压应该执行多远。这个值可以为负,从而在 Face 对象的法向量的反方向上挤压。例如,前一篇文章通过创建一个正方形 Face 对象,并使用参数 -9 调用 pushpull 方法,形成了一个盒状立体图形。
第二个挤压方法是 followme,该方法与 SketchUp 的 followme 工具的作用是一样的。pushpull 只在一个方向上挤压,而 followme 则可以在任意方向上挤压。例如,如果创建一个圆形 Face 对象,那么可以沿着圆的轴线进行挤压,最后将形成一个圆柱体。但是还可以沿着圆形路径挤压来创建圆环体或球形。要设置挤压路径,需要定义一个 Edge 对象或一个 Edge 对象数组。清单 1 显示了该方法的用法,其中的代码创建一个三角形平面,并沿着一个矩形路径挤压它(请查看 下载)。
清单 1. 使用 followme 方法进行挤压
# Access the Entities object model = Sketchup.active_model ents = model.entities # Create a triangular face triangle = ents.add_face [1, 0, 0], [0, 1, 0], [0, -1, 0] # Create the extrusion path path = ents.add_edges [0, 0, 0], [0, 0, 10], [0, -10, 10], [0, -10, 0], [0, 0, 0] # Extrude the triangle along the rectangular path triangle.followme path |
add_edges 方法根据一系列的点创建一个 Edge 对象数组。图 3a 显示三角形 Face 对象和一个矩形路径。图 3b 显示该脚本最后一条命令(triangle.followme path)的结果,该命令沿着路径挤压三角形。
图 3. SketchUp 挤压
注意,路径必须是一个闭环 — 也就是说,路径中第一个 Edge 对象的第一个点必须与最后一个 Edge 对象的最后一个点的位置相同。
SketchUp 材质
至此,您已经知道如何用代码构建形状,接下来还需要知道如何定义这些形状的显示。可以通过创建一个 Material 对象,配置它的显示,并将它与一个形状,例如 Edge 或 Face 对象相关联,从而定义形状的显示。可以用颜色、纹理或同时使用两者来定义 Material 对象的显示。Material 对象越详细,画出的图看上去就越真实,越专业。SketchUp 提供了很多现成的材质。要查看它们在 SketchUp 中是什么样子,可以单击 Window > Materials。
就像模型的 Entities 容器容纳 Entity 对象一样,Materials 容器容纳 Material 对象。要将一个新的 Material 对象添加到设计中,需要调用 Materials 类的 add 方法。该方法接受材质的名称为参数,并返回一个新的 Material 对象。例如,下面的代码访问 Materials 容器,并创建一个名为 RedBrick 的 Material 对象:
mats = Sketchup.active_model.materials rb_mat = mats.add "RedBrick" |
创建好 Material 对象后,就可以用 Material 类中的方法访问和配置它的属性,这些方法包括:
- color — 设置 Material 对象的颜色
- texture — 识别 Material 对象的纹理
- materialType — 返回一个数字,表明 Material 对象是否具有颜色(0)或纹理(1),还是两者都有(2)
- display_name — 返回 Material 对象的名称
SketchUp 提供了一个 Color 对象,但是更容易的方法是使用一个简单的 RGB 数组替代,例如 [64, 128, 255]。其中第一个元素表示颜色中红色的亮度,第二个元素表示绿色的亮度,第三个元素表示蓝色的亮度。还可以使用颜色的名称,例如 Red、Plum 或 MintGreen。要查看 X11 颜色名称的完整列表,可在 Ruby Console 中输入 Sketchup::Color.names。例如,要将 rb_mat 的颜色设为红色,可输入以下任意一条命令:
rb_mat.color = [255, 0, 0] rb_mat.color = "Red" |
在 3-D 图形用语中,纹理 是指像墙纸模式一样应用到某个设计区域的图像:该图像可以重复,也可以根据需要裁剪,以覆盖平面。SketchUp 提供了 Texture 对象,但更容易的方法是使用图像文件名替代。SketchUp 可以从 JPG、PNG、PSD、TIF、TGA 和 BMP 文件创建纹理,下面的命令展示如何将 C:/scripts/tex.targa 中的图像设为一个名为 rb_mat 的 Material 对象的纹理。
rb_mat.texture = "C:/scripts/tex.targa" |
配置好 Material 对象的颜色或纹理后,将它指定给设计中的一个形状(或多个形状)。这很简单:Drawingelement 类(Entity 的子类,Edge 和 Face 的超类)提供了一个 material 方法,该方法接受一个 Material 对象为参数,并将该 Material 对象的颜色或纹理应用到元素。清单 2 中显示了具体的代码,该代码创建一个具有纹理(C:/scripts/brick.jpg)和颜色(DodgerBlue)的 Material 对象。第一行定义图像文件的路径;路径必须正确指定,否则脚本不会正常运行。
清单 2. 创建和应用材质
image_file_path = "C:/scripts/brick.jpg" # Create the new material mats = Sketchup.active_model.materials brick_mat = mats.add "red_brick" # Assign the color and texture brick_mat.texture = image_file_path brick_mat.color = "DodgerBlue" # Draw a Face and set its material ents = Sketchup.active_model.entities face = ents.add_face [10, -10, 0], [10, 10, 0], [-10, 10, 0], [-10, -10, 0] face.reverse! face.material = brick_mat |
注意,brick_mat 的颜色是在纹理之后 定义的,以便在应用到平面之前改变纹理的颜色。虽然 brick.jpg 图像主要是红色,但最终的纹理是蓝色,因为后面定义了 Material 对象的颜色。图 4 显示这种蓝色看上去是什么样子。
图 4. 应用到一个平面的材质
了解更多
如果我让您认为 SketchUp 脚本中只有 Edge 对象、Face 对象和 Material 对象,那么我会感到愧疚。实际上,SketchUp 提供了大量精彩功能,远远不止画出漂亮的形状那么简单。它们包括:
- Animation — 定义 SketchUp 设计如何随着时间而移动
- Component — 创建模块化设计块,这种设计块可存储在文件中,并在设计中实例化
- PolygonMesh — 创建或导入高级的形状,并应用复杂的纹理
- WebDialog — 通过专门的 DHTML 窗口与 Internet 交互
- Tool/Menu/Page — 通过扩大 UI 增加 SketchUp 的功能
当然,SketchUp 的一个优点是可以与 Google Earth 交互,并创建特定于地形的结构。
结束语
通过创建和执行 SketchUp 脚本,可以自动化设计过程,节省大量的时间。此外,还可以编写绘制样条曲线(spline)、非均匀有理 B 样条曲线(nonuniform rational B-spline,NURB)和参数曲线(parametric curve)等形状的几何算法。幸运的是,SketchUp API 仍保持简单而强大的思想,这正是 Google 如此成功的秘诀。只需很少的时间,就可以掌握一些基本的类(Edge、Face),通过组合这些类就可以形成 SketchUp 图形。如果投入更多的时间,还可以增加一些高级的功能,例如动画和动态组件。(责任编辑:A6)