Pergi ke kandungan

OpenGL/Kiub berputar warna-warni

Daripada Wikibuku

Kod sumber penuh untuk kiub berputar warna-warni

 #include <stdlib.h>
 #include <GL/glut.h>
 #include <math.h>

 void DisplayFunc(void)
 {
 static float alpha = 0;

 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 glLoadIdentity();

 glTranslatef(0, 0, -10);
 glRotatef(30, 1, 0, 0);
 glRotatef(alpha, 0, 1, 0);

 glBegin(GL_QUADS);

 glColor3f(0, 0, 0); glVertex3f(-1, -1, -1);
 glColor3f(0, 0, 1); glVertex3f(-1, -1,  1);
 glColor3f(0, 1, 1); glVertex3f(-1,  1,  1);
 glColor3f(0, 1, 0); glVertex3f(-1,  1, -1);

 glColor3f(1, 0, 0); glVertex3f( 1, -1, -1);
 glColor3f(1, 0, 1); glVertex3f( 1, -1,  1);
 glColor3f(1, 1, 1); glVertex3f( 1,  1,  1);
 glColor3f(1, 1, 0); glVertex3f( 1,  1, -1);

 glColor3f(0, 0, 0); glVertex3f(-1, -1, -1);
 glColor3f(0, 0, 1); glVertex3f(-1, -1,  1);
 glColor3f(1, 0, 1); glVertex3f( 1, -1,  1);
 glColor3f(1, 0, 0); glVertex3f( 1, -1, -1);

 glColor3f(0, 1, 0); glVertex3f(-1,  1, -1);
 glColor3f(0, 1, 1); glVertex3f(-1,  1,  1);
 glColor3f(1, 1, 1); glVertex3f( 1,  1,  1);
 glColor3f(1, 1, 0); glVertex3f( 1,  1, -1);

 glColor3f(0, 0, 0); glVertex3f(-1, -1, -1);
 glColor3f(0, 1, 0); glVertex3f(-1,  1, -1);
 glColor3f(1, 1, 0); glVertex3f( 1,  1, -1);
 glColor3f(1, 0, 0); glVertex3f( 1, -1, -1);

 glColor3f(0, 0, 1); glVertex3f(-1, -1,  1);
 glColor3f(0, 1, 1); glVertex3f(-1,  1,  1);
 glColor3f(1, 1, 1); glVertex3f( 1,  1,  1);
 glColor3f(1, 0, 1); glVertex3f( 1, -1,  1);

 glEnd();

 alpha = alpha + 0.1;

 glFlush();
 glutSwapBuffers();

 glutPostRedisplay();
 }

 void ReshapeFunc(int width, int height)
 {
 glMatrixMode(GL_PROJECTION);

 glLoadIdentity();
 gluPerspective(20, width / (float) height, 5, 15);
 glViewport(0, 0, width, height);

 glMatrixMode(GL_MODELVIEW);
 glutPostRedisplay();
 }

 void KeyboardFunc(unsigned char key, int x, int y)
 {

 int foo;
 foo = x + y; /* Has no effect: just to avoid a warning */
 if ('q' == key || 'Q' == key || 27 == key)
  exit(0);

 }
 int main(int argc, char **argv)

 {
 glutInit(&argc, argv);
 glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
 glutInitWindowSize(500, 500);
 glutCreateWindow("Kiub Berputar Warna Warni =)");

 glClearColor(0, 0, 0, 0);
 glEnable(GL_DEPTH_TEST);

 glutDisplayFunc(&DisplayFunc);
 glutReshapeFunc(&ReshapeFunc);
 glutKeyboardFunc(&KeyboardFunc);

 glutMainLoop();
 return 0;
 }

Kod dan penerangan

[sunting]
#include	<stdlib.h> 
Perpustakaan piawai bagi bahasa pengaturcaraan dalam pelaksanaan setiap bahasa
#include	<GL/glut.h>
Bila glut.h dimasukkan,gl.h dan glu.h akan dimasukkan bermasa.
#include	<math.h>
Mentakrifkan beberapa fungsi matematik
void DisplayFunc(void) 
fungsi dipanggil untuk mengemaskini paparan

{

 static float alpha = 0;
Kosongkan penimbal dan kosongkan matriks
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 glLoadIdentity(); 
menggantikan matriks dengan matriks identiti
Langkah ke belakang dan memutarkan kiub
 glTranslatef(0, 0, -10); 
fungsi glTranslate adalah darab matriks semasa oleh matriks terjemahan
 glRotatef(30, 1, 0, 0); 
fungsi glRotatef mendarab matriks semasa oleh matriks putaran.
 glRotatef(alpha, 0, 1, 0); 
fungsi glRotatef mendarab matriks semasa oleh matriks putaran.Langkah dimana untuk melukis quads
 glBegin(GL_QUADS); 
glBegin adalah membatasi mercu primitif atau seperti kumpulan primitif. Memperlakukan setiap empat kumpulan mercu sebagai kuadrilateral tak bersandar.
Tiap-tiap empat panggilan ke glVertex, quad dilukis.
 glColor3f(0, 0, 0); glVertex3f(-1, -1, -1); 
 glColor3f(0, 0, 1); glVertex3f(-1, -1,  1);
 glColor3f(0, 1, 1); glVertex3f(-1,  1,  1);
 glColor3f(0, 1, 0); glVertex3f(-1,  1, -1);
 glColor3f(1, 0, 0); glVertex3f( 1, -1, -1);
 glColor3f(1, 0, 1); glVertex3f( 1, -1,  1);
 glColor3f(1, 1, 1); glVertex3f( 1,  1,  1);
 glColor3f(1, 1, 0); glVertex3f( 1,  1, -1);
 glColor3f(0, 0, 0); glVertex3f(-1, -1, -1);
 glColor3f(0, 0, 1); glVertex3f(-1, -1,  1);
 glColor3f(1, 0, 1); glVertex3f( 1, -1,  1);
 glColor3f(1, 0, 0); glVertex3f( 1, -1, -1);
 glColor3f(0, 1, 0); glVertex3f(-1,  1, -1);
 glColor3f(0, 1, 1); glVertex3f(-1,  1,  1);
 glColor3f(1, 1, 1); glVertex3f( 1,  1,  1);
 glColor3f(1, 1, 0); glVertex3f( 1,  1, -1);
 glColor3f(0, 0, 0); glVertex3f(-1, -1, -1);
 glColor3f(0, 1, 0); glVertex3f(-1,  1, -1);
 glColor3f(1, 1, 0); glVertex3f( 1,  1, -1);
 glColor3f(1, 0, 0); glVertex3f( 1, -1, -1);
 glColor3f(0, 0, 1); glVertex3f(-1, -1,  1);
 glColor3f(0, 1, 1); glVertex3f(-1,  1,  1);
 glColor3f(1, 1, 1); glVertex3f( 1,  1,  1);
 glColor3f(1, 0, 1); glVertex3f( 1, -1,  1);
Set warna semasa
 glEnd(); 
fungsi glEnd membatasi mercu primitif atau seperti kumpulan primitif
 alpha = alpha + 0.1;
Putarkan sedikit
Berakhir
 glFlush(); 
berkuat kuasa pelaksanaan arahan GL dalam masa terhingga
 glutSwapBuffers(); 
glutSwapBuffers swap penimbal dari tetingkap semasa jika double buffered. Menjalankan swap penampan di atas lapisan digunakan untuk tetingkap semasa
Kemaskini lagi
 glutPostRedisplay(); 
glutPostRedisplay menandakan tetingkap semasa yang perlu menjadi redisplayed

}

Fungsi yang dipanggil apabila tetingkap yang diwujudkan atau disaizkan semula
void ReshapeFunc(int width, int height) 
fungsi yang dipanggil pada mengubah saiz tetingkap

{

 glMatrixMode(GL_PROJECTION);
glMatrixMode menentukan matriks mana yang menjadi matriks semasa. Gl_Projection pula menggunakan operasi matriks seterusnya kepada susunan matriks unjuran
 glLoadIdentity(); 
menggantikan matriks dengan matriks identiti
 gluPerspective(20, width / (float) height, 5, 15); 
gluPerspective adalah menetapkan matriks unjuran perspektif.
 glViewport(0, 0, width, height); 
glViewport adalah untuk menetapkan viewport.Tentukan sudut bawah kiri segi empat tepat viewport, dalam piksel. Nilai awal (0,0). Tentukan lebar dan tinggi daripada viewport.
 glMatrixMode(GL_MODELVIEW); 
glMatrixMode menentukan matriks yang matriks semasa.GL_MODELVIEW Menggunakan operasi matriks seterusnya kepada susunan matriks modelview.
 glutPostRedisplay(); 
glutPostRedisplay menandakan tetingkap semasa yang perlu menjadi redisplayed

}

Fungsi dipanggil apabila kekunci dilanggar
void KeyboardFunc(unsigned char key, int x, int y) 
fungsi kekunci standard ditekan

{

 int foo; 
mengisytiharkan interger bagi foo
 foo = x + y; 
Telah tiada kesan. Hanya untuk mengelakkan amaran
 if ('q' == key || 'Q' == key || 27 == key)
     exit(0);

}

int main(int argc, char **argv) 
char **argv adalah array multidimensi yang akan menyimpan semua argument yang diserahkan kepada fungsi

{

Penciptaan tetingkap
 glutInit(&argc, argv); 
glutInit digunakan untuk initialize GLUT library.
 glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); 
glutInitDisplayMode menetapkan mod paparan awal. GLUT_RGB untuk memilih tetingkap mod RGBA. Ini adalah default jika tidak GLUT_RGBA tidak GLUT_INDEX dinyatakan. GLUT_DOUBLE untuk memilih tetingkap double buffered. Ini mengatasi GLUT_SINGLE jika ia juga dinyatakan. GLUT_DEPTH untuk memilih tetingkap dengan depth buffer .
 glutInitWindowSize(500, 500); 
menetapkan kedudukan dan saiz tetingkap awal masing-masing
 glutCreateWindow("Kiub Berputar Warna Warni =)"); 
glutCreateWindow mewujudkan tetingkap top level.
Menetapkan OpenGL
 glClearColor(0, 0, 0, 0); 
menentukan nilai-nilai yang jelas bagi penimbal warna.menentukan merah,hijau,biru, dan alfa
 glEnable(GL_DEPTH_TEST); 
membolehkan atau mematikan keupayaan GL server-side. GL_DEPTH_TEST-Jika diaktifkan, melakukan perbandingan depth dan mengemaskini depth buffer .
Pengisytiharan untuk callbacks
 glutDisplayFunc(&DisplayFunc); 
menetapkan panggil balik paparan tetingkap semasa
 glutReshapeFunc(&ReshapeFunc); 
glutReshapeFunc set panggil balik membentuk semula bagi tetingkap semasa
 glutKeyboardFunc(&KeyboardFunc); 
glutKeyboardFunc menetapkan panggil balik papan kekunci untuk tetingkap semasa
loop ataupun berulang
 glutMainLoop(); 
glutMainLoop memasuki acara GLUT pemprosesan gelung
Tidak pernah dicapai
 return 0;
memulangkan pernyataan yang diperlukan

}

Lihat juga

[sunting]