OpenGL/Kiub berputar warna-warni
Penampilan
< OpenGL
(Dilencongkan daripada OpenGL/OpenGL - Kiub Berputar Warna Warni)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
}