在建筑立面设计,
好看的表皮能带来不一样的光影效果,
也让建筑设计师有了更大的发挥空间。

那今天我们就来制作一个快速生成 建筑表皮 的插件。

建筑表皮生成器



节奏和韵律

自然界中的许多事物或现象,
往往由于有秩序地变化或有规律地重复出现而激起人们的美感,
这种美通常称为韵律美。

建筑表皮赏析 ▼ (以下图片均来自cuto 侵删)




思路分析

  • 通过Sketchup::InputPoint.pick获取鼠标在模型上的位置;
  • 通过Sketchup::View.draw绘制辅助线来优化交互体验;
  • 在获取的四边形区域内通过阵列、上色、变形等操作绘制单个表皮结构;

1、获取鼠标当前位置 ▼ 我们需要在activate方法中实例化一个inputpoint:

  class PositionTooldef activate@ip = Sketchup::InputPoint.new@index = 0@spot_list = []endend

在onLButtonDown方法中监控鼠标点击事件,
再通过pick获取当前的点:

class PositionTool
# get current pointdef onLButtonDown(_flags, x, y, view)onSetCursor@ip.pick(view, x, y)@current_point = nil@current_point = @ip.positionend
end

2、绘制辅助线 ▼ 我们上面在`activate`方法中定义了

@index记录我们的操作步骤,
@current_point记录鼠标移动时候当前的点,
@spot_list来储存鼠标选中的4个点:

class PositionTool# get current pointdef onMouseMove(_flags, x, y, view)@ip.pick(view, x, y)@current_point = @ip.positionview.invalidateend# do when onLButtonDowndef onLButtonDown(_flags, x, y, view)case @indexwhen 0# first step@spot_list[0] = @ip.position@copy_ip = @ipwhen 1# sec step@spot_list[1] = @ip.positionwhen 2# thierd step@spot_list[2] = @ip.positionendview.invalidate@index += 1end
end

然后在draw方法中绘制出辅助线,
第一个和第二个点画一条线,
第二个点之后通过view.draw(GL_LINE_STRIP, @spot_list)
画出我们3个点确定的平行四边形:

class PositionTool    def draw(view)# set line widthview.line_width = 3case @indexwhen 0# nothingwhen 1# view.draw_lines(@spot_list[0], @current_point)when 2view.drawing_color = 'orange'@spot_list[2] = @current_point@spot_list = get_fourth_spot(@spot_list)@spot_list[4] = @spot_list[0]view.draw(GL_LINE_STRIP, @spot_list)when 3@index = 0@spot_list = []endend
end

3、绘制表皮 ▼ 再贴一下第一个表皮的绘制过程:

   # first skindef draw_skin_01@skin_01 = @ent.add_group@width = @pts[0].distance(@pts[1])@height = @pts[1].distance(@pts[2])@single_width = @width / (@width / @single_width).to_i@single_height = @height / (@height / @single_height).to_ipts_up, split_num_up = split_line(@pts[0], @pts[1], @single_width)pts_dwon, split_num_down = split_line(@pts[0], @pts[3], @single_height)move_up = pts_up[0] - @pts[0]move_down = pts_dwon[0] - @pts[0](0...split_num_down).each do |i|(0...split_num_up).each do |j|group = @skin_01.entities.add_groupstart_spot = @pts[0] + mult_vector(move_up, j) + mult_vector(move_down, i)face = group.entities.add_face start_spot, start_spot + move_up, start_spot + move_up + move_down, start_spot + move_downface.back_material = [rand(200..255), rand(200..255), rand(200..255)]face.pushpull -20.mmendendend

过程中还涉及到鼠标图标的替换,
操作过程中鼠标的tooltip提示,
工具中断的监听等常见操作。

总结

生成表皮只接收了表皮单个组件的长宽、材质颜色、透明度等参数,
我们还可以做成让用户选择单个组件来阵列成不一样的表皮。

接收更多的参数,
实现更灵活的参数化、自动化设计,
需要各位小可爱共同去探索

本次的 building_skin.rbz 是一个更加完整的插件样例,
公众号 Nicaicaiwo 回复 建筑表皮 获取完整插件。

文章转载请注明出处author by Nicaicaiwo

SketchUp的自动化探索 (二)建筑表皮生成器相关推荐

  1. Sketchup 程序自动化(二)Ruby 基础、单位转换

    1.Sketchup的单位转换 在我们打开Sketchup界面时,首先会选择模版,或者是默认的模版,这个模版规定了我们的尺寸单位,我们画的线是按照选择的单位格式来进行计算和规划. 在二次开发中,默认的 ...

  2. SketchUp的自动化探索 (一)构建私有模型库

    每个建筑师的硬盘里面, 是不是都存了多年来收集的几个T的精品模型? 草.树.雕塑.桌椅- 甚至还有剑圣和钢铁侠. 日常建场景去一个个打开我们存的模型copy进去 是不是比较费时间? 今天我们来做个插件 ...

  3. SketchUp的自动化实战 (二)获取内部空间

    SketchUp的自动化实战 (二)获取内部空间 之前在做光伏插件的时候用到了投影功能, 投影功能有很多应用场景, 今天我们来制作一个获取柜体 内部空间 的插件. 获取柜体内部空间 ▼ (获取内部抠门 ...

  4. SketchUp的自动化实战 (三)随机贴图

    SketchUp的自动化实战 (三)随机贴图 今天来学习一个随机贴图插件, 学习两种不同的实现. 随机贴图插件功能是: 收集选择区域中面上的材质, 随机分配给其它没有材质的面.组.组件. 并思考两个问 ...

  5. 【深度学习】DIY 人脸识别技术的探索(二)

    [深度学习]DIY 人脸识别技术的探索(二) 文章目录 训练模型 工具 结果展示 问题二的模型建立与求解 基于 KNN 的人脸识别模型 训练模型 MTCNN 可以并行训练(3 个网络同时训练,前提是内 ...

  6. Python自动化(十二):一分钟搞定几百个Excel中查找的数据

    一.需求说明 首先我们来看下今天的需求,有一份档案记录总表的Excel工作簿, 每天会根据当天日期建立新表,每天的表格内包含所有档案信息,同时也有可能会添加新的档案名.同个年度的总表在年末可能会有两. ...

  7. 这4款数据自动化探索 Python 神器,解决99%的数据分析问题!

    来源:Python学习与数据挖掘 探索性数据分析是一种非常重要的数据探索技术,用于了解数据的各个方面,这是执行任何机器学习或深度学习任务之前最重要的步骤之一. 探索性数据分析可以帮助识别明显的错误,区 ...

  8. 自动化(二)——八种元素定位方法

    自动化(二) 一.元素定位 1)如何元素定位 二.元素定位方式 1)id定位 2)name定位 3) class_name定位 4) tag_name定位 5) link_text以及partial_ ...

  9. 探索接口自动化(二)--接口联调(Python)

    导语 上篇总结了独立接口业务的分析过程,本次总结接口联调业务的分析过程,仍然尝试分解需求任务,采用多版本迭代,在实现需求的前提下再去做代码优化. 一.接口联调业务分析 对所有的接口需要有一个全局的认识 ...

最新文章

  1. delphi 16 网页缩放
  2. 手机屏幕适配遇到虚拟键的问题
  3. 必看 | VLAN划分和网络配置实例
  4. Java 网络实例三(获取URL响应头的日期信息、获取URL响应头信息、解析URL、ServerSocket和Socket通信实例)
  5. mysql中limit后面不能使用运算符
  6. Rsync+Inotify操作文档
  7. naturalWidth 与 naturalHeight
  8. CRM中多张关联表join的报表
  9. coreseek(中文全文搜索)安装和使用(一)
  10. 大数据产品推荐:金蜂巢大数据集成与脱敏系统
  11. 小说网站源码+采集器+App端
  12. 如何充分利用Composition API对Vue3项目进行代码抽离
  13. 网易新闻详情页排版实现思路
  14. 新建 Microsoft Office Word 文档
  15. 新手如何做游戏代理赚钱?
  16. 哈工大计算机学院官网哈工大软件工程专业,2019哈工大软件工程考研参考书目及复试线...
  17. 泰克|安捷伦|普源|PICO示波器程控软件二次开发NS-Scope
  18. lua 报错:'=' expected near ' '
  19. 《程序员修炼之道:从小工到专家》
  20. 关于SMBJ24CA

热门文章

  1. 产品经理之PRD详解(非原创)
  2. DIY百元级激光雕刻机
  3. Spring整合Hibernate步骤以及遇到的问题
  4. 第三方依赖库中kotlin代码提示/*compiled code*/
  5. 02.点阵显示中文汉字
  6. 嵌入式操作系统--魔幻盒子
  7. 基于MSCNN的人群密度估计之生成人群密度图
  8. 如果后端API一次返回10万条数据,前端应该如何处理?
  9. 3D打印技术发展前景令人欣喜,对人类未来发展有哪些影响?
  10. 人生修煉電影篇之-------------------- 《惊涛飓浪》