DOZ数字之眼 巨蟹座 | 90后 | 四川省-绵阳市  

有了这神器,SU一键建筑表皮不是梦(附表皮生成器)


在建筑立面设计中,

好看的表皮能带来不一样的光影效果,

也让建筑设计师有了更大的发挥空间。


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

建筑表皮生成器


节奏和韵律

自然界中的许多事物或现象,

往往由于有秩序地变化或有规律地重复出现而激起人们的美感,

这种美通常称为韵律美。


建筑表皮赏析


(以上图片来源于cuto,侵删)

思路分析

  1. 通过Sketchup::InputPoint.pick获取鼠标在模型上的位置;

  2. 通过Sketchup::View.draw绘制辅助线来优化交互体验;

  3. 在获取的四边形区域内通过阵列、上色、变形等操作绘制表皮结构;



1、获取鼠标当前位置


我们需要在activate方法中实例化一个inputpoint:

  class PositionTool
   def activate
     @ip = Sketchup::InputPoint.new
     @index = 0
     @spot_list = []
   end
 end


在onLButtonDown方法中监控鼠标点击事件,

再通过pick获取当前的点:

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



2、绘制辅助线


我们上面在activate方法中定义了

@index记录我们的操作步骤,

@current_point记录鼠标移动时候当前的点,

@spot_list来储存鼠标选中的4个点:

class PositionTool
    # get current point
   def onMouseMove(_flags, x, y, view)
     @ip.pick(view, x, y)
     @current_point = @ip.position
     view.invalidate
   end
# do when onLButtonDown
   def onLButtonDown(_flags, x, y, view)
     case @index
     when 0
       # first step
       @spot_list[0] = @ip.position
       @copy_ip = @ip
     when 1
       # sec step
       @spot_list[1] = @ip.position
     when 2
       # thierd step
       @spot_list[2] = @ip.position
     end
     view.invalidate
     @index += 1
   end
end


然后在draw方法中绘制出辅助线,

第一个和第二个点画一条线,

第二个点之后通过view.draw(GL_LINE_STRIP, @spot_list)

画出我们3个点确定的平行四边形:

class PositionTool    
def draw(view)
     # set line width
     view.line_width = 3
     case @index
     when 0
       # nothing
     when 1
       #
       view.draw_lines(@spot_list[0], @current_point)
     when 2
       view.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 = []
     end
   end
end



3、绘制表皮


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

   # first skin
   def 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_i

     pts_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_group
         start_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_down
         face.back_material = [rand(200..255), rand(200..255), rand(200..255)]
         face.pushpull -20.mm
       end
     end
   end


过程中还涉及到鼠标图标的替换,

操作过程中鼠标的tooltip提示,

工具中断的监听等常见操作。


总结

生成表皮只接收了表皮单个组件的长宽、材质颜色、透明度等参数,

我们还可以做成让用户选择单个组件来阵列成不一样的表皮。


接收更多的参数,

实现更灵活的参数化自动化设计,

需要各位小可爱共同去探索。


本次的 building_skin.rbz 是一个更加完整的插件样例,

关注我的时机时机主页,私聊获取资料。


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


相关推荐
返回