Membuat mesh melengkung di bagian dalam bola berdasarkan koordinat gambar tekstur

8

Di Blender, saya telah membuat bola dengan tekstur panorama di bagian dalam. Saya juga secara manual membuat jaring bidang (melengkung agar sesuai dengan ukuran bola) yang berada di dinding bagian dalam di mana saya dapat menggambar tekstur yang berbeda.

Ini bagus, tapi saya benar-benar ingin mengurangi tenaga manual, dan melakukan beberapa pekerjaan ini dalam sebuah skrip - seperti memiliki variabel untuk gambar panorama, dan koordinat area dalam foto yang ingin saya ganti dengan yang baru jala.

Bagian tersulit dari melakukan ini adalah menciptakan mesh melengkung dalam kode yang dapat duduk di dinding bagian dalam bola.

Adakah yang bisa mengarahkan saya ke arah yang benar?

user5025
sumber
Bisakah Anda menguraikan apa yang Anda inginkan terjadi dengan sedikit usaha? Jelaskan metode Anda saat ini dan hasil akhir Anda lebih detail?
Seth Battin
Juga, mengapa kedua jerat ini perlu berinteraksi? Bisakah Anda cukup menentukan ukuran dan koordinat untuk jaring bagian dalam, dan menggambar di mana pun itu perlu? Mengapa perlu ditentukan dalam hal lingkup luar?
Seth Battin
Saya ingin dapat memetakan gambar berbentuk persegi panjang di bagian dalam bola, dan membuat bingkai gambar persegi panjang (dalam gambar) berisi gambar yang dinamis. Namun, saya tidak ingin membuat ulang semuanya dari bawah ke atas setiap kali saya ingin memperkenalkan gambar equirectangular baru .... Untuk membuatnya mudah, saya ingin mengambil gambar yang diratakan, dan menggunakan sesuatu seperti photoshop untuk menemukan xy koordinat bingkai foto, dan memiliki mesh baru yang menyusut dibungkus dengan bola yang sesuai dengan koordinat 2d tersebut.
user5025
Anda sadar bahwa Unity mendukung skybox? Sepertinya itulah yang ingin Anda capai.
MichaelHouse
Saya sadar akan skybox, tetapi sayangnya itu tidak menyelesaikan masalah saya. Saya perlu cara untuk membuat mesh melengkung (yang akan duduk sempurna di bagian dalam bola), berdasarkan koordinat bingkai foto dalam gambar equirectangular.
user5025

Jawaban:

0

Apa yang ingin Anda capai tampaknya sangat terkait dengan ini:

Analogi koordinat bola dalam dimensi-n

dalam kasus Anda dalam 2 dimensi maka Anda hanya menggunakan rumus ini untuk memetakan simpul persegi panjang yang Anda miliki (mari kita berharap itu dibagi) di bola Anda (jangan lupa untuk mengalikan dengan setengahDiameter di suatu tempat. Hanya matematikawan yang hidup di unit bola semua lainnya orang baik menggunakan diameter ...)

EDIT: Karena semua ini agak kabur saya memberikan beberapa wawasan lagi Apa yang Anda butuhkan dari rumus ini untuk digunakan:

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

θ dan φ menjadi koordinat bola yang Anda cari (Latitude dan Longitude) untuk mendapatkannya, Anda mengambil koordinat x / y dari titik-titik pada bagian gambar panorama seperti itu:

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

maka Anda akan mendapatkan quad Anda dipetakan pada sebuah bola berdasarkan dari posisi xy-nya pada sistem koordinat 2D yang diterjemahkan ke posisi 3D pada ruang tersebut sesuai dengan pemetaan bola.

EDIT: Baru saja mendapat ide, untuk melangkah lebih jauh Anda bisa merangkum koordinat pesawat di bola menggunakan nilai UV seperti:

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

Di sana Anda dapat mengatur posisi quad pada perangkat lunak 3D favorit Anda (atau bahkan dengan kode melalui kesatuan) hanya dengan menetapkan nilai UV (jika dari 0 hingga 1 pada kedua sumbu maka quad akan dililitkan di sekitar bola)

PERINGATAN: Menggunakan UV akan mengharuskan Anda melakukan konversi Radian ke Derajat. (karena UV adalah 0 hingga 1)

Géry Arduino
sumber
0

Jawaban Géry Arduino di atas menunjuk saya ke arah yang benar, tetapi saya ingin menambahkan beberapa hal di sini.

1) Mengikuti tidak akan bekerja dalam kesatuan karena perbedaan sistem koordinat

    return new Vector3(x,y,z); 

ubah ini menjadi

    return new Vector3(x,z,y);

2) Saya tidak jelas pada kisaran input nilai panjang dan lat yang ditentukan dalam tanda tangan metode

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

Nilai Bujur dan Lintang harus dalam radian. Kisaran mereka adalah sebagai berikut

     Longitude: 0°-180° (0 - π)
     Latitude: 0°-360° (0 - 2π)
Snakebyte
sumber