2010-03-23 68 views
6

Tôi muốn chiếu Đa giác của tôi dọc theo vectơ tới mặt phẳng trong không gian 3d. Tôi tốt nhất nên sử dụng một ma trận chuyển đổi đơn để làm điều này, nhưng tôi không biết làm thế nào để xây dựng một ma trận loại này.Làm thế nào để chiếu một đa giác phẳng trên mặt phẳng trong không gian 3d

Với

  • các thông số của máy bay (ax + by + cz + d),
  • thế giới phối của Polygon tôi. Như đã nêu trong dòng tiêu đề, tất cả các đỉnh của đa giác nằm trong một mặt phẳng khác.
  • vector hướng dọc theo đó dự án Polygon của tôi (hiện vector bình thường máy bay của của đa giác)

mục tiêu -a 4x4 ma trận chuyển đổi, thực hiện các dự báo cần thiết,

hoặc

  • một số thông tin chi tiết về cách tự xây dựng một mình

CẬP NHẬT

Cảm ơn bạn đã trả lời, nó hoạt động như dự kiến. Một lời cảnh cáo với những người đã tìm thấy điều này: Nếu Mặt phẳng chiếu bình thường song song với vector chiếu, mẫu số D sẽ trở thành (gần như) 0, để tránh những điều lạ xảy ra, một số loại xử lý cho trường hợp đặc biệt này là cần thiết. Tôi giải quyết nó bằng cách kiểm tra nếu D < 1e-5, và nếu như vậy, chỉ cần dịch đa giác của tôi cùng với vector đùn hte.

Trả lời

12

Giả sử một trong các đỉnh của đa giác là (x0, y0, z0) và vectơ hướng là (dx,dy,dz).

Điểm trên đường chiếu là: (x,y,z) = (x0 + t*dx, y0 + t*dy, z0 + t*dz).

Bạn muốn tìm giao điểm của dòng này với máy bay, vì vậy cắm nó vào phương trình mặt phẳng ax+by+cz+d = 0 và giải quyết cho t:

t = (-a*x0 - b*y0 - c*z0 - d)/(a*dx + b*dy + c*dz) 

Và sau đó bạn có đỉnh của mục tiêu: x = x0+dx*t vv

Vì đây là một biến đổi affine, nó có thể được thực hiện bởi một ma trận 4x4. Bạn có thể xác định các phần tử ma trận bằng cách viết ba phương trình cho x, y, z như một hàm của x0, y0, z0 và lấy các hệ số.

Ví dụ, đối với x:

x = x0 - (a*dx*x0 + b*dx*y0 + c*dx*z0 + d*dx)/D 
x = (1 - a*dx/D)*x0 - (b*dx/D)*y0 - (c*dx/D)*z0 - d*dx/D 

đâu D = a*dx + b*dy + c*dz là mẫu số từ trên cao. y và z hoạt động tương tự.

quả ma trận:

1-a*dx/D -b*dx/D -c*dx/D -d*dx/D 
-a*dy/D 1-b*dy/D -c*dy/D -d*dy/D 
-a*dz/D -b*dz/D 1-c*dz/D -d*dz/D 
    0   0   0   1 

(Lưu ý: Trên Direct3D ma trận này nên được chuyển vị, vì nó sử dụng vectơ hàng thay vì vectơ cột).

+0

Cảm ơn bạn đã giải pháp hoàn chỉnh. Tôi sẽ thử ngay lập tức – sum1stolemyname

+0

Tôi đã triển khai giải pháp của bạn. Tuy nhiên, tôi đã gặp rắc rối khi vector hướng của tôi là (1 | 0 | 0) và mặt phẳng ở góc 45 °: Xem bên: '| ---->/'ở đâu | là Đa giác và/là mặt phẳng để phóng. Trong trường hợp này, một * dx/D = 1, trong đó hai mục nhập khác trong cột đầu tiên là 0 (dy = dzt = 0). điều này dẫn đến toàn bộ coumn là 0, có hiệu quả mở rộng đa giác của tôi thành 0. Ứng dụng của tôi không thích điều đó. Bạn có biết cách giải quyết vấn đề này không? – sum1stolemyname

+1

@ sum1: Cột đầu tiên bằng 0 có nghĩa là tọa độ x của các đỉnh gốc sẽ bị bỏ qua. Điều này được mong đợi vì hướng chiếu của bạn song song với trục x. Nó sẽ không mở rộng đa giác của bạn thành 0. – interjay

Các vấn đề liên quan