Bagaimana cara kerja zoom, panning, dan memutar?

Menggunakan OpenGL saya mencoba menggambar peta primitif kampus saya.

Adakah yang bisa menjelaskan kepada saya cara menggeser, memperbesar, dan memutar biasanya diterapkan?

Misalnya, dengan menggeser dan memperbesar, apakah saya hanya perlu menyesuaikan area pandang? Jadi saya memplot dan menggambar semua garis yang menyusun peta saya, dan kemudian saat pengguna mengklik dan menyeret, itu menyesuaikan area pandang saya?

Untuk menggeser, apakah ini menggeser nilai x/y pada area pandang saya dan untuk memperbesar, apakah ini menambah/mengurangi area pandang saya sejumlah tertentu? Bagaimana dengan rotasinya?

Untuk rotasi, apakah saya harus melakukan transformasi affine untuk setiap polyline yang mewakili peta kampus saya? Bukankah ini mahal untuk dilakukan dengan cepat pada peta berukuran layak?

Atau, apakah area pandang dibiarkan sama dan panning/zoom/rotasi dilakukan dengan cara lain?


Misalnya, jika Anda membuka link ini, Anda' Saya akan melihatnya menjelaskan panning dan zooming persis seperti yang saya lakukan di atas, dengan memodifikasi viewport.

Apakah ini tidak benar?


person KingNestor    schedule 25.02.2009    source sumber


Jawaban (3)


Hal ini dicapai dengan menerapkan serangkaian perintah glTranslate, glRotate (yang mewakili posisi dan orientasi kamera) sebelum menggambar pemandangan. (secara teknis, Anda memutar seluruh adegan!)

Ada fungsi utilitas seperti gluLookAt yang agak mengabstraksi beberapa detail tentang ini.

Untuk menyederhanakannya, asumsikan Anda memiliki dua vektor yang mewakili kamera Anda: posisi dan arah.

gluLookAt mengambil posisi, tujuan, dan vektor atas.

Jika Anda mengimplementasikan kelas vektor, destinaion = position + direction akan memberi Anda titik tujuan.

Sekali lagi untuk menyederhanakannya, Anda dapat mengasumsikan vektor atas selalu (0,1,0)

Lalu, sebelum merender apa pun dalam adegan Anda, muat matriks identitas dan panggil gluLookAt

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt( source.x, source.y, source.z, destination.x, destination.y, destination.z, 0, 1, 0 );

Kemudian mulailah menggambar objek Anda

Anda dapat membiarkan pengguna melakukan span dengan mengubah posisi sedikit ke kanan atau ke kiri. Rotasi sedikit lebih rumit karena Anda harus memutar vektor arah. Dengan asumsi bahwa yang Anda putar adalah kameranya, bukan objek dalam pemandangan.

Salah satu masalahnya adalah, jika Anda hanya memiliki vektor arah "maju", bagaimana cara memindahkannya? mana yang kanan dan kiri?

Pendekatan saya dalam hal ini adalah dengan mengambil perkalian silang dari "arah" dan (0,1,0).

Sekarang Anda dapat menggerakkan kamera ke kiri dan ke kanan menggunakan sesuatu seperti:

position = position + right * amount; //amount < 0 moves to the left

Anda dapat bergerak maju menggunakan "vektor arah", tetapi IMO lebih baik membatasi pergerakan pada bidang horizontal, jadi dapatkan vektor maju dengan cara yang sama seperti kita mendapatkan vektor yang tepat:

forward = cross( up, right )

Sejujurnya, ini adalah pendekatan yang agak hackish.

Pendekatan yang tepat adalah dengan menggunakan struktur data yang lebih "canggih" untuk mewakili "orientasi" kamera, bukan hanya arah depan. Namun, karena Anda baru memulai, ada baiknya Anda mengambil langkah demi langkah.

person hasen    schedule 25.02.2009
comment
Izinkan saya menambahkan bahwa viewport (seperti yang diatur melalui glViewport) tidak pernah masuk ke dalam proses ini. Area pandang menentukan wilayah jendela mana yang akan Anda render (ini sebenarnya tidak benar, tapi anggap saja seperti ini untuk saat ini) dan biasanya akan menjangkau seluruh jendela. - person Thomas; 25.02.2009

Semua "tindakan" ini dapat dicapai dengan menggunakan fungsi transformasi matriks tampilan model. Anda harus membaca tentang glTranslatef (panning), glScalef (zoom), glRotatef (rotasi). Anda juga harus membaca beberapa tutorial dasar tentang OpenGL, Anda mungkin menemukan tautan ini berguna.

person okutane    schedule 25.02.2009

Umumnya ada tiga langkah yang diterapkan setiap kali Anda mereferensikan titik mana pun di ruang 3d dalam opengl.

Mengingat poin Lokal

  • Lokal -> Transformasi Dunia
  • Dunia -> Transformasi Kamera
  • Kamera -> Transformasi Layar (biasanya proyeksi. Tergantung apakah Anda menggunakan perspektif atau ortogonal)

Masing-masing transformasi ini mengambil titik 3d Anda, dan mengalikannya dengan matriks.

Saat Anda memutar kamera, biasanya mengubah dunia -> transformasi kamera dengan mengalikan matriks transformasi dengan transformasi affine rotasi/geser/zoom Anda. Karena semua titik Anda dirender ulang setiap frame, matriks baru akan diterapkan ke titik Anda, dan ini memberikan tampilan rotasi.

person FryGuy    schedule 25.02.2009