Tạo lưới cong bên trong hình cầu dựa trên tọa độ hình ảnh kết cấu


8

Trong Blender, tôi đã tạo ra một hình cầu với kết cấu toàn cảnh ở bên trong. Tôi cũng đã tự tạo một lưới phẳng (cong để phù hợp với kích thước của hình cầu) nằm trên bức tường bên trong nơi tôi có thể vẽ một kết cấu khác.

Điều này thật tuyệt, nhưng tôi thực sự muốn giảm lao động thủ công và thực hiện một số công việc này theo kịch bản - như có một biến cho hình ảnh toàn cảnh và tọa độ của khu vực trong ảnh mà tôi muốn thay thế bằng một ảnh mới lưới thép.

Phần khó nhất của việc này là tạo ra một lưới cong theo mã có thể ngồi trên bức tường bên trong của một quả cầu.

ai đó có thể chỉ cho tôi phương hướng đúng không?


Bạn có thể giải thích những gì bạn muốn xảy ra với ít nỗ lực hơn không? Giải thích phương pháp hiện tại của bạn và kết quả cuối cùng của bạn chi tiết hơn?
Seth Battin

Ngoài ra, tại sao hai lưới này cần phải tương tác? Bạn có thể chỉ cần chỉ định kích thước và tọa độ cho lưới bên trong và vẽ nó ở nơi cần thiết? Tại sao nó cần phải được chỉ định trong điều khoản của hình cầu bên ngoài?
Seth Battin

Tôi muốn có thể ánh xạ một hình ảnh tương đương vào bên trong hình cầu và tạo các khung hình chữ nhật (trong hình ảnh) có chứa hình ảnh động. Tuy nhiên, tôi không muốn tạo lại mọi thứ từ đầu mỗi lần tôi muốn giới thiệu một hình ảnh tương đương mới .... Để dễ dàng, tôi muốn chụp ảnh phẳng và sử dụng một cái gì đó như photoshop để tìm tọa độ xy của khung hình và có lưới mới co lại được bọc vào hình cầu tương ứng với tọa độ 2d đó.
dùng5025

Bạn có biết rằng Unity hỗ trợ skybox không? Có vẻ như đó là những gì bạn đang cố gắng để đạt được.
MichaelHouse

Tôi biết về skybox, nhưng nó không giải quyết được vấn đề của tôi. Tôi cần một cách để tạo ra một lưới cong (sẽ được đặt hoàn hảo ở bên trong một hình cầu), dựa trên tọa độ của một khung hình trong một hình ảnh tương đương.
dùng5025

Câu trả lời:


0

Những gì bạn đang cố gắng để đạt được dường như rất nhiều liên quan đến điều này:

Tương tự tọa độ hình cầu trong kích thước n

trong trường hợp của bạn theo 2 chiều thì bạn chỉ cần sử dụng công thức này để ánh xạ các đỉnh của hình chữ nhật mà bạn có (hãy hy vọng nó được chia nhỏ) trên hình cầu của bạn (đừng quên nhân với một nửaDiameter ở đâu đó. Chỉ các nhà toán học mới sống trên một đơn vị hình cầu người đàng hoàng đang sử dụng đường kính ...)

EDIT: Vì tất cả điều này là một chút mơ hồ, tôi cung cấp thêm một số hiểu biết Những gì bạn cần từ công thức này sẽ được sử dụng:

x = r*sinθ*cosφ
y = r*sinθ*sinφ
z = r*cosθ

θ và φ là tọa độ hình cầu mà bạn đang tìm kiếm (Vĩ độ và Kinh độ) để có được nó, bạn lấy tọa độ x / y của các điểm trên một phần của hình ảnh toàn cảnh như vậy:

public Void getPointPosOnSphere(float Longitude,float Latitude,float r) {
    x = r*Mathf.sin(Longitude)*Mathf.cos(Latitude);
    y = r*Mathf.sin(Longitude)*Mathf.sin(Latitude);
    z = r*Mathf.cos(Longitude);
    return new Vector3(x,y,z);
}

//here you could have a for loop iterating through points of your rectangle for each
//point you'd have associated a map coordinate :
Vector3 pointSpacePos = getPointPosOnSphere(pointCoordY,pointCoordX,HalfDiamater);
//End of the for loop

sau đó, bạn sẽ có được ánh xạ tứ giác của mình trên một hình cầu dựa trên vị trí xy của anh ta trên hệ tọa độ 2D được dịch sang vị trí 3D trên không gian theo ánh xạ hình cầu.

EDIT: Chỉ cần có một ý tưởng, để đi xa hơn, bạn có thể gói gọn tọa độ của mặt phẳng trên quả cầu bằng các giá trị UV như sau:

for(int i = 0;i < vertices.Length; i++) {
    vertices[i] = getPointPosOnSphere(UV[i].y,UV[i].x,HalfDiamater);
}

Ở đó, bạn có thể quản lý vị trí quad trên phần mềm 3D yêu thích của mình (hoặc thậm chí bằng mã thông qua thống nhất) chỉ bằng cách gán giá trị UV (nếu từ 0 đến 1 trên cả hai trục thì quad sẽ được bao quanh tất cả các hình cầu)

CẢNH BÁO: Sử dụng tia cực tím sẽ yêu cầu bạn thực hiện chuyển đổi từ radian sang Độ. (vì UV là 0 đến 1)


0

Câu trả lời của Géry Arduino ở trên đã chỉ cho tôi đi đúng hướng, nhưng tôi muốn thêm vài điều ở đây.

1) Sau đây sẽ không hoạt động trong sự thống nhất vì sự khác biệt hệ thống phối hợp

    return new Vector3(x,y,z); 

thay đổi điều này thành

    return new Vector3(x,z,y);

2) Tôi không rõ ràng về phạm vi đầu vào của các giá trị dài và lat được xác định trong chữ ký phương thức

     public Void getPointPosOnSphere(float Longitude,float Latitude,float r)

Cả hai giá trị Kinh độ và Vĩ độ phải được tính bằng radian. Phạm vi của họ là như sau

     Longitude: 0°-180° (0 - π)
     Latitude: 0°-360° (0 - 2π)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.