Đế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/PullFollow 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à pushpullfollowme. Chúng tương ứng với công cụ Push/Pull và Follow Me trong SketchUp

pushpull(distance, copy = false) ⇒ nil
# 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(edge) ⇒ Boolean

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

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