Sunday, 10 March 2019

Contoh Projek OpenGL mini (membuat pohon) dengan pemrograman C++ dan CodeBlock

     Pada Hari ini kita akan membuat sebuah pohon dengan OpenGL dengan daun-daun yang terbuat dari bebearapa titik-titik dengan warna hijau. animasi ini tidak ada event khusus dalam membuatnya hanya diberi event mouse saja untuk memutar-mutar pohon menjadi bergerak. adapun hasil akhir yang akan anda buat adalah sebagai berikut :


adapun hal-hal yang dibutuhkan dalam mencoba program ini adalah sebagai berikut :
  1. Open GL download disini :  View openGL
  2. CodeBlock setting dengan openGL caranya lihat disini: view
  3. buka codeblock dan buat projek baru caranya dapat dilihat disini : view
  4. copy semua sourcode yang tersedia di blog ini.
silahkan copy contoh program dibawah ini ke projek yang anda buat. adapun sourcode yang akan anda coba adalah sebagai berikut.

Code Program

/*
 * GLUT Shapes Demo
 *
 * Written by Nigel Stewart November 2003
 *
 * This program is test harness for the sphere, cone
 * and torus shapes in GLUT.
 *
 * Spinning wireframe and smooth shaded shapes are
 * displayed until the ESC or q key is pressed.  The
 * number of geometry stacks and slices can be adjusted
 * using the + and - keys.
 */
#include<windows.h>
#ifdef __APPLE__
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#include<GL/glu.h>
#endif

#include <stdlib.h>

int flag=1;
GLfloat angle,angle2;
int moving,startx,starty;

/* GLUT callback Handlers */

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

    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-15.0, 15.0, -1.0, 20.0, -15.0, 15.0);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity() ;
}
void makecylinder(float height,float Base)
        {
            GLUquadricObj *qobj;
            qobj = gluNewQuadric();
            glColor3f(0.64f, 0.16f, 0.16f);
            glPushMatrix();
            glRotatef(-90, 1.0f, 0.0f, 0.0f);
            gluCylinder(qobj, Base, Base - (0.2 * Base), height, 20, 20);
            glPopMatrix();
        }
void maketree(float height,float Base)
        {

            glPushMatrix();



            float angle;
            makecylinder(height, Base);
            glTranslatef(0.0f, height,0.0f);
            height -=height*0.2f;
            Base -=Base*0.3f;
            for(int a=0; a<3; a++)
            {


                angle = 20+((rand()%50));
                if(angle >48)
                angle = -(20+((rand()%50)));
                if (height > 1)
                {
                    glPushMatrix();
                    if (flag)
                        glRotatef(angle, 1.0f, 0.0f, 1.0f);
                    else
                        glRotatef(angle, 0.0f, 1.0f, 1.0f);
                    flag = !flag;
                    maketree(height, Base); //recursive call
                    glPopMatrix();

                }
                else
                {
                    glColor3f(0.0f, 1.0f / a, 0.0f);
                    glutSolidSphere(0.1f, 10, 10);// for fruits.

                }
            }
            //Glut.glutSwapBuffers();
            glPopMatrix();
        }
static void display(void)
{
    const double t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
    const double a = t*90.0;
    srand(GLUT_ELAPSED_TIME);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
glRotatef(angle,0,1,0);
glRotatef(angle2,0,0,1);

    maketree(4.0f,0.1f);
    glutSwapBuffers();
  glFlush();
}


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


    }

    glutPostRedisplay();
}



void mouse(int btn,int state,int x,int y)
{
if(btn==GLUT_LEFT_BUTTON&&state==GLUT_DOWN)
{
moving=1;
startx=x;
starty=y;
}
if(btn==GLUT_LEFT_BUTTON&&state==GLUT_UP)
{
moving=0;
}
}
void motion(int x,int y)
{
if(moving)
{
angle=angle+(x-startx);
angle2=angle2+(y-starty);
startx=x;
starty=y;
glutPostRedisplay();
}
}


/* 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("Pohon Desain");

    glutReshapeFunc(resize);
    glutDisplayFunc(display);
    glutKeyboardFunc(key);

   glutMouseFunc(mouse);
    glutMotionFunc(motion);

    glClearColor(1,1,1,1);


    glEnable(GL_DEPTH_TEST);


    glutMainLoop();

    return EXIT_SUCCESS;
}



Features

tidak ada feature khusus dalam projek ini. fiture dalam projek ini hanya ada event mouse untuk memutar-mutar pohon yang kita buat.

hasil akhir yang akan kita buat akan membentuk animasi seperti dibawah ini:



demikian projek yang kali ini saya bagi semoga bermanfaat dan dapat dimanfaatkan untuk menyelesaikan tugas maupun untuk belajar menganalisa projek yang kita buat. terimakasih sudah berkunjung.


Daftar Pustaka

https://cglabprojects.blogspot.com/2018/04/fractal-tree-in-c-using-opengl.html




No comments:

Post a Comment

Tingkat keanekaragaman hayati tingkat gen

Tingkat keanekaragaman hayati tingkat gen -- Keanekaragaman hayati adalah sebuah istilah untuk menggambarkan keanekaragaman mahluk hidup di ...