Terapkan distorsi ke permukaan Bézier


8

Saya mencoba mensimulasikan efek warp gambar, yang digunakan dalam Adobe Photoshop.

Gambar persegi panjang melengkung sesuai dengan permukaan Bézier kubik (dalam 2D, semua komponen Z adalah 0). Memiliki permukaan Bézier, distorsi vertikal d[0,1] dapat diterapkan untuk itu.

Kiri : permukaan masukan bézier,d=0, Kanan : permukaan keluaran, d=0.8

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

Apakah Anda punya ide, apa yang dilakukan pada permukaan Bézier (16 poin), ketika mengkonversi dari versi di sebelah kiri ke output di sebelah kanan?

Jawaban:


5

Sunting: mengubah jawaban sesuai dengan gambar dan klarifikasi baru.

for every control point p(k, n)
   p'(k, n) = ( p(k, n) - p(k) ) * d * l(k) + p(k, n)

di mana kindeks baris dan nindeks kolom titik kontrol. ladalah faktor elevasi dan sama dengan {-1, -1/3, 1/3, 1}. p(k)adalah pusat dari baris ke-k.

Alasan:

Dari gambar baru, garis merah dan biru diambil dari pusat garis (p (k) yang pada dasarnya (k, 0)) ke titik itu. Pada baris pertama, semua titik kontrol, termasuk yang ada di grafik (garis merah) dipindahkan ke titik yang sama pada garis itu. p (k, n) - p (k) memberikan vektor yang memindahkan titik dari p (k) ke p (k, n) yang sekarang harus diterapkan dengan cara lain, memindahkan titik ke lokasi yang diinginkan. Pada grafik Anda, d = 1 sehingga semua titik garis pertama akan dipindahkan ke tengah. Anda dapat dengan mudah menyelesaikan persamaan untuk memverifikasi ini. d * l(0)adalah -1, jadi itu -p(k, n) + p(k) + p(k, n)yang akan memberikan p (k).

Pada baris kedua, garis biru Anda sekali lagi dari titik ke tengah, tetapi kali ini berhenti sebelum mencapainya. Saya tidak tahu apakah benar-benar dipotong dari 1/3 tapi itu akan menjadi titik awal yang baik. Jadi rumus yang sama masih berlaku. l adalah -1/3 d adalah 1, jadi intinya akan dipindahkan 1/3 dari jalan. Angka 3 sama dengan angka kedua tetapi sekarang bergerak ke luar, jadi aku 1/3.

Pada baris terakhir, semua titik kontrol dipindahkan dari titik tengah garis itu. Ini cukup jelas karena garis Anda bertemu di pusat itu.

Satu-satunya masalah rumus ini dapat memiliki asumsi 1/3, selain itu saya tidak melihat alasan mengapa harus gagal.

Catatan: Saya menggunakan baris, kolom saat pengindeksan, jadi jika Anda menggunakan x, y Anda harus berpindah lokasi.


Itu melindungi garis-garis vertikal, itu benar. Tapi saya bekerja dengan permukaan Bézier (16 poin di pesawat) dan saya percaya itu harus bisa dilakukan hanya dengan memindahkan 16 poin ini, tanpa menghitung poin pada kurva bézier dll. Di sini Anda dapat melihat, bagaimana permukaan Bézier bekerja: philipandrews.org/ sandbox / BezierSurface / bin / BezierSurface.swf
Ivan Kuckir

Saya pikir saya menemukan solusi untuk masalah itu jika saya mengerti dengan benar. Anda bertanya bagaimana mengubah permukaan bezier A menjadi permukaan bezier B atau C ke D dengan parameter d menjadi 0,8, apakah benar?
Cem Kalyoncu

Yah sepertinya itu bukan formula yang tepat tetapi cukup dekat. Saya akan merenungkan ini sedikit lagi. Formula paling tidak benar untuk on-the-curve-points.
Cem Kalyoncu

Anda semakin dekat :) Tapi untuk contoh kedua, koordinat Y juga berubah. Seperti yang saya sebutkan, semua titik bergerak di sepanjang garis, sehingga cukup untuk menemukan posisi baru untuk d = 1 untuk setiap titik, maka saya dapat menginterpolasi secara linear.
Ivan Kuckir

Saya telah menambahkan gambar lain, mungkin dapat membantu Anda.
Ivan Kuckir
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.