Kamis, 10 Mei 2018

pertemuan 6

// kode dasar untuk semua praktikum grafika komputer
// adhi prahara. 2018

// deklarasikan semua header disini
#include <windows.h>
#include <glut.h>

// inisialisasi variabel untuk transformasi seperti translasi, rotasi atau scaling
float angle = 0.0f;     // sudut transformasi kamera
float posX = 0.0f, rotX =  0.0f; // posisi kamera di sumbu X
float posY = 0.0f, rotY =  0.0f; // posisi kamera di sumbu Y
float posZ = 5.0f, rotZ = -1.0f; // posisi kamera di sumbu Z

float objectAngleX = 0.0f;   // sudut tranformasi obyek di sumbu X
float objectAngleY = 0.0f;   // sudut tranformasi obyek di sumbu Y
float objectAngleZ = 0.0f;   // sudut tranformasi obyek di sumbu Z

// fungsi untuk menggambar kubus
void drawCube()
{
 glBegin(GL_QUADS);
 // beri warna merah di sisi depan
 glColor3f(1.0f, 0.0f, 0.0f);
 // buat sisi depan 
 glVertex3f(-1.0f, -1.0f, 1.0f);
 glVertex3f( 1.0f, -1.0f, 1.0f);
 glVertex3f( 1.0f,  1.0f, 1.0f);
 glVertex3f(-1.0f,  1.0f, 1.0f);
 // beri warna hijau di sisi belakang
 glColor3f(0.0f, 1.0f, 0.0f);
 // buat sisi belakang
 glVertex3f(-1.0f, -1.0f,-1.0f);
 glVertex3f( 1.0f, -1.0f,-1.0f);
 glVertex3f( 1.0f,  1.0f,-1.0f);
 glVertex3f(-1.0f,  1.0f,-1.0f);
 // beri warna biru di sisi kiri
 glColor3f(0.0f, 0.0f, 1.0f);
 // buat sisi kiri
 glVertex3f(-1.0f, -1.0f, 1.0f);
 glVertex3f(-1.0f, -1.0f,-1.0f);
 glVertex3f(-1.0f,  1.0f,-1.0f);
 glVertex3f(-1.0f,  1.0f, 1.0f);
 // beri warna cyan di sisi kanan
 glColor3f(0.0f, 1.0f, 1.0f);
 // buat sisi kanan
 glVertex3f( 1.0f, -1.0f, 1.0f);
 glVertex3f( 1.0f, -1.0f,-1.0f);
 glVertex3f( 1.0f,  1.0f,-1.0f);
 glVertex3f( 1.0f,  1.0f, 1.0f);
 // beri warna kuning di sisi atas
 glColor3f(1.0f, 1.0f, 0.0f);
 // buat sisi atas
 glVertex3f(-1.0f,  1.0f, 1.0f);
 glVertex3f( 1.0f,  1.0f, 1.0f);
 glVertex3f( 1.0f,  1.0f,-1.0f);
 glVertex3f(-1.0f,  1.0f,-1.0f);
 // beri warna magenta di sisi bawah
 glColor3f(1.0f, 0.0f, 1.0f);
 // buat sisi bawah
 glVertex3f(-1.0f, -1.0f, 1.0f);
 glVertex3f( 1.0f, -1.0f, 1.0f);
 glVertex3f( 1.0f, -1.0f,-1.0f);
 glVertex3f(-1.0f, -1.0f,-1.0f);
 glEnd();
}

// fungsi untuk menggambar silinder
void drawCylinder(float radius, float height, int slices, int stacks)
{
 glPushMatrix();

 GLUquadricObj* cyl = gluNewQuadric();
 gluQuadricDrawStyle(cyl, GLU_FILL);
 gluQuadricNormals(cyl, GLU_SMOOTH);
 gluQuadricOrientation(cyl, GLU_INSIDE);

 // buat tutup atas silinder
 glTranslatef(0.0f, -height/2, 0.0f);
 glRotatef(-90, 1.0f, 0.0f, 0.0f);
 glColor3f(1.0f, 1.0f, 0.0f); // warna kuning
 gluDisk(cyl, 0.0f, radius, slices, stacks);
 // buat badan silinder
 glColor3f(1.0f, 0.0f, 0.0f); // warna merah
 gluCylinder(cyl, radius, radius, height, slices, stacks);
 // buat tutup bawah silinder
 glColor3f(1.0f, 1.0f, 0.0f); // warna kuning
 glTranslatef(0.0f, 0.0f, 1.0f);
 gluDisk(cyl, 0.0f, 0.0f, slices, stacks);

 glPopMatrix();
}

// fungsi untuk menggambar bola
void drawSphere(float radius, int slices, int stacks)
{
 glPushMatrix();

 glColor3f(1.0f, 0.0f, 0.0f); // warna merah
 GLUquadric *sphere = gluNewQuadric();
 gluQuadricDrawStyle(sphere, GLU_FILL);
 gluQuadricNormals(sphere, GLU_SMOOTH);
 gluSphere(sphere, radius, slices, stacks);

 glPopMatrix();
}

// fungsi untuk menggambar obyek kubus
void drawObject()
{
 // obyek bisa dimasukkan diantara glPushMatrix() dan glPopMatrix() 
 // fungsinya agar obyek tidak terpengaruh atau mempengaruhi obyek lain
 // saat diwarnai, ditransformasi dan sebagainya
 glPushMatrix();

 // operasi transformasi rotasi obyek ke arah kanan-kiri
 glRotatef(objectAngleY, 0.0f, 1.0f, 0.0f);

 glPushMatrix();

 // operasi transformasi rotasi obyek ke arah atas-bawah
 glRotatef(objectAngleX, 1.0f, 0.0f, 0.0f);

 // set warna obyek ke warna hijau (0.0f, 1.0f, 0.0f)
 glColor3f(0.0f, 1.0f, 0.0f);

 // membuat obyek kubus
 drawCube();

 // membuat obyek silinder
 //drawCylinder(1.0f, 2.0f, 20, 20);

 // membuat obyek bola
 //drawSphere(1.0f, 50, 50);

 // membuat obyek polyhedron
 //glutSolidTetrahedron();
 //glutSolidOctahedron();
 //glutSolidDodecahedron();
 //glutSolidIcosahedron();
 //glutSolidCube(1.0f);
 //glutSolidCone(1.0f, 1.0f, 50, 50);
 //glutSolidSphere(1.0f, 50, 50);
 //glutSolidTeapot(1.0f);
 //glutSolidTorus(0.5f, 1.0f, 20, 20);

 glPopMatrix();

 glPopMatrix();
}

// taruh semua obyek yang akan digambar di fungsi display()
void display()
{
 // bersihkan dan reset layar dan buffer
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 glLoadIdentity();

 // posisikan kamera pandang
 // dalam hal ini sumbu Y ada diatas dan posisi kamera pandang di (posX, posY, posZ)
 gluLookAt(posX, posY, posZ, posX + rotX, posY + rotY, posZ + rotZ, 0.0f, 1.0f, 0.0f);

 // panggil fungsi untuk menggambar obyek
 drawObject();
 
 // tampilkan obyek ke layar
 // gunakan glFlush() bila memakai single buffer
 // gunakan glutSwapBuffers() bila memakai double buffer
 glutSwapBuffers();
}

// inisialisasikan variabel, pencahayaan, tekstur dan pengaturan kamera pandang di fungsi init()
void init(void)
{
 // inisialisasi warna latar belakang layar dalam hal ini warna putih (1.0, 1.0, 1.0, 0.0)
 glClearColor(1.0, 1.0, 1.0, 0.0);
 glEnable(GL_DEPTH_TEST);    // mengaktifkan depth buffer
 glMatrixMode(GL_PROJECTION);  
 glLoadIdentity();
 gluPerspective(45.0, 1.0, 1.0, 100.0); // set proyeksi ke perspektif
 glMatrixMode(GL_MODELVIEW);    
 glLoadIdentity();      
 // inisialisasi kamera pandang
 gluLookAt(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
 // enable lighting
 glEnable(GL_LIGHTING);
 glEnable(GL_COLOR_MATERIAL);
 glEnable(GL_LIGHT0);
}

// fungsi ini digunakan bila layar akan diresize (default)
void reshape(int w, int h)
{
 glViewport(0, 0, (GLsizei)w, (GLsizei)h);
 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();
 gluPerspective(45, (GLfloat)w / (GLfloat)h, 1.0, 100.0);
 glMatrixMode(GL_MODELVIEW);
}

// fungsi untuk mengatur masukan dari keyboard 
// untuk arah kiri, kanan, atas, bawah, PgUp, dan PgDn
void keyboard(int key, int x, int y)
{
 float fraction = 0.1f;

 switch (key) 
 {
 // masukkan perintah disini bila tombol kiri ditekan
 case GLUT_KEY_LEFT:
  // dalam hal ini perintah rotasi obyek ke kiri sebanyak 1 derajat 
  objectAngleY -= 1.0f;
  glutPostRedisplay(); // update obyek
  break;
 // masukkan perintah disini bila tombol kanan ditekan
 case GLUT_KEY_RIGHT:  
  // dalam hal ini perintah rotasi obyek ke kanan sebanyak 1 derajat 
  objectAngleY += 1.0f;
  glutPostRedisplay(); // update obyek
  break;
 // masukkan perintah disini bila tombol atas ditekan
 case GLUT_KEY_UP:  
  // dalam hal ini perintah rotasi obyek ke atas sebanyak 1 derajat 
  objectAngleX -= 1.0f;
  glutPostRedisplay(); // update obyek
  break;
 // masukkan perintah disini bila tombol bawah ditekan
 case GLUT_KEY_DOWN:  
  // dalam hal ini perintah rotasi obyek ke bawah sebanyak 1 derajat 
  objectAngleX += 1.0f;
  glutPostRedisplay(); // update obyek
  break;
 // zoom in
 case GLUT_KEY_PAGE_UP:
  // masukkan perintah disini bila tombol PgUp ditekan
  posX += rotX * fraction;  
  posZ += rotZ * fraction;
  glutPostRedisplay(); // update obyek
  break;
 // zoom out
 case GLUT_KEY_PAGE_DOWN:
  // masukkan perintah disini bila tombol PgDn ditekan
  posX -= rotX * fraction;
  posZ -= rotZ * fraction;
  glutPostRedisplay(); // update obyek
  break;
 }
}

// timer untuk animasi (gunakan bila perlu)
void timer(int value)
{
 glutPostRedisplay();
 glutTimerFunc(55, timer, 0);
}

// program utama
int main(int argc, char** argv)
{
 // inisialisasi jendela OpenGL
 // GLUT_SINGLE berarti memakai single buffer
 // GLUT_DOUBLE berarti memakai double buffer
 // GLUT_RGB berarti mode tampilan yang dipakai RGB
 // GLUT_RGBA berarti mode tampilan yang dipakai RGBA
 // GLUT_DEPTH berarti memakai depth buffer
 glutInit(&argc, argv);
 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);

 // set ukuran jendela tampilan
 glutInitWindowSize(480, 480);  // besarnya jendela dalam piksel dalam hal ini 300x300
 glutInitWindowPosition(100, 100); // posisi jendela dilayar komputer dalam piksel
 // judul jendela (wajib diubah dengan informasi NAMA / NIM - JUDUL PRAKTIKUM masing-masing)
 glutCreateWindow("NAMA / NIM - KODE DASAR PRAKTIKUM GRAFIKA KOMPUTER");
 
 // panggil fungsi init untuk inisialisasi awal
 init();

 // event handler untuk display, reshape dan keyboard
 glutDisplayFunc(display);   // display
 glutReshapeFunc(reshape);   // reshape
 glutSpecialFunc(keyboard);  // keyboard
 //glutTimerFunc(0, timer, 0); // aktifkan timer bila perlu

 // looping
 glutMainLoop();

 return 0;
}

0 komentar:

Posting Komentar