Bagian sebelumnya mengajarkan Anda cara mewarnai segitiga dan segi empat. Pelajaran ini akan mengajarkan Anda cara memutar objek berwarna di sekitar sumbu koordinatnya.
Sebenarnya, cukup tambahkan beberapa baris pada kode di bagian sebelumnya. Mari kita menulis ulang seluruh rutinitas lagi. Akan lebih mudah bagi Anda untuk mengetahui apa yang telah ditambahkan dan apa yang telah diubah.
Tambahkan dua variabel untuk mengontrol rotasi kedua objek tersebut. Kedua variabel ini ditambahkan setelah variabel lainnya di awal program (bool fullscreen=TRUE; dua baris di bawah). Mereka adalah variabel tipe floating point yang memungkinkan kita memutar objek dengan sangat tepat. Angka floating point mengandung tempat desimal, artinya kita tidak perlu menggunakan sudut 1, 2, 3... Anda akan menemukan bahwa angka floating point adalah dasar dari pemrograman OpenGL. Variabel baru bernama rtri digunakan untuk memutar segitiga, dan rquad digunakan untuk memutar segi empat.
Var
…
rtri : GLfloat; // Sudut untuk segitiga (baru)
rquad : GLfloat; // Sudut untuk segiempat (baru)
…
Kemudian modifikasi glDraw() sebagai berikut:
Prosedur glDraw();
Mulai
glClear(GL_COLOR_BUFFER_BIT Atau GL_DEPTH_BUFFER_BIT); // Hapus layar dan buffer kedalaman
glLoadIdentity(); //Reset matriks observasi model saat ini
//Baris kode berikutnya baru. glRotatef(Angle,Xvector,Yvector,Zvector) bertanggung jawab untuk memutar objek pada sumbu tertentu.
//Perintah ini memiliki banyak kegunaan. Sudut biasanya merupakan variabel yang mewakili sudut yang dilalui suatu benda.
//Ketiga parameter Xvector, Yvector dan Zvector bersama-sama menentukan arah sumbu rotasi.
//Misalnya vektor yang dijelaskan oleh (1,0,0) melewati 1 satuan sumbu koordinat X dan arahnya ke kanan.
//Vektor yang dijelaskan oleh (-1,0,0) melewati 1 satuan sumbu koordinat X, tetapi arahnya ke kiri.
//D.Michael Traub: Memberikan penjelasan di atas tentang Xvector, Yvector dan Zvector.
//Untuk lebih memahami rotasi X, Y dan Z, izinkan saya memberikan beberapa contoh...
//X-Axis - Anda menggunakan gergaji meja. Sumbu di tengah bilah ditempatkan dari kiri ke kanan (seperti sumbu X di OpenGL).
//Gigi gergaji yang tajam berputar liar pada sumbu X, seolah-olah mengarah ke atas atau ke bawah.
//Tergantung pada arah putaran mata gergaji. Ini adalah situasi yang sama seperti ketika kita memutar sesuatu di sekitar sumbu X di OpenGL.
//(Catatan Penerjemah: Jika saat ini kamu mendekatkan wajahmu ke monitor, kamu pasti akan digergaji^-^.)
//Sumbu Y - Katakanlah Anda berada di tengah-tengah tornado besar, dengan pusat tornado mengarah dari tanah ke langit (seperti sumbu Y di OpenGL).
//Sampah dan puing-puing berputar liar mengelilingi sumbu Y dari kiri ke kanan atau dari kanan ke kiri.
//Ini adalah situasi yang sama seperti ketika kita memutar sesuatu di sekitar sumbu Y di OpenGL.
//Z-Axis - Anda melihat kipas dari depan. Bagian tengah kipas mengarah tepat ke arah Anda (seperti sumbu Z di OpenGL).
//Bilah kipas berputar searah atau berlawanan arah jarum jam di sekitar sumbu Z. Ini adalah situasi yang sama seperti ketika kita memutar sesuatu di sekitar sumbu Z di OpenGL.
glTranslatef(-1.5, 0.0, -6.0); // Pindah ke kiri 1.5 unit dan ke layar 6.0
//Pada baris kode berikut, jika rtri sama dengan 7, kita memutar segitiga sebesar 7 dari kiri ke kanan di sekitar sumbu Y.
//Anda juga dapat mengubah nilai parameter untuk memutar segitiga di sekitar sumbu X dan Y secara bersamaan.
glRotatef(rtri, 0.0, 1.0, 0.0); // Memutar segitiga pada sumbu Y (baru)
//Tidak ada perubahan pada kode di bawah ini. Segitiga gradien berwarna digambar di sisi kiri layar dan diputar dari kiri ke kanan di sekitar sumbu Y.
glBegin(GL_TRIANGLES); // Menggambar segitiga
glColor3f(1.0, 0.0, 0.0); //Mengatur warna saat ini menjadi merah
glVertex3f(0.0, 1.0, 0.0); // Titik atas
glColor3f(0.0, 1.0, 0.0); //Mengatur warna saat ini menjadi hijau
glVertex3f(-1.0, -1.0, 0.0); // Kiri bawah
glColor3f(0.0, 0.0, 1.0); //Mengatur warna saat ini menjadi biru
glVertex3f(1.0, -1.0, 0.0); // Kanan bawah
glEnd(); // Akhir gambar segitiga
//Anda akan melihat pada kode di bawah bahwa kami telah menambahkan panggilan glLoadIdentity() lainnya.
//Tujuannya adalah untuk mereset matriks observasi model.
//Jika kita tidak mereset dan memanggil glTranslate secara langsung, hasil yang tidak diharapkan akan terjadi.
//Karena sumbu koordinat telah diputar, kemungkinan besar tidak sesuai arah yang Anda inginkan.
//Jadi yang semula ingin kita gerakkan objek ke kiri dan ke kanan bisa menjadi ke atas dan ke bawah, tergantung seberapa banyak kita memutar sumbu koordinatnya.
//Coba beri komentar pada glLoadIdentity() dan lihat hasil apa yang akan muncul.
//Setelah matriks observasi model direset, sumbu X, Y, dan Z semuanya direset, dan kita memanggil glTranslate.
//Anda akan melihat bahwa kali ini kita hanya memindahkan 1,5 unit ke kanan, bukan 3,0 unit seperti pelajaran sebelumnya.
//Karena saat kita mereset pemandangan, fokus kembali ke tengah pemandangan (pada 0,0).
//Dengan cara ini kamu hanya perlu memindahkan 1,5 unit ke kanan.
//Saat kita berpindah ke posisi baru, putar segi empat di sekitar sumbu X. Kotak akan berputar ke atas dan ke bawah.
glLoadIdentity(); //Setel ulang matriks observasi model
glTranslatef(1.5, 0.0, -6.0); // Pindah ke kanan 1,5 unit dan pindah ke layar 6.0
glRotatef(rquad, 1.0, 0.0, 0.0); // Memutar segi empat di sekitar sumbu X (baru)
glBegin(GL_QUADS); // Menggambar sebuah persegi
glColor3f(0.6, 0.2, 2.0); //Mengatur warna saat ini menjadi ungu
glVertex3f(-1.0, 1.0, 0.0); // Kiri atas
glVertex3f(1.0, 1.0, 0.0); // Kanan atas
glVertex3f(1.0, -1.0, 0.0); // Kiri bawah
glVertex3f(-1.0, -1.0, 0.0); // Kanan bawah
glEnd(); // Akhir dari gambar persegi
//Dua baris berikutnya baru.
//Jika rtri dan rquad dibayangkan sebagai container,
//Kemudian di awal program kita membuat container (rtri, dan rquad).
//Saat container dibuat, container tersebut kosong.
//Baris kode pertama di bawah menambahkan 0,2 ke container.
//Jadi setiap kali kita menjalankan kode sebelumnya, nilai dalam container rtri akan bertambah 0,2 di sini.
//Baris berikut mengurangi nilai dalam container rquad sebesar 0,15.
//Demikian pula, setiap kali kita menjalankan kode sebelumnya, nilai dalam container rquad akan turun sebesar 0,15 di sini.
//Jatuh pada akhirnya akan menyebabkan benda berputar berlawanan arah dengan arah tumbuhnya.
rtri := rtri + 0.2; // Menambah variabel putaran segitiga (baru)
rquad := rquad - 0.15; // Mengurangi variabel rotasi segi empat (baru)
Akhir;