Cara membuat kubus di OpenGL

Pengarang: Gregory Harris
Tanggal Pembuatan: 12 April 2021
Tanggal Pembaruan: 1 Juli 2024
Anonim
Tutorial membuat kubus dengan Open-gl
Video: Tutorial membuat kubus dengan Open-gl

Isi

OpenGL adalah alat pemrograman 3D yang memungkinkan Anda membuat gambar 3D kompleks dari bentuk sederhana. Pada artikel ini, Anda akan belajar cara menggambar dengan bantuannya sebuah kubus sederhana yang dapat diputar dalam tiga dimensi!

Langkah

Bagian 1 dari 3: Instalasi Awal

  1. 1 Instal OpenGL. Mulailah dengan tutorial tentang cara menginstal OpenGL di komputer Anda. Jika Anda sudah memiliki OpenGL dan compiler C, Anda dapat melewati langkah ini dan melanjutkan ke langkah berikutnya.
  2. 2 Buat dokumen. Buat file baru di editor kode favorit Anda dan simpan sebagai mycube.c
  3. 3 Tambahkan #termasuk. Berikut adalah arahan #include dasar yang Anda perlukan. Penting untuk diingat bahwa arahan untuk sistem operasi yang berbeda berbeda, dan oleh karena itu Anda harus memilih semuanya agar program bersifat universal dan dapat dijalankan di sistem apa pun.

      // Termasuk #include stdio.h> #include stdarg.h> #include math.h> #define GL_GLEXT_PROTOTYPES #ifdef __APPLE__ #include GLUT / glut.h> #else #include GL / glut.h> #endif

  4. 4 Tambahkan prototipe fungsional dan global. Langkah selanjutnya adalah mendeklarasikan prototipe fungsional.

      // Prototipe fungsional tampilan batal (); batalkan kunci khusus(); // Variabel global double rotate_y = 0; putar ganda_x = 0;

  5. 5 Tentukan fungsi utama ().

      int main (int argc, char * argv []) // Inisialisasi GLUT dan memproses parameter kustom glutInit (& argc, argv); // Minta Jendela Dengan Dukungan Untuk Penyangga Ganda, Penyangga Z, dan Warna Asli glutInitDisplayMode (GLUT_DOUBLE

Bagian 2 dari 3: Fungsi tampilan ()

  1. 1 Pahami tujuan fungsi tampilan (). Semua pekerjaan rendering kubus akan jatuh pada garis rapuh dari fungsi ini. Ide umumnya adalah ini: Anda akan menggambar enam wajah kubus yang terpisah dan menempatkannya di posisinya masing-masing.
    • Untuk setiap wajah, Anda akan menentukan empat sudut, dan OpenGL akan menghubungkannya dengan garis dan mengisinya dengan warna pilihan Anda. Cara melakukannya akan dijelaskan di bawah ini.
  2. 2 Tambahkan fungsi glClear (). Pertama-tama, ketika bekerja dengan fungsi ini, kita perlu warna bening dan buffer-z... Tanpa ini, yang lama akan terlihat di bawah gambar baru, dan objek yang digambar oleh program akan diposisikan secara tidak benar.

      void display () // Bersihkan Layar Dan Z Buffer glClear (GL_COLOR_BUFFER_BIT

    • Perhatikan dua baris terakhir. Ini adalah fungsi-fungsinya glFlush(); dan glutSwapBuffers ();, memberikan efek buffering ganda, yang dijelaskan di atas.

