Biến hình trong Sketchup

Ở hình dưới, khi dịch chuyển (chọn công cụ Move của SketchUp) đường kẻ trên mái nó đã tạo thành mái nghiêng của nhà.

Trong code Ruby lớp Entities có phương thức transform_entities để thực hiện điều này:

transform_entities(transform, entities)

Tham số thứ nhất là đối tượng Transformation và tham số thứ 2 là mảng các Entity.

# 11. transform.rb
# load "/Users/xuanthulab/Desktop/learn-ruby/sketchup/11. transform.rb"

require 'sketchup.rb'
require 'extensions.rb'

ents = Sketchup.active_model.entities

# tr = Geom::Transformation.translation [0, 0, 5]
# ents.transform_entities tr, roof_line

face = ents.add_face([0,0,0], [100, 0, 0], [100,100,0], [0,100,0])
face.reverse!
face.pushpull 50, true
roof_line = ents.add_line [0, 50, 50], [100, 50, 50]


vector = [0,0, 30]
tr = Geom::Transformation.translation vector
ents.transform_entities tr, roof_line

Ngoài tạo Transformation dịch chuyển theo một vector Geom::Transformation.translation, còn có thể quay và thu phóng với cách tạo bằng Geom::Transformation.rotationGeom::Transformation.scaling

Translation - dịch chuyển

Biến đổi bằng cách dịch chuyển một khoảng cách theo một hướng nào đó. Để định nghĩa biến đổi này cần tạo một mảng với ba thành phần (vector), các tọa độ tương ứng của Entity sẽ thay đổi bằng cách cộng tương ứng các thành phần này.

Ví dụ, di chuyển hình từ [1,2,3] đến [3,2,1] bạn cần dùng mảng vector [2,0,-2].

Trong SketchUp có 3 cách để tạo Transformation tịnh tiến:

  • Gọi Geom::Transformation.new với tham số vector dịch chuyển
  • Gọi Geom::Transformation.translation với tham số vector dịch chuyển
  • Sử dụng ngay vector
# 12.translation.rb
# load "/Users/xuanthulab/Desktop/learn-ruby/sketchup/12.translation.rb"

require 'sketchup.rb'
require 'extensions.rb'

ents = Sketchup.active_model.entities
tran_face = ents.add_face [-1, -1, 0], [-1, 1, 0], [1, 1, 0], [1, -1, 0]

# Tịnh tiến hình theo vector [4,0,0]
t = Geom::Transformation.new [4, 0, 0]
ents.transform_entities t, tran_face

# Tịnh tiến hình theo vector [0,6,0]
t = Geom::Transformation.new [0, 6, 0]
ents.transform_entities t, tran_face

# Tịnh tiến hình theo vector [-3,0,0]
ents.transform_entities [-3, 0, 0], tran_face

Rotate - Quay

Có hai cách để tạo ra đối tượng Transformation có chức năng quay:

  • Gọi Transformation.new chỉ ra ba tham số gồm tọa độ gốc quay, trục quay và góc quay
  • Gọi Geom::Transformation.rotation cũng chỉ ra ba tham số gốc quay, trục quay và góc quay
# 13.rotate.rb
# load "/Users/xuanthulab/Desktop/learn-ruby/sketchup/13.rotate.rb"

require 'sketchup.rb'
require 'extensions.rb'

ents = Sketchup.active_model.entities

# tạo hình tròn (tậm trên x)
circle = ents.add_circle [50,0,0], [0,0,1], 10, 24
# Transformation quay 30 độ quanh z
t = Geom::Transformation.new [0, 0, 0], [0, 0, 1], 30.degrees
ents.transform_entities t, circle

# Quay 60 độ quanh z
t = Geom::Transformation.rotation [0, 0, 0], [0, 0, 1], 60.degrees
ents.transform_entities t, circle

Scale - Thu phóng

Có thể tạo đối tượng Transformation có chức năng thu phóng với một tỷ lệ nào đó, điểm gốc để thu phóng

# Thu phóng 3 chiều cùng tỷ lệ, gốc là [0,0,0]
Geom::Transformation.scaling(scale)

# Thu phóng 3 chiều với tỷ lệ khác nhau, gốc là [0,0,0]
Geom::Transformation.scaling(xscale, yscale, zscale)

# Thu phóng với 1 tỷ lệ, điểm gốc là point
Geom::Transformation.scaling(point, scale)

# Thu phóng 3 chiều với tỷ lệ khác nhau, gốc là point
Geom::Transformation.scaling(point, xscale, yscale, zscale)

Kết hợp các biến đổi

Từng chuyển đổi (tịnh tiến, thu phóng, quay) có thể kết hợp lại thành 1 Transformation bằng toán tử *, ví dụ có một Transformation dịch chuyển tr_dichchuyn, một Transformation quay tr_quay, hai đối tượng này có thể kết hợp lại thành 1

tr = tr_dichchuyen * tr_quay

Đăng ký nhận bài viết mới