- 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