Bagian 3 dari 3: Interaktivitas Program

  1. 1 Tambahkan fungsi specialKeys(). Pada prinsipnya, semuanya hampir siap, tetapi kubus hanya ditarik dan tidak diputar. Untuk melakukan ini, Anda perlu membuat fungsi tombol khusus (), yang memungkinkan Anda memutar kubus dengan menekan tombol panah!
    • Untuk fungsi inilah variabel global rotate_x dan rotate_y dideklarasikan. Saat Anda menekan tombol panah kiri dan kanan, nilai rotate_y akan bertambah atau berkurang lima derajat. Nilai rotate_x akan berubah dengan cara yang sama, tetapi kali ini dengan menekan tombol panah atas dan bawah.
    • void specialKeys (kunci int, int x, int y) {// Panah kanan - meningkatkan rotasi sebesar 5 derajat jika (kunci == GLUT_KEY_RIGHT) rotate_y + = 5; // Panah Kiri - Kurangi Rotasi 5 Derajat jika (key == GLUT_KEY_LEFT) rotate_y - = 5; else if (kunci == GLUT_KEY_UP) rotate_x + = 5; lain jika (kunci == GLUT_KEY_DOWN) rotate_x - = 5; // Permintaan Penyegaran Layar glutPostRedisplay(); }

  2. 2 Tambahkan glRotate(). Hal terakhir yang akan kita lakukan adalah menambahkan garis yang memungkinkan kita untuk memutar objek. Kembali ke fungsi menampilkan () dan sebelum deskripsi sisi DEPAN tambahkan:

      // Reset Mengubah glLoadIdentity(); // Rotate Saat Pengguna Mengubah Nilainyarotate_x dan rotate_y glRotatef (rotate_x, 1.0, 0.0, 0.0); glRotatef (rotate_y, 0.0, 1.0, 0.0); // Sisi warna-warni - DEPAN ....

    • Harap dicatat bahwa sintaks glRotatef ()yang mirip dengan sintaks glColor3f() dan glVertex3f(), tetapi selalu membutuhkan empat parameter. Yang pertama adalah sudut rotasi dalam derajat. Tiga berikutnya adalah sumbu di mana rotasi berlangsung, dalam urutan x, y, z. Untuk saat ini, kita perlu memutar kubus sepanjang dua sumbu, x dan y.
    • Semua transformasi yang kita definisikan dalam program membutuhkan garis yang serupa. Pada dasarnya, kita merepresentasikan rotasi suatu objek sepanjang sumbu x sebagai perubahan nilai rotate_x, dan rotasi sepanjang sumbu y sebagai perubahan nilai rotate_y. Namun, OpenGL akan menggabungkan semuanya menjadi satu matriks transformasi. Setiap kali Anda memanggil tampilan, Anda akan membuat matriks transformasi, dan glLoadIdentity () akan memungkinkan Anda untuk memulai dengan matriks baru setiap kali.
    • Fungsi transformasi lain yang mungkin Anda gunakan adalah glTranslatef() dan glScalef(). Mereka mirip dengan glRotatef (), kecuali bahwa mereka hanya memerlukan tiga parameter: nilai x, y, dan z untuk mengubah ukuran dan skala objek.
    • Agar semuanya ditampilkan dengan benar ketika ketiga transformasi diterapkan pada satu objek, Anda perlu mengatur transformasi dalam urutan yang sesuai, yaitu glTerjemahkan, glPutar, glSkala - dan tidak pernah sebaliknya. OpenGL mengubah objek dengan membaca program dari bawah ke atas. Untuk lebih memahami hal ini, bayangkan bagaimana tampilan kubus 1x1x1 setelah semua transformasi jika OpenGL menerapkannya dalam urutan yang ditunjukkan (atas ke bawah), lalu pikirkan bagaimana OpenGL akan memproses kubus dengan membaca instruksi dari bawah ke atas.
  3. 3 Tambahkan perintah berikut untuk menskalakan kubus dua kali dalam arah x dan y, untuk memutar kubus 180 derajat pada sumbu y, dan untuk memindahkan kubus 0,1 pada sumbu x. Pastikan semua perintah yang relevan, termasuk perintah glRotate() yang diberikan sebelumnya, berada dalam urutan yang benar. Jika Anda takut melakukan kesalahan, lihat versi final program di akhir artikel.

      // Transformasi Lainnya glTranslatef (0.1, 0.0, 0.0); glRotatef (180, 0.0, 1.0, 0.0); glScalef (2.0, 2.0, 0.0);

  4. 4 Kompilasi dan jalankan kode. Katakanlah Anda menggunakan gcc sebagai kompiler Anda, jadi masukkan perintah berikut ke terminal Anda:

      Di Linux: gcc cube.c -o cube -lglut -lGL ./ mycube Di Mac: gcc -o foo foo.c -framework GLUT -framework OpenGL ./ mycube Di Windows: gcc -Wall -ofoo foo.c -lglut32cu - lglu32 -lopengl32 ./ mycube

  5. 5 Periksa kode terakhir. Berikut adalah kode terakhir yang dibuat oleh penulis artikel, yang tidak menerjemahkan komentar.

      // // File: mycube.c // Penulis: Matt Daisley // Dibuat: 25/4/2012 // Proyek: Kode sumber untuk Membuat Kubus di OpenGL // Deskripsi: Membuat jendela OpenGL dan menggambar kubus 3D / / Bahwa pengguna dapat memutar menggunakan tombol panah // // Kontrol: Panah Kiri - Putar Kiri // Panah Kanan - Putar Kanan // Panah Atas - Putar Atas // Panah Bawah - Putar Bawah // ------ -------------------------------------------------- - // Termasuk // ------------------------------------------- - -------------- #include stdio.h> #include stdarg.h> #include math.h> #define GL_GLEXT_PROTOTYPES #ifdef __APPLE__ #include GLUT / glut.h> #else # include GL / glut.h> #endif // --------------------------------------- - ------------------ // Fungsi Prototipe // ------------------------------------ - -------------------------------- tampilan batal (); batalkan kunci khusus(); // ------------------------------------------------ ---------- // Variabel Global // ---------------------------------- ------------------------ putar ganda_y = 0; putar ganda_x = 0; // ------------------------------------------------ ---------- // tampilan () Fungsi panggilan balik // -------------------- --------------------------- void display () // Bersihkan layar dan Z-buffer glClear (GL_COLOR_BUFFER_BIT // ------ -------------------------------------------------- - // specialKeys () Fungsi Panggilan Balik // --------------------------------------- - ------------------ void specialKeys (kunci int, int x, int y) {// Panah kanan - meningkatkan rotasi sebesar 5 derajat jika (kunci == GLUT_KEY_RIGHT) rotate_y + = 5; // Panah kiri - kurangi rotasi sebesar 5 derajat jika (kunci == GLUT_KEY_LEFT) rotate_y - = 5; else if (kunci == GLUT_KEY_UP) rotate_x + = 5; else if (kunci == GLUT_KEY_DOWN) rotate_x - = 5; // Permintaan pembaruan tampilan glutPostRedisplay ();} // ----------------------------------- - ---------------------- // fungsi utama () // ------------------- - --------------------------------------- int main (int argc, char * argv [ ] ) GLUT_RGB