2013-09-06 119 views
5

Tôi có một điểm 3d, được xác định bởi [x0, y0, z0].Làm cách nào để chuyển đổi điểm 3D trên mặt phẳng thành tọa độ UV?

Điểm này thuộc về mặt phẳng, được xác định bởi [a, b, c, d].

normal = [a, b, c], và ax + by + cz + d = 0

Làm thế nào có thể chuyển đổi hoặc lập bản đồ các điểm 3d để một cặp (u,v) tọa độ?

Điều này phải là một cái gì đó thực sự đơn giản, nhưng tôi không thể tìm ra.

+0

Bạn đang nói về các tọa độ chung (u, v)? Hay bạn đang cố gắng lập bản đồ một điểm trong không gian thế giới cho các tọa độ kết cấu được xác định trên một hình tam giác? – sbabbi

+0

tôi muốn kết cấu mặt phẳng – tigrou

Trả lời

8

Trước hết, bạn cần tính toán các vectơ uv của mình. uv phải trực giao với mặt phẳng bình thường của máy bay của bạn và trực giao với nhau. Không có cách duy nhất để xác định họ, nhưng một cách thuận tiện và nhanh chóng có thể một cái gì đó như thế này:

n = [a, b, c] 
u = normalize([b, -a, 0]) // Assuming that a != 0 and b != 0, otherwise use c. 
v = cross(n, u) // If n was normalized, v is already normalized. Otherwise normalize it. 

Bây giờ một dấu chấm sản phẩm đơn giản sẽ làm:

u_coord = dot(u,[x0 y0 z0]) 
v_coord = dot(v,[x0 y0 z0]) 

Chú ý rằng điều này giả định rằng nguồn gốc tọa độ cực tím là nguồn gốc thế giới (0,0,0).

Điều này sẽ hoạt động ngay cả khi vectơ của bạn [x0 y0 z0] không nằm chính xác trên mặt phẳng. Nếu đúng như vậy, nó sẽ chiếu nó lên mặt phẳng.          

+0

Một câu hỏi: bạn làm gì với vectơ 't', và khi' v_coord' được tính, thì vectơ 'v' đến từ đâu? – tigrou

+0

@tigrou, xin lỗi, ghi chú 'v' cho' t'. Đã chỉnh sửa – sbabbi

+0

Tôi đã thử thay thế 'v' và' t' trước khi đưa ra nhận xét nhưng nó không hoạt động, nhưng lý do thực sự là 'n' không chính xác trong chương trình của tôi. Tôi đã sửa lỗi này và nó hoạt động. Cảm ơn – tigrou

3

Giả sử bạn muốn tìm tọa độ của bất kỳ điểm nào trong mặt phẳng, về tọa độ (u, v) ...

Nếu điểm [x0, y0, z0] nằm trên mặt phẳng, sau đó chúng ta biết rằng

dot([a,b,c],[x0,y0,z0]) = -d 

Trường hợp chấm là sản phẩm chấm giữa hai vectơ. Điều này đơn giản là viết lại phương trình mặt phẳng.

Bí quyết là tìm hai vectơ trải rộng trên không gian con phẳng. Để làm điều này, chúng ta chọn một vector ngẫu nhiên có chiều dài 3. Gọi nó là V0. Tôi sẽ gọi vector bình thường phẳng

N = [a,b,c] 

Tiếp theo, sử dụng sản phẩm chéo của véc tơ thông thường N với V0.

V1 = cross(N,V0) 

Vectơ này sẽ trực giao với vectơ thông thường, trừ khi chúng tôi vô cùng may mắn và N và V0 được ghép lại. Trong trường hợp đó, chỉ cần chọn một vector ngẫu nhiên khác V0. Chúng ta có thể biết hai vectơ này có đồng nhất không, bởi vì sau đó V1 sẽ là vectơ [0 0 0].

Vì vậy, nếu V1 không phải là véc tơ 0 thì hãy chia từng phần tử theo chỉ tiêu V1. Chỉ tiêu của một vectơ đơn giản là căn bậc hai của tổng các bình phương của các phần tử.

V1 = V1/norm(V1) 

Tiếp theo, chúng tôi chọn vectơ V2 thứ hai là trực giao cho cả N và V1. Một lần nữa, một sản phẩm vectơ chéo thực hiện điều này một cách tầm thường. Chuẩn hóa vectơ đó để có độ dài đơn vị. (Vì chúng ta biết rằng V1 là một vectơ với định mức đơn vị, chúng ta chỉ có thể chia cho chỉ tiêu (N).)

V2 = cross(N,V1) 
V2 = V2/norm(V2) 

BẤT CỨ điểm trong mặt phẳng bây giờ có thể được mô tả trivially là một hàm của (u, v), như:

[x0,y0,z0] + u*V1 + v*V2 

Ví dụ, khi (u, v) = (0, 0), rõ ràng chúng ta nhận được [x0, y0, z0] trở lại, vì vậy chúng ta có thể nghĩ điểm đó là "nguồn gốc" trong các tọa độ (u, v). Tương tự như vậy, chúng ta có thể làm những việc như phục hồi u và v từ bất kỳ điểm [x, y, z] nào được biết nằm trong mặt phẳng, hoặc chúng ta có thể tìm thấy phép chiếu bình thường cho một điểm không nằm trong mặt phẳng , chiếu vào chiếc máy bay đó.