Petakan tekstur ke segitiga hiperbolik

9

Saya telah terjebak pada cara pendekatan ini untuk sementara waktu, jadi setiap saran akan sangat dihargai!

Saya ingin memetakan tekstur dalam bentuk segitiga euclidean kanan bawah ke segitiga hiperbolik pada Disk Poincare.

Inilah teksturnya (segitiga kiri atas teksturnya transparan dan tidak digunakan). Anda mungkin mengenali ini sebagai bagian dari Batas Lingkaran Escher I

Maaf, lihat komentar karena saya tidak diizinkan memposting lebih dari dua tautan!

Dan inilah bentuk poligon saya (berpusat pada titik asal, yang berarti bahwa dua tepi adalah garis lurus, namun secara umum ketiga tepi akan menjadi busur lingkaran):

Wireframe Polygon

Pusat poligon adalah incentre dari segitiga euclidean yang dibentuk oleh verteksnya dan saya UV memetakan tekstur menggunakan incentre itu, membaginya menjadi jumlah wajah yang sama seperti yang dimiliki poligon dan memetakan setiap wajah ke wajah poligon yang sesuai. Namun hasilnya terlihat seperti ini:

Polygon bertekstur

Jika ada yang berpikir ini bisa dipecahkan dengan menggunakan pemetaan UV saya akan dengan senang hati memberikan beberapa contoh kode, namun saya mulai berpikir ini mungkin tidak mungkin dan saya harus menulis fungsi pemetaan saya sendiri.

ASK dengan beberapa perbaikan jawaban @ Nathan di bawah ini karena baris AB, AC, BC mungkin sebenarnya busur bukan garis.

Metode: pilih sisi terpanjang, katakan BC, lalu bagikan ini menjadi beberapa bagian. Bagi dua sisi yang lain menjadi jumlah bagian yang sama. Maka garis yang menghubungkan ini (DE dalam jawaban di bawah) harus benar-benar juga menjadi busur, bukan garis lurus. Bagi busur baru ini sesuai kebutuhan, tambahkan segitiga baru sebagai wajah lalu UV memetakan segitiga kanan bawah tekstur ke wajah-wajah baru ini.

Sederhana? Tidak semuanya. Tapi itu berhasil. Ikan 1 Ikan 2

Lewy Blue
sumber
Berikut adalah tekstur yang saya gunakan: i.stack.imgur.com/SEi0G.png
Lewy Blue
1
Saya menganggap masalahnya adalah pemotongan gambar? Saya melihat ini terjadi di mana Anda memiliki jarak yang tidak konsisten antara simpul subdivisi segitiga. Dugaan saya adalah Anda menggunakan langkah-langkah yang konsisten untuk pemetaan uv Anda, memberi Anda efek geser.
Daniel M Gessel
Saya benar-benar memperbaikinya segera setelah memposting ini dengan membuat subdivisi konsisten dan lebih kecil, itu memperbaiki geser agak (walaupun tidak sepenuhnya). Namun teksturnya masih sangat terdistorsi. Saya sedang mengerjakan saran @nathan di bawah ini, yang setidaknya akan memungkinkan pembagian yang jauh lebih baik.
Lewy Blue
1
@Looeee Bisakah Anda memberikan kode Anda, saya sangat tertarik pada bidang grafis ini
x-rw
Ya, Anda dapat menemukan kode saya di sini: github.com/looeee/blackthread-heroku/tree/master/assets/js/src/… Dan versi live: blackthread.io/experiments/eschersketch Jujur, sudah sangat lama sejak saya melihat pada saat ini yang saya tidak ingat di mana dalam kode fungsi yang menyelesaikan ini, tetapi jika Anda mengalami kesulitan masuk akal berikan saya komentar lain di sini dan saya akan memeriksanya.
Lewy Blue

Jawaban:

8

Dugaan saya adalah bahwa untuk mendapatkan tekstur agar terlihat benar, Anda harus membagi bagian dalam segitiga juga, dan memperkirakan pemetaan UV non-linear di dalamnya.

Saat ini, sepertinya Anda membagi lagi di sekitar tepi segitiga, dan membentuk kipas segitiga yang lebih kecil di antara tepi dan incenter. Ini akan baik-baik saja jika Anda hanya menampilkan segitiga dalam warna solid. Tetapi ketika menerapkan tekstur, Anda mendapatkan diskontinuitas pada batas-batas subdivisi tersebut, karena tekstur hanya membentang secara linier di setiap segitiga yang dibagi dan tidak mendekati perkiraan pemetaan hiperbolik sepanjang arah radial.

Anda harus membagi sepanjang kedua sumbu, kira-kira seperti ini:

masukkan deskripsi gambar di sini

dan posisikan semua simpul secara tepat di ruang layar dan ruang UV untuk mendekati koordinat hiperbolik di bagian dalam segitiga. Jika Anda membagi cukup halus, ini akan menghasilkan ilusi pemetaan tekstur melengkung terus menerus.

Nathan Reed
sumber
1
Terima kasih, saya akan coba ini. Itu adalah salah satu metode asli saya membangun poligon, namun jauh lebih rumit secara matematis jadi saya pergi dengan metode yang lebih sederhana. Saya akan mencobanya lagi dan melaporkan kembali.
Lewy Blue
Terima kasih. Saya dapat mengubah saran Anda menjadi solusi. Lihat hasil edit saya di atas.
Lewy Blue