- Xây dựng các Face
- Các phương thức hình học của Face
- Phương thức pushpull của Face
- Phương thức followme của Face
Đến đây bạn đã biết tạo ra các đường thẳng, đường cong - giờ bắt đầu để xây dựng các mặt. Chúng là các bề mặt hai chiều trên đó có thể tô màu. Ngay khi có được đối tượng mặt, dễ dàng đẩy nó trở thành khối ba chiều bằng cách sử dụng các cơ chế tương tự công cụ Push/Pull và Follow Me của SketchUp
Xây dựng các mặt Face
Các Face được tạo ra bằng phương thức add_face
của lớp Entities
, nó khá giống với phương thức add_curve
ở phần trước: nó nhận tham số là một dãy cá điểm hoặc dãy các Edge.
# 06.add_face.rb # load "/Users/xuanthulab/Desktop/learn-ruby/sketchup/06.add_face.rb" require 'sketchup.rb' require 'extensions.rb' ents = Sketchup.active_model.entities p1 = [0, 1, 0] p2 = [-0.951, 0.309, 0] p3 = [-0.588, -0.809, 0] p4 = [ 0.588, -0.809, 0] p5 = [ 0.951, 0.309, 0] # tạo face face = ents.add_face p1, p2, p3, p4, p5 # Duyệt qua các đỉnh của face, thêm text ghi chú face.vertices.each { |point| s = point.position.to_s ents.add_text(s, point.position, [0.1, 0.1, 0]) } # lặt mặt face.reverse!
Lưu ý khi tạo Face từ các điểm, thứ tứ các điểm trong tham số là quan trọng. Khi các điểm
sắp xếp ngược chiều kim đồng hồ vector pháp tuyến luôn hướng xuống, để lặt ngược mặt
có thể dùng phương thức Face.reverse!
Chiều của vector pháp tuyến là chiều khi mặt được đẩy lên
Các phương thức hình học của Face
Một số phương thức về các thuộc tính hình học của Face giới thiệu ở đây như: edges
trả về mảng các Edge tạo nên Face, vertices
trả về mảng các Vertex (các đỉnh) trên biên, area
là diện tích của mặt, normal
là vector pháp tuyến.
Phương thức classify_point
để xác định một điểm có thuộc tham chiếu đến Face hay không, nó trả về số nguyên bằng các hằng số mang ý nghĩa như Sketchup::Face::PointOutside
, Sketchup::Face::PointInside
... Phương thức này tiện dụng để xác định xem người dùng có bấm vào mặt hay không
# 07.face_checkpoint.rb # load "/Users/xuanthulab/Desktop/learn-ruby/sketchup/07.face_checkpoint.rb" require 'sketchup.rb' require 'extensions.rb' model = Sketchup.active_model entities = model.active_entities pts = [] pts[0] = [0, 0, 0] pts[1] = [9, 0, 0] pts[2] = [9, 9, 0] pts[3] = [0, 9, 0] # Thêm face face = entities.add_face(pts) pt = Geom::Point3d.new(10, 10, 0) result = face.classify_point(pt) if result == Sketchup::Face::PointOutside entities.add_text("#{pt.to_s} nằm ngoài face (#{result})", pt, [1,1,1]) end pt = Geom::Point3d.new(1, 1, 0) result = face.classify_point(pt) if result == Sketchup::Face::PointInside entities.add_text("#{pt.to_s} nằm trong face (#{result})", pt, [1,1,1]) end pt = Geom::Point3d.new(0, 0, 0) result = face.classify_point(pt) if result == Sketchup::Face::PointOnVertex entities.add_text("#{pt.to_s} trên đỉnh face (#{result})", pt, [1,1,1]) end pt = Geom::Point3d.new(0, 1, 0) result = face.classify_point(pt) if result == Sketchup::Face::PointOnEdge entities.add_text("#{pt.to_s} trên biên face (#{result})", pt, [1,1,1]) end pt = Geom::Point3d.new(1, 1, 10) result = face.classify_point(pt) if result == Sketchup::Face::PointNotOnPlane entities.add_text("#{pt.to_s} không thuộc mặt face (#{result})", pt, [1,1,1]) end
Phương thức pushpull của Face
Face có hai phương thức để đẩy hình thành dạng 3D là pushpull
và followme
. Chúng tương ứng với công cụ Push/Pull và Follow Me trong SketchUp
# 08.pushpull.rb # load "/Users/xuanthulab/Desktop/learn-ruby/sketchup/08.pushpull.rb" require 'sketchup.rb' require 'extensions.rb' depth = 500.mm width = 1000.mm height = 400.mm model = Sketchup.active_model entities = model.active_entities pts = [] pts[0] = [0, 0, 0] pts[1] = [width, 0, 0] pts[2] = [width, depth, 0] pts[3] = [0, depth, 0] # Tạo face face = entities.add_face(pts) # Lật mặt face.reverse! # Kẻ đường chéo (cắt qua mặt) cut = entities.add_line pts[0], pts[2] # Lấy mặt thứ nhất tiếp biên là đường chéo firstface = cut.faces[0] # Lấy mặt thứ hai tiếp biên là đường chéo secondface = cut.faces[1] # đẩy 3D status = firstface.pushpull(height, true) status = secondface.pushpull(-height, true)
Phương thức followme của Face
followme
đẩy mặt thành 3D, đường đẩy chỉ định là các đường cong có kết nối bất kỳ không cùng mặt.
# 09.followme.rb # load "/Users/xuanthulab/Desktop/learn-ruby/sketchup/09.followme.rb" require 'sketchup.rb' require 'extensions.rb' model = Sketchup.active_model ent = model.entities circle = ent.add_circle [0,0,0], [0,0,1], 1 circle_face = ent.add_face circle path = ent.add_curve [10,0,0], [10,0,5], [10,5,5], [10,5,0], [10,0,0] circle_face.followme path
Ngọt vát đỉnh
# Gọt đỉnh # 10.chamfer.rb # load "/Users/xuanthulab/Desktop/learn-ruby/sketchup/10.chamfer.rb" require 'sketchup.rb' require 'extensions.rb' ents = Sketchup.active_model.entities width = 200.0; depth = 100.0; height = 200.0; delta = 30.0; main_face = ents.add_face [0,0,0], [width,0,0], [width,depth,0], [0,depth,0] main_face.reverse! main_face.pushpull height, true cut = ents.add_line [width, 0, height - delta], [width - delta, 0, height] # Follow mặt bên trái (dưới) theo đường biên tạo face chính cut.faces[1].followme main_face.edges