Tugas Membuat Kipas Angin Menggunakan Opengl

  • Membuat kipas Angin dengan menggunakan Opengl menjadi salah satu mata kuliah komputer grafik di kampus-kampus terutama yang mengambil jurusan Teknik Informatika. pada kesempatan ini saya akan memberikan cheat tentang tugas komputer grafik bagaimana cara membuat kipas Angin dengan menggunakan OpenGL. 
  • Dalam membuat kipas angin, terdapat beberapa komponen yang digunakan dalam bentuk 3 dimensi. seperti pada kasus ini saya menggunakan: gambar tabung yang digunakan sebagai tombol kipas angin, gambar donat (torus) yang sudah saya modifikasi bentuknya sehingga bentuknya menjadi seperti baling-baling yang akan digunakan sebagai kipasnya, dan ada juga 2 buah cube (kubus) yang digunakan sebagai tiang penyangga kipas dan juga sebagai alas kipas dan yang terakhir ada gambar sphere (bola) yang digunakan sebagai rumah dari baling-baling. 
  • Tentunya pada mata kuliah komputer grafik, untuk membuat kipas angin tersebut terdiri dari beberapa fungsi yang dibuat, seperti fungsi untuk memutar baling-baling pada kipas angin tersebut dengan menggunakan fungsi timer (jika ingin mengetahui tentang fungsi timer sederhana maka bisa dilihat di postingan sebelumnya tentang membuat ayunan 2d dengan menggunakan fungsi timer opengl ) , kemudian ada juga fungsi yang digunakan sebagai pencahayaan / lighting. fungsi tersebut digunakan untuk memberi efek cahaya pada objek sehingga terlihat nyata dengan adanya sisi gelap terang. terdapat juga fungsi mouse yang digunakan apabila objek tersebut akan digerakan dengan cara menekan tombol pada mouse, pada program yang saya berikan ini terdapat 1 fungsi tombol mouse dimana saat Anda menekan tombol klik kiri pada mouse maka rumah kipas angin akan bergerak 90 derajat ke arah kanan. terdapat juga fungsi dari keyboard seperti:

  1. menekan angka 1 maka akan memutar baling-baling kipas angin dengan kecepatan renda
  2. menekan angka 2 makan akan memberi perintah memutar kipas angin dengan kecepatan sedang
  3. menekan  angka 3 pada keyboard maka akan membuat kipas angin berputar dengan kecepatan maksimum
  4. menekan angka 0 pada keyboard maka akan menghentikan kipas yang sedang berputar
  5. pada saat menekan simbol "+" (tambah), maka akan membuat kipas angin memiliki banyak titik sudut, begitu juga sebaliknya saat menekan simbol "-" pada keyboard Anda.
Pasti sudah tidak sabar untuk melihat bagaimana skrip yang digunakan untuk membuatnya kan? untuk itu langsung saja saya berikan skripnya dibawah ini.


#include
#ifdef __APPLE__
#include 
#else
#include 
#endif

#include 
#include 

//float sudut=0,sx=0,sy=0,sz=0;
int index=0;
double tbly1 = 3;
double tbly2 = 3;
double tbly3 = 3;
double tbly4 = 3;
GLfloat ctrlpoints[4][4][3] =
{
{{ -1.5, -1.5, 4.0}, { -0.5, -1.5, 2.0}, {0.5, -1.5, -1.0}, {1.5, -1.5, 2.0}},
{{ -1.5, -0.5, 1.0}, { -0.5, -0.5, 3.0},{0.5, -0.5, 0.0},{1.5, -0.5, -1.0}},
{{ -1.5, 0.5, 4.0}, { -0.5, 0.5, 0.0},{0.5, 0.5, 3.0}, {1.5, 0.5, 4.0}},
{{ -1.5, 1.5, -2.0}, { -0.5, 1.5, -2.0}, {0.5, 1.5, 0.0}, {1.5, 1.5, -1.0}}
};

GLfloat texpts[2][2][2] =
{
{{0.0, 0.0}, {0.0, 1.0}},
{{1.0, 0.0}, {1.0, 1.0}}
};

void init(void)
{
glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, &ctrlpoints[0][0][0]);
glMap2f(GL_MAP2_TEXTURE_COORD_2, 0, 1, 2, 2, 0, 1, 4, 2, &texpts[0][0][0]);
glEnable(GL_MAP2_TEXTURE_COORD_2);
glEnable(GL_MAP2_VERTEX_3);
glMapGrid2f(20, 0.0, 1.0, 20, 0.0, 1.0);
//makeImage();
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

glEnable(GL_TEXTURE_2D); glEnable(GL_DEPTH_TEST); glShadeModel (GL_FLAT);
}

static int slices = 3;
static int stacks = 3;

int x =0;
int zputer=0;
int zbalik=45;
int ujung,r=0;
    int tim=20;



void timer(int value)
{

    if(r <= 90 && ujung==0 )
    {
        x++;
        if  (x==90)
            {
                ujung=1;
            }
    }
    else if(ujung == 1 && r>-90)
    {
        x--;
        if(x==-90)
        {
            ujung=0;
        }
    }

    glutPostRedisplay();
    glutTimerFunc(tim,timer,0);
}


static void resize(int width, int height)
{
    const float ar = (float) width / (float) height;

    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glFrustum(-ar, ar, -1.0, 1.0, 2.0, 100.0);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity() ;
}



void tbl()
{
    //glClear(GL_COLOR_BUFFER_BIT);

    glBegin(GL_POLYGON);
    GLUquadricObj *obj = gluNewQuadric();
    //glTranslatef(13,3,-2);
    gluCylinder(obj, 0.1, 0.1, 4.5, 50, 50);
    glEnd();
}


static void display2(void)
{
    init();
    glPushMatrix();
            /*membuat objek 3d*/
            glColor3d(1,1,0);
            glScalef(0.7,0.1,0.9);
            glTranslated(0,-14,-5.5);
            glutSolidCube(2);
            glColor3d(0,1,0);
        glPushMatrix();
            glTranslated(-0.6,tbly1,0.5);
            glRotatef(90,90,0,0);
            tbl();
        glPopMatrix();

        glPushMatrix();
            glColor3d(0,1,0);
            glTranslated(-0.2,tbly2,0.5);
            glRotatef(90,90,0,0);
            tbl();
        glPopMatrix();

        glPushMatrix();
        glColor3d(0,1,0);
            glTranslated(0.2,tbly3,0.5);
            glRotatef(90,90,0,0);
            tbl();
        glPopMatrix();

        glTranslated(0.6,tbly4,0.5);
        glColor3d(1,0,0);
            glRotatef(90,90,0,0);
            tbl();
    glPopMatrix();

}

static void display(void)
{

    const double t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
    const double a = t*index;

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glColor3d(1,0,0);

    glPushMatrix();
    glColor3d(0.5,0.5,0.5);
        glTranslated(0,0,-6);
        glRotated(60,1,0,0);
        glScalef(0.4,0.4,3);
        glutSolidCube(1);
    glPopMatrix();

    glPushMatrix();
    glColor3d(1,0,1);
        glTranslated(0,1.2,-6);
        glRotated(x,0,x,1);
        glScalef(1,1,0.3);
        glutWireSphere(1.5,16,16);

        glRotated(60,0,0,45);
        glRotated(a,0,0,1);
        glScalef(0.7,0.7,0.7);
        glutSolidTorus(1,1,slices,stacks);
        glRotated(60,0,0,90);
        glutSolidTorus(1,1,slices,stacks);
        glScalef(0.8,0.8,0.8);
        glutSolidSphere(1,slices+6,stacks+6);
    glPopMatrix();

//panggil fungsi
    display2();
    //display3();
    glutSwapBuffers();
}

static void key(unsigned char key, int x, int y)
{
    switch (key)
    {
        case 27 :
        case 'q':
            exit(0);
            break;

        case '+':
            slices++;
            stacks++;
            break;

        case '-':
            if (slices>3 && stacks>3)
            {
                slices--;
                stacks--;
            }
            break;

        case '0':
            index=0;
            tbly1 = 3;
            tbly2 = 3;
            tbly3 = 3;
            tbly4 = 2.1;
            break;

        case '1':
            index=300;
            tbly1 = 2.1;
            tbly2 = 3;
            tbly3 = 3;
            tbly4 = 3;
            break;

        case '2':
            index=600;
            tbly1 = 3;
            tbly2 = 2.1;
            tbly3 = 3;
            tbly4 = 3;
            break;

        case '3':
            index=900;
            tbly1 = 3;
            tbly2 = 3;
            tbly3 = 2.1;
            tbly4 = 3;
            break;

        case '4':
            glutTimerFunc(0,timer,0);
            break;

    }

    glutPostRedisplay();
}

void mouseku(int button, int state, int x, int y){
    if(button==GLUT_LEFT_BUTTON){
     glutTimerFunc(0,timer,0);
}}

static void idle(void)
{
    glutPostRedisplay();
}

const GLfloat light_ambient[]  = { 0.0f, 0.0f, 0.0f, 1.0f };
const GLfloat light_diffuse[]  = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_position[] = { 2.0f, 5.0f, 5.0f, 0.0f };

const GLfloat mat_ambient[]    = { 0.7f, 0.7f, 0.7f, 1.0f };
const GLfloat mat_diffuse[]    = { 0.8f, 0.8f, 0.8f, 1.0f };
const GLfloat mat_specular[]   = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat high_shininess[] = { 100.0f };

/* Program entry point */

int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitWindowSize(640,480);
    glutInitWindowPosition(10,10);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);

    glutCreateWindow("GLUT Shapes");

    glutReshapeFunc(resize);
    init();
    glutDisplayFunc(display);

    glutKeyboardFunc(key);
    glutIdleFunc(idle);

    glClearColor(1,1,1,1);
    glEnable(GL_CULL_FACE);
    glCullFace(GL_BACK);

    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);
    // lightning
    glEnable(GL_LIGHT0);
    glEnable(GL_NORMALIZE);
    glEnable(GL_COLOR_MATERIAL);
    glEnable(GL_LIGHTING);

    glLightfv(GL_LIGHT0, GL_AMBIENT,  light_ambient);
    glLightfv(GL_LIGHT0, GL_DIFFUSE,  light_diffuse);
    glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);

    glMaterialfv(GL_FRONT, GL_AMBIENT,   mat_ambient);
    glMaterialfv(GL_FRONT, GL_DIFFUSE,   mat_diffuse);
    glMaterialfv(GL_FRONT, GL_SPECULAR,  mat_specular);
    glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);

    glutMouseFunc(mouseku);
    glutMainLoop();

    return EXIT_SUCCESS;
}

SHARE

Unknown

  • Image
  • Image
  • Image
  • Image
  • Image
    Blogger Comment
    Facebook Comment

3 komentar: