Projek Mini openGL kali ini anda akan membuat sebuah projek Rumah dengan segala aktifitasnya. misalnya membuka gerbang depan, gerbang samping, pintu depan, pintu atas, tengah dan menyalakan kipas angin. semua pengaturan semua berada di mouse untuk menjalankannya. adapun projek yang akan andal lakukan akan menghasilkan hasil seperti divideo berikut ini :
Untuk bisa melakukan projek diatas anda harus menyeting semua kebutuhan yang kita butuhkan diantaranya adalah sebagai berikut.
- Open GL download disini : view
- CodeBlock setting dengan openGL caranya lihat disini: view
- buka codeblock dan buat projek baru caranya dapat dilihat disini : view
- copy semua sourcode yang tersedia di blog ini.
Adapun sourcode yang anda butuhkan untuk mencobanya berada di bawah ini. silahkan copy source code berikut ini ke projek yang anda buat.
Code Program
#include<GL/glut.h>
#include <time.h>
double w=1280,h=720;
double view[3]={2,2,12.9};
double look[3]={2,2,2};
int flag=-1;
void steps(void);
void window(void);
void sgate(void);
void gate(void);
double angle=0,speed=5,maino=0,romo=0,tro=0,mgo=0,sgo=0;
//declarating quadric objects
GLUquadricObj *Cylinder;
GLUquadricObj *Disk;
struct tm *newtime;
time_t ltime;
GLfloat angle1;
//initialisation
void myinit(void)
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-1.0,1.0,-1*w/h,1*w/h,1,200.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
//defining new quadric object
Cylinder = gluNewQuadric();
//to set drawing style
gluQuadricDrawStyle( Cylinder, GLU_FILL);
//to set automatic normals
gluQuadricNormals( Cylinder,GLU_SMOOTH);
Disk = gluNewQuadric();
gluQuadricDrawStyle( Disk, GLU_FILL);
gluQuadricNormals( Disk, GLU_SMOOTH);
GLfloat gam[]={0.2,.2,.2,1};
glLightModelfv(GL_LIGHT_MODEL_AMBIENT,gam);
}
//set material property
void matprop(GLfloat amb[],GLfloat dif[],GLfloat spec[],GLfloat shi[])
{
glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,amb);
glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,dif);
glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,spec);
glMaterialfv(GL_FRONT_AND_BACK,GL_SHININESS,shi);
}
//to create wall
void wall(double thickness)
{
glPushMatrix();
glTranslated(2,.5*thickness,2);
glScaled(4.0,thickness,4.0);
glutSolidCube(1.0);
glPopMatrix();
}
//to create compound wall
void wall2(double thickness)
{
glPushMatrix();
glTranslated(.8,.5*thickness*4,3.5);
glScaled(1.6,thickness*4,7.0);
glutSolidCube(1.0);
glPopMatrix();
}
//to create earth
void earth(void)
{
GLfloat ambient[]={1,0,0,1};
GLfloat specular[]={0,1,1,1};
GLfloat diffuse[]={.5,.5,.5,1};
GLfloat shininess[]={50};
matprop(ambient,diffuse,specular,shininess);
GLfloat lightIntensity[]={.7,.7,.7,1};
GLfloat light_position[]={2,5,-3,0};
glLightfv(GL_LIGHT0,GL_POSITION,light_position);
glLightfv(GL_LIGHT0,GL_DIFFUSE,lightIntensity);
glPushMatrix();
glTranslated(0,-.25,0);
glScaled(10000,.5,1000000);
glutSolidCube(1.0);
glPopMatrix();
glFlush();
}
void compound(void)
{
GLfloat ambient[]={1,0,0,1};
GLfloat specular[]={0,1,1,1};
GLfloat diffuse[]={.7,1,.7,1};
GLfloat shininess[]={50};
matprop(ambient,diffuse,specular,shininess);
GLfloat lightIntensity[]={.7,.7,.7,1};
GLfloat light_position[]={2,6,1.5,0};
glLightfv(GL_LIGHT0,GL_POSITION,light_position);
glLightfv(GL_LIGHT0,GL_DIFFUSE,lightIntensity);
//left wall of compound
glPushMatrix();
glPushMatrix();
glTranslated(-4,0,-1-.04);
glRotated(90.0,0,0,1);
wall2(0.08);
glPopMatrix();
//right wall of compound
glPushMatrix();
glTranslated(8,0,-1-.02);
glRotated(90.0,0,0,1);
wall2(0.08);
glPopMatrix();
//back wall of compound
glPushMatrix();
glTranslated(2,.8,-1);
glRotated(-90,1,0,0);
glScaled(12,.02*4,1.6);
glutSolidCube(1.0);
glPopMatrix();
//front left wall of compound
glPushMatrix();
glTranslated(-3,.8,6-.08);
glRotated(-90,1,0,0);
glScaled(2,.02*4,1.6);
glutSolidCube(1.0);
glPopMatrix();
//front middle wall of compound
glPushMatrix();
glTranslated(2.5,.8,6-.08);
glRotated(-90,1,0,0);
glScaled(6,.02*4,1.6);
glutSolidCube(1.0);
glPopMatrix();
//front right wall of compound
glPushMatrix();
glTranslated(7,.8,6-.08);
glRotated(-90,1,0,0);
glScaled(2,.02*4,1.6);
glutSolidCube(1.0);
glPopMatrix();
glPopMatrix();
GLfloat ambient2[]={0,1,0,1};
GLfloat specular2[]={1,1,1,1};
GLfloat diffuse2[]={.2,.6,0.1,1};
GLfloat shininess2[]={50};
matprop(ambient2,diffuse2,specular2,shininess2);
//floor
glPushMatrix();
glTranslated(-4,-0.05,-1);
glScaled(3,3,1.7);
wall(0.08);
glPopMatrix();
gate();
sgate();
glFlush();
}
void room()
{
GLfloat ambient1[]={1,0,1,1};
GLfloat specular1[]={1,1,1,1};
GLfloat diffuse1[]={0.5,0.5,0.5,1};
GLfloat mat_shininess[]={50};
matprop(ambient1,diffuse1,specular1,mat_shininess);
glPushMatrix();
glTranslated(.5,4,.5);
//roof
glPushMatrix();
glTranslated(-.02*4,.7*3.9,-.02*4);
glScaled(.6+.02,1.5,.5+.02+.1);
wall(0.08);
glPopMatrix();
GLfloat ambient2[]={1,0,0,1};
GLfloat specular2[]={1,1,1,1};
GLfloat diffuse2[]={1,1,.7,1};
GLfloat shininess1[]={50};
matprop(ambient2,diffuse2,specular2,shininess1);
//left wall
glPushMatrix();
glTranslated(0,0,-.02);
glScaled(1,.7,.5);
glRotated(90.0,0,0,1);
wall(0.08);
glPopMatrix();
//right wall
glPushMatrix();
glTranslated(2.4,0,-.02);
glScaled(1,.7,.5);
glRotated(90.0,0,0,1);
wall(0.08);
glPopMatrix();
//back wall
glPushMatrix();
glTranslated(-.08,0,0);
glScaled(.62,.7,1);
glRotated(-90.0,1,0,0);
wall(0.08);
glPopMatrix();
//front wall
glPushMatrix();
glTranslated(-0.08,0,2);
glScaled(.5,.7,1);
glRotated(-90.0,1,0,0);
wall(0.08);
glPopMatrix();
//wall above the room door
glPushMatrix();
glTranslated(1.9,.7*3,2);
glScaled(.11,.7*.25,1);
glRotated(-90.0,1,0,0);
wall(0.08);
glPopMatrix();
GLfloat ambient[]={1,0.5,.5,1};
GLfloat specular[]={1,1,1,1};
GLfloat diffuse[]={1,0.5,0.5,1};
matprop(ambient,diffuse,specular,mat_shininess);
//door
glPushMatrix();
glTranslated(2.3,0,(2-.05));
glRotated(-tro,0,1,0);
glTranslated(-2.3,0,-(2-.05));
glPushMatrix();
glTranslated(1.927,0,2);
glScaled(.09,.525,1);
glRotated(-90.0,1,0,0);
wall(0.02);
glPopMatrix();
glPushMatrix();
glTranslated(2.3,0,2-.05);
glScaled(.6,.7,.8);
glRotated(-90,1,0,0);
gluCylinder(Cylinder, 0.05, 0.05, 3, 16, 16);
glPopMatrix();
glPopMatrix();
glPopMatrix();
}
void tankwall(float thk)
{
glTranslated(.5,.5*thk,.5);
glScaled(1,thk,1);
glutSolidCube(1);
}
void watertank(void)
{
float thk=.04,hght=1,wdth=1,bdth=1;
GLfloat ambient1[]={.5,0,1,1};
GLfloat specular1[]={1,1,1,1};
GLfloat diffuse1[]={.5,.8,1,1};
GLfloat mat_shininess[]={50};
matprop(ambient1,diffuse1,specular1,mat_shininess);
glPushMatrix();
glTranslated(1.5,4+4*.7,1.5);
glScaled(.8,.8,.8);
//tank floor
glPushMatrix();
glScaled(wdth,1,bdth);
tankwall(thk);
glPopMatrix();
//tank left wall
glPushMatrix();
glScaled(1,hght,bdth);
glRotated(90.0,0,0,1);
tankwall(thk);
glPopMatrix();
//tank right wall
glPushMatrix();
glTranslated(wdth,0,0);
glScaled(1,hght,bdth);
glRotated(90.0,0,0,1);
tankwall(thk);
glPopMatrix();
//tank back wall
glPushMatrix();
glScaled(wdth,hght,1);
glRotated(-90.0,1,0,0);
tankwall(0.04);
glPopMatrix();
//tank front wall
glPushMatrix();
glTranslated(0,0,bdth);
glScaled(wdth,hght,1);
glRotated(-90.0,1,0,0);
tankwall(0.04);
glPopMatrix();
//tank roof
glPushMatrix();
glTranslated(-thk,hght,0);
glScaled(wdth*.8,1,bdth);
tankwall(0.04);
glPopMatrix();
glPushMatrix();
glTranslated(wdth*.8-thk,hght,0);
glScaled(wdth*.2+thk,1,bdth*.6);
tankwall(0.04);
glPopMatrix();
glPopMatrix();
}
void terece(void)
{
GLfloat ambient1[]={1,0,1,1};
GLfloat specular1[]={1,1,1,1};
GLfloat diffuse1[]={0.5,0.5,0.5,1};
GLfloat mat_shininess[]={50};
matprop(ambient1,diffuse1,specular1,mat_shininess);
glPushMatrix();
glTranslated(0,4,0);
glScaled(1,.1,1);
//left wall
glPushMatrix();
glTranslated(0,0,-.02-.25);
glScaled(1,1,.95);
glRotated(90.0,0,0,1);
wall(0.08);
glPopMatrix();
//right wall
glPushMatrix();
glTranslated(6+.12,0,-.02-.27);
glScaled(1,1,1.1);
glRotated(90.0,0,0,1);
wall(0.08);
glPopMatrix();
//back wall
glPushMatrix();
glTranslated(-.08,0,-.21);
glScaled(1.5+.05,1,1);
glRotated(-90.0,1,0,0);
wall(0.08);
glPopMatrix();
//front wall
glPushMatrix();
glTranslated(-.08,0,4+.11);
glScaled(1.5+.05,1,1);
glRotated(-90.0,1,0,0);
wall(0.08);
glPopMatrix();
glPushMatrix();
glTranslated(-.04,2,4);
glScaled(.08,4,.1);
glutSolidCube(1);
glPopMatrix();
glPopMatrix();
}
void fanwing(float winglen)
{
glPushMatrix();
glRotated(90,1,0,0);
glRotated(90,0,1,0);
glScaled(1,15,1);
gluCylinder(Cylinder,.01,.01,1,4,1);
glPopMatrix();
}
void fanbottom()
{
glPushMatrix();
glTranslated(1,3.2,1);
glPushMatrix();
glRotated(90,1,0,0);
gluCylinder(Cylinder, .2, .2,.05, 128, 16);
glPopMatrix();
glPushMatrix();
glTranslated(0,0.00025,0);
glRotated(90,1,0,0);
gluDisk(Disk,0,.2,32,16);
glPopMatrix();
glPushMatrix();
glTranslated(0,-.05,0);
glRotated(90,1,0,0);
gluCylinder(Cylinder,.2,.15,.1,128,16);
glPopMatrix();
glPushMatrix();
glTranslated(0,-.1,0);
glRotated(90,1,0,0);
gluDisk(Disk,0,.15,32,16);
glPopMatrix();
glPushMatrix();
glTranslated(0.1,0.0,0);
fanwing(.6);
glPopMatrix();
glPushMatrix();
glRotated(120,0,1,0);
glTranslated(.1,0,0);
fanwing(.6);
glPopMatrix();
glPushMatrix();
glRotated(240,0,1,0);
glTranslated(0.1,0.0,0);
fanwing(.6);
glPopMatrix();
glPopMatrix();
}
void fan(void)
{ glPushMatrix();
glTranslated(2.5,1.9,0);
glScaled(.5,.5,.5);
GLfloat mat_ambient[]={.5,0,0,1};
GLfloat mat_specular[]={0,1,1,0};
GLfloat mat_diffuse[]={.8,1,.8,1};
GLfloat mat_shininess[]={50};
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,mat_shininess);
if(flag==-1)
{
glPushMatrix();
fanbottom();
glPopMatrix();
}
else
{
angle+=speed;
glPushMatrix();
glTranslated(1,0,1);
glRotated(angle,0,1,0);
glTranslated(-1,0,-1);
fanbottom();
glPopMatrix();
}
glPushMatrix();
glTranslatef(1,3.3,1);
glRotated(-90,1,0,0);
gluCylinder(Cylinder, .1, 0.005, .25, 16, 16);
glPopMatrix();
glPushMatrix();
glTranslatef(1,4,1);
glRotated(90,1,0,0);
gluCylinder(Cylinder, .006, 0.006, .6, 16, 16);
glPopMatrix();
glPushMatrix();
glTranslatef(1,3.96,1);
glRotated(90,1,0,0);
gluCylinder(Cylinder, .1, 0.005, .25, 16, 16);
glPopMatrix();
glPopMatrix();
if(flag==1)
glutPostRedisplay();
}
void tableg(float llen,float lthk)
{
glPushMatrix();
glRotated(-90,1,0,0);
gluCylinder(Cylinder,lthk,lthk,llen,32,32);
glPopMatrix();
}
void table(float tabwid,float tablen,float tabthk,float llen,float lthk)
{
glPushMatrix();
glPushMatrix();
glTranslated(0,llen,0);
glScaled(tabwid,tabthk,tablen);
glutSolidCube(1);
glPopMatrix();
float dist1=.95*tablen/2-lthk/2;
float dist2=.95*tabwid/2-lthk/2;
// front right leg
glPushMatrix();
glTranslated(dist2,0,dist1);
tableg(llen,lthk);
glPopMatrix();
//back right leg
glPushMatrix();
glTranslated(dist2,0,-dist1);
tableg(llen,lthk);
glPopMatrix();
//back left leg
glPushMatrix();
glTranslated(-dist2,0,-dist1);
tableg(llen,lthk);
glPopMatrix();
//front left leg
glPushMatrix();
glTranslated(-dist2,0,dist1);
tableg(llen,lthk);
glPopMatrix();
glPopMatrix();
}
void cot(float cwid,float clen,float cthk,float llen,float lthk)
{
GLfloat ambient1[]={1,0,.4,1};
GLfloat specular1[]={1,1,1,1};
GLfloat diffuse1[]={0.5,0.5,0.5,1};
GLfloat mat_shininess[]={50};
matprop(ambient1,diffuse1,specular1,mat_shininess);
glPushMatrix();
glTranslated(5.6,0,.5);
table(cwid,clen,cthk,llen,lthk);
glPushMatrix();
glTranslated(0,llen,clen/2);
GLdouble eqn[3] = {0.0,1.0, 0.0};
glPushMatrix();
glClipPlane(GL_CLIP_PLANE0, eqn);//void glClipPlane(GLenum plane, const GLdouble *equation);
glEnable (GL_CLIP_PLANE0);//enable clip plane
gluDisk(Disk,0,cwid/2,32,32);
glPopMatrix();
glDisable(GL_CLIP_PLANE0);
glPopMatrix();
glPushMatrix();
glTranslated(0,llen,-clen/2);
glPushMatrix();
glClipPlane (GL_CLIP_PLANE0, eqn);
glEnable (GL_CLIP_PLANE0);
glScaled(1,1.5,1);
gluDisk(Disk,0,cwid/2,32,32);
glPopMatrix();
glDisable(GL_CLIP_PLANE0);
glPopMatrix();
glPopMatrix();
}
void cleg(float cllen,float clwid)
{
glRotated(90,1,0,0);
gluCylinder(Cylinder,clwid,clwid,cllen,32,32);
}
void chair(float cblen,float cbwid,float cbthk,float cllen,float clwid)
{
GLfloat ambient1[]={.5,1,.5,1};
GLfloat specular1[]={1,1,1,1};
GLfloat diffuse1[]={0.5,0.5,0.5,1};
GLfloat mat_shininess[]={50};
matprop(ambient1,diffuse1,specular1,mat_shininess);
glPushMatrix();
glTranslated(0,cllen,0);
//chair base
glPushMatrix();
glScaled(cblen,cbthk,cbwid);
glutSolidCube(1);
glPopMatrix();
float dist=cblen/2-clwid/2;
//chair legs
glPushMatrix();
glTranslated(dist,0,dist);
cleg(cllen,clwid);
glPopMatrix();
glPushMatrix();
glTranslated(-dist,0,dist);
cleg(cllen,clwid);
glPopMatrix();
glPushMatrix();
glTranslated(-dist,0,-dist);
cleg(cllen,clwid);
glPopMatrix();
glPushMatrix();
glTranslated(dist,0,-dist);
cleg(cllen,clwid);
glPopMatrix();
//base pipes
glPushMatrix();
glTranslated(-.085,-clwid/2,cbwid/3);
glRotated(90,0,1,0);
gluCylinder(Cylinder,-clwid,clwid,cblen,32,32);
glPopMatrix();
glPushMatrix();
glTranslated(-.085,clwid/2,-cbwid/3);
glRotated(90,0,1,0);
gluCylinder(Cylinder,clwid,clwid,cblen,32,32);
glPopMatrix();
//back support pipes
glPushMatrix();
glTranslated(-.085,-clwid/2,cbwid/3);
glRotated(-90,1,0,0);
gluCylinder(Cylinder,clwid,clwid,cllen,32,32);
glPopMatrix();
glPushMatrix();
glTranslated(-.085,-clwid/2,-cbwid/3);
glRotated(-90,1,0,0);
gluCylinder(Cylinder,clwid,clwid,cllen,32,32);
glPopMatrix();
//back support
glPushMatrix();
glTranslated(-cblen/2,cllen/2+cblen/2,0);
glRotated(90,0,0,1);
glScaled(cblen,.01,cbwid);
glutSolidCube(1);
glPopMatrix();
glPopMatrix();
}
void diningtable()
{
glPushMatrix();
glTranslated(3,0,1);
glScaled(1.5,1.5,1.5);
table(.3,.5,.025,.4,.005);
//front left chair
glPushMatrix();
glTranslated(-.1,0,.1);
chair(.15,.15,.02,.3,.005);
glPopMatrix();
//back left chair
glPushMatrix();
glTranslated(-.1,0,-.1);
chair(.15,.15,.02,.3,.005);
glPopMatrix();
//front right chair
glPushMatrix();
glTranslated(.1,0,.1);
glRotated(180,0,1,0);
chair(.15,.15,.02,.3,.005);
glPopMatrix();
//back right chair
glPushMatrix();
glTranslated(.1,0,-.1);
glRotated(180,0,1,0);
chair(.15,.15,.02,.3,.005);
glPopMatrix();
//back chair
glPushMatrix();
glTranslated(0,0,-.27);
glRotated(-90,0,1,0);
chair(.15,.15,.02,.3,.005);
glPopMatrix();
//front chair
glPushMatrix();
glTranslated(0,0,.27);
glRotated(90,0,1,0);
chair(.15,.15,.02,.3,.005);
glPopMatrix();
glPopMatrix();
}
void steps(void)
{
int i;
GLfloat ambient1[]={1,0,1,1};
GLfloat specular1[]={1,1,1,1};
GLfloat diffuse1[]={0.5,0.5,0.5,1};
GLfloat mat_shininess[]={50};
matprop(ambient1,diffuse1,specular1,mat_shininess);
glPushMatrix();
glTranslated(-.25,.1,.2);
for(i=0;i<19;i++)
{ glPushMatrix();
glTranslated(0,i*.2,i*.2);
glScaled(.4,.2,.3);
glutSolidCube(1);
glPopMatrix();
}
glPopMatrix();
glPushMatrix();
glRotated(-45,1,0,0);
glTranslated(-.45,.3,2.7);
glScaled(.04,1,5.4);
glutSolidCube(1);
glPopMatrix();
glPushMatrix();
glTranslated(-.45,4,3.6);
glScaled(.04,.8,.75);
glutSolidCube(1);
glPopMatrix();
glPushMatrix();
glTranslated(-.25,4,3.96);
glScaled(.4,.8,.04);
glutSolidCube(1);
glPopMatrix();
}
void sleg(float len,float thk)
{
glScaled(thk,len,thk);
glutSolidCube(1);
}
void solar(void)
{
GLfloat ambient1[]={.1,.1,.1,1};
GLfloat specular1[]={1,1,1,1};
GLfloat diffuse1[]={1,1,1,1};
GLfloat mat_shininess[]={50};
matprop(ambient1,diffuse1,specular1,mat_shininess);
GLfloat lightIntensity[]={.7,.7,.7,1};
GLfloat light_position[]={-20,4,60,0};
glLightfv(GL_LIGHT2,GL_POSITION,light_position);
glLightfv(GL_LIGHT2,GL_DIFFUSE,lightIntensity);
glEnable(GL_LIGHT2);
//base
glPushMatrix();
glTranslated(4,4,3);
glPushMatrix();
glTranslated(0.4,.4,0);
glScaled(1,.8,1);
glutSolidCube(1);
glPopMatrix();
GLfloat ambient2[]={.7,.7,.7,1};
GLfloat specular2[]={1,1,1,1};
GLfloat diffuse2[]={1,1,1,1};
matprop(ambient2,diffuse2,specular2,mat_shininess);
glPushMatrix();
glTranslated(0,.8,0);
glPushMatrix();
glTranslated(.6,.6,0);
gluCylinder(Cylinder,.1,.1,.4,32,32);
glPopMatrix();
GLfloat ambient3[]={1,0,.2,1};
GLfloat specular3[]={1,1,1,1};
GLfloat diffuse3[]={1,0,.5,1};
GLfloat mat_shininess3[]={50};
matprop(ambient3,diffuse3,specular3,mat_shininess3);
glPushMatrix();
glTranslated(.6,.6,0);
gluDisk(Disk,0,.1,32,32);
glPopMatrix();
glPushMatrix();
glTranslated(.6,.6,0.4);
gluDisk(Disk,0,.1,32,32);
glPopMatrix();
GLfloat ambient4[]={0,0,0,1};
GLfloat specular4[]={1,1,1,1};
GLfloat diffuse4[]={0,0,0,1};
GLfloat mat_shininess4[]={50};
matprop(ambient4,diffuse4,specular4,mat_shininess4);
glPushMatrix();
glTranslated(.5,.3,.05);
sleg(.6,.01);
glPopMatrix();
glPushMatrix();
glTranslated(.7,.3,.05);
sleg(.6,.01);
glPopMatrix();
glPushMatrix();
glTranslated(.5,.3,.35);
sleg(.6,.01);
glPopMatrix();
glPushMatrix();
glTranslated(.7,.3,.35);
sleg(.6,.01);
glPopMatrix();
glPushMatrix();
glRotated(45,0,0,1);
glTranslated(.3,.015,.2);
glScaled(.6,.03,.4);
glutSolidCube(1);
glPopMatrix();
glPushMatrix();
glTranslated(.4,.21,0);
sleg(.425,.01);
glPopMatrix();
glPushMatrix();
glTranslated(.4,.21,.4);
sleg(.425,.01);
glPopMatrix();
glPushMatrix();
glTranslated(.4,.4,0);
glRotated(30,0,0,1);
glRotated(90,0,1,0);
gluCylinder(Cylinder,.01,.01,.2,32,32);
glPopMatrix();
glPopMatrix();
glPopMatrix();
}
void myclock()
{
GLfloat mat_ambient[]={.4,.8,.4,1};
GLfloat mat_specular[]={1,1,1,1};
GLfloat mat_diffuse[]={0.4,.8,.4,1};
GLfloat mat_shininess[]={50};
matprop(mat_ambient,mat_diffuse,mat_specular,mat_shininess);
int hour_ticks , sec_ticks;
glPushMatrix();
glTranslated(2,3.2,-.02);
glScaled(.03,.06,.03);
glPushMatrix(); // Draw clock face
glTranslatef( 0, 0, 1.0);
gluDisk(Disk, 0, 7, 32, 16);
glPopMatrix();
GLfloat mat_ambien[]={1,0,0,1};
matprop(mat_ambien,mat_diffuse,mat_specular,mat_shininess);
glPushMatrix();
glTranslatef( 0, 0, 1.95);
gluDisk(Disk, 0, .8, 32, 16);
glPopMatrix();
GLfloat ambient[]={0,0,0,1};
GLfloat specular[]={1,1,1,1};
GLfloat diffuse[]={0,0,0,1};
matprop(ambient,diffuse,specular,mat_shininess);
// Draw hour hand
glPushMatrix();
glColor3f(1.0, 0.5, 0.5);
glTranslatef( 0, 0, 1.5);
glRotatef( -(360/12) * (newtime->tm_hour+newtime->tm_min/60.0), 0.0, 0.0, 1.0);
glRotatef( -90, 1.0, 0.0, 0.0);
gluCylinder(Cylinder, 0.45, 0, 4, 16, 16);
glPopMatrix();
GLfloat ambient1[]={0,0,1,1};
GLfloat specular1[]={1,1,1,1};
GLfloat diffuse1[]={0,0,1,1};
matprop(ambient1,diffuse1,specular1,mat_shininess);
// Draw minute hand
glPushMatrix();
glColor3f(1.0, 0.5, 1.0);
glTranslatef( 0, 0, 1.25);
glRotatef( -(360/60) * newtime->tm_min, 0.0, 0.0, 1.0);
glRotatef(-90, 1.0, 0.0, 0.0);
gluCylinder(Cylinder, 0.4, 0, 6, 16, 16);
glPopMatrix();
GLfloat ambient2[]={1,0,0,1};
GLfloat specular2[]={1,1,1,1};
GLfloat diffuse2[]={1,0,0,1};
matprop(ambient2,diffuse2,specular2,mat_shininess);
// Draw second hand
glPushMatrix();
glTranslatef( 0, 0, 1);
glRotatef(-(360/60) * newtime->tm_sec, 0.0, 0.0, 1.0);
glRotatef( -90, 1.0, 0.0, 0.0);
gluCylinder(Cylinder, 0.3, 0, 6, 16, 16);
glPopMatrix();
GLfloat ambient3[]={1,1,1,1};
GLfloat specular3[]={1,1,1,1};
GLfloat diffuse3[]={1,0,1,1};
matprop(ambient3,diffuse3,specular3,mat_shininess);
for(hour_ticks = 0; hour_ticks < 12; hour_ticks++)
{
glPushMatrix();// Draw next arm axis.
glTranslatef(0.0, 0.0, 1);
glRotatef( (360/12) * hour_ticks, 0.0, 0.0, 1.0);
glTranslatef( 6.0, 0.0, 0.0);
glutSolidCube(.8);
glPopMatrix();
}
for(sec_ticks = 0; sec_ticks < 60; sec_ticks++)
{
glPushMatrix();
glTranslatef(0.0, 0.0, 1.1);
glRotatef( (360/60) * sec_ticks, 0.0, 0.0, 1.0);
glTranslatef(6.0, 0.0, 0.0);
glutSolidCube(0.25);
glPopMatrix();
}
glPopMatrix();
}
void window(void)
{
int i;
GLfloat lightIntensity[]={.7,.7,.7,1};
GLfloat light_position[]={-20,4,-60,0};
glLightfv(GL_LIGHT1,GL_POSITION,light_position);
glLightfv(GL_LIGHT1,GL_DIFFUSE,lightIntensity);
glEnable(GL_LIGHT1);
glPushMatrix();
glTranslated(3.185,1,3.95);
//left edge of window
glPushMatrix();
glTranslated(.02,1,.02);
glScaled(.04,2.2,.04);
glutSolidCube(1);
glPopMatrix();
//right edge
glPushMatrix();
glTranslated(1.6+.02,1,0.02);
glScaled(.04,2.2,.04);
glutSolidCube(1);
glPopMatrix();
//top edge
glPushMatrix();
glTranslated(.9,2+.02,0.02);
glScaled(1.8,.04,.04);
glutSolidCube(1);
glPopMatrix();
//bottom edge
glPushMatrix();
glTranslated(.8,.02,0.02);
glScaled(1.8,.04,.04);
glutSolidCube(1);
glPopMatrix();
for(i=1;i<=3;i++)
{
glPushMatrix();
glTranslated(.4*i,0,0);
glRotated(-90,1,0,0);
gluCylinder(Cylinder,.01,.01,2,32,32);
glPopMatrix();
}
for(i=1;i<=3;i++)
{
glPushMatrix();
glTranslated(.1+.4*i,0,0);
glRotated(-90,1,0,0);
gluCylinder(Cylinder,.01,.01,2,32,32);
glPopMatrix();
}
for(i=1;i<=4;i++)
{
glPushMatrix();
glTranslated(0,.4*i,0);
glRotated(90,0,1,0);
gluCylinder(Cylinder,.03,.03,1.6,32,32);
glPopMatrix();
}
glPopMatrix();
}
void gate(void)
{
int i;
GLfloat ambient1[]={1,.5,1,1};
GLfloat specular1[]={1,1,1,1};
GLfloat diffuse1[]={.5,.5,.5,1};
GLfloat mat_shininess[]={120};
matprop(ambient1,diffuse1,specular1,mat_shininess);
glPushMatrix();
//if flag mgo=1 the open the main gate
if(mgo==1)
glTranslated(1.5,0,0);
glTranslated(-1.3,0,6);
//top frame of the main gate
glPushMatrix();
glTranslated(0,1.5,0);
glScaled(1.7,.04,.04);
glutSolidCube(1);
glPopMatrix();
//bottom frame of main gate
glPushMatrix();
glTranslated(0,.05,0);
glScaled(1.7,.04,.04);
glutSolidCube(1);
glPopMatrix();
//left frame of the main gate
glPushMatrix();
glTranslated(-.8,.75,0);
glScaled(.04,1.5,.04);
glutSolidCube(1);
glPopMatrix();
//right frame of the main gate
glPushMatrix();
glTranslated(.8,.75,0);
glScaled(.04,1.5,.04);
glutSolidCube(1);
glPopMatrix();
//horizantal pipes of the main gate
for(i=1;i<=3;i++)
{
glPushMatrix();
glTranslated(-.85,.4*i,0);
glRotated(90,0,1,0);
gluCylinder(Cylinder,.02,.02,1.7,32,32);
glPopMatrix();
}
//vertical strips of the main gate
for(i=1;i<=5;i++)
{
glPushMatrix();
glTranslated(-.9+.3*i,.75,0);
glScaled(.2,1.5,.02);
glutSolidCube(1);
glPopMatrix();
}
glPopMatrix();
}
void sgate(void )
{
int i;
GLfloat ambient1[]={1,.5,1,1};
GLfloat specular1[]={1,1,1,1};
GLfloat diffuse1[]={.5,.5,.5,1};
GLfloat mat_shininess[]={120};
matprop(ambient1,diffuse1,specular1,mat_shininess);
glPushMatrix();
//to open the sub gate
glTranslated(5.75-.25,.05,6);
glRotated(sgo,0,1,0);
glTranslated(-5.75+.25,-.05,-6);
//to translate sub gate to required position
glTranslated(5.75,.05,6);
//top edge of the sub gate
glPushMatrix();
glTranslated(0,1.5,0);
glScaled(.5,.08,.08);
glutSolidCube(1);
glPopMatrix();
//bottom edge of the sub gate
glPushMatrix();
glTranslated(0,.05,0);
glScaled(.5,.08,.08);
glutSolidCube(1);
glPopMatrix();
//left edge of the sub gate
glPushMatrix();
glTranslated(-.25,.85,0);
glScaled(.04,1.7,.04);
glutSolidCube(1);
glPopMatrix();
//right edge of the sub gate
glPushMatrix();
glTranslated(.25,.8,0);
glScaled(.04,1.6,.04);
glutSolidCube(1);
glPopMatrix();
//vertical pipes of the sub gate
for(i=1;i<=4;i++)
{
glPushMatrix();
glTranslated(-.25+.1*i,0,0);
glRotated(-90,1,0,0);
gluCylinder(Cylinder,.01,.01,1.5,32,32);
glPopMatrix();
}
//horizantal pipes of the sub gate
for( i=1;i<=4;i++)
{
glPushMatrix();
glTranslated(-.25,.05+.3*i,0);
glRotated(90,0,1,0);
gluCylinder(Cylinder,.02,.02,.5,32,32);
glPopMatrix();
}
glPopMatrix();
}
void house(void)
{
GLfloat mat_ambient[]={1,0,0,1};
GLfloat mat_specular[]={1,1,1,1};
GLfloat mat_diffuse[]={1,1,.7,1};
GLfloat mat_shininess[]={50};
matprop(mat_ambient,mat_diffuse,mat_specular,mat_shininess);
GLfloat lightIntensity4[]={.7,.7,.7,.7};
GLfloat light_position4[]={3,1,.5,1};
glLightfv(GL_LIGHT6,GL_POSITION,light_position4);
glLightfv(GL_LIGHT6,GL_DIFFUSE,lightIntensity4);
glEnable(GL_LIGHT6);
glPushMatrix();
glTranslated(0,.15,0);
//roof
glPushMatrix();
glTranslated(-.02*4,3.9,-.01*4-.25);
glScaled(1.5+.05,1.5,1.1);
wall(0.08);
glPopMatrix();
GLfloat ambient2[]={1,0,0,1};
GLfloat specular2[]={1,1,1,1};
GLfloat diffuse2[]={.7,1,0.8,1};
GLfloat shininess[]={50};
matprop(ambient2,diffuse2,specular2,shininess);
//floor
glPushMatrix();
glTranslated(-.02*3,-0.05,-.01*4);
glScaled(1.5+.01,1.5,1);
wall(0.08);
glPopMatrix();
GLfloat ambient1[]={1,0,0,1};
GLfloat specular1[]={1,1,1,1};
GLfloat diffuse1[]={1,1,.7,1};
GLfloat shininess1[]={50};
matprop(ambient1,diffuse1,specular1,shininess1);
//left wall
glPushMatrix();
glRotated(90.0,0,0,1);
wall(0.08);
glPopMatrix();
//right wall
glPushMatrix();
glTranslated(6,0,0);
glRotated(90.0,0,0,1);
wall(0.08);
glPopMatrix();
//back wall
glPushMatrix();
glTranslated(-.08,0,0);
glScaled(1.5+.02,1,1);
glRotated(-90.0,1,0,0);
wall(0.08);
glPopMatrix();
//room vertical wall
glPushMatrix();
glTranslated(4,0,0);
glScaled(1,1,.5);
glRotated(90.0,0,0,1);
wall(0.08);
glPopMatrix();
//room horizantal wall
glPushMatrix();
glTranslated(4.4,0,2);
glScaled(.4,1,1);
glRotated(-90.0,1,0,0);
wall(0.08);
glPopMatrix();
//wall above the room door
glPushMatrix();
glTranslated(4,3,2);
glScaled(.11,.25,1);
glRotated(-90.0,1,0,0);
wall(0.08);
glPopMatrix();
//left room horizantal wall
glPushMatrix();
glTranslated(0,0,2);
glScaled(.4,1,1);
glRotated(-90.0,1,0,0);
wall(0.08);
glPopMatrix();
//lroom vertical wall
glPushMatrix();
glTranslated(1.6,0,0);
glScaled(1,1,.35);
glRotated(90.0,0,0,1);
wall(0.08);
glPopMatrix();
//entrance room right wall
glPushMatrix();
glTranslated(1.6,0,2.59);
glScaled(1,1,.35);
glRotated(90.0,0,0,1);
wall(0.08);
glPopMatrix();
//wall above main door
glPushMatrix();
glTranslated(-0.02,3,4);
glScaled(.13,.27,1);
glRotated(-90.0,1,0,0);
wall(0.08);
glPopMatrix();
//wall right to the main door
glPushMatrix();
glTranslated(.48,0,4);
glScaled(.68,1,1);
glRotated(-90.0,1,0,0);
wall(0.08);
glPopMatrix();
//wall right to the window
glPushMatrix();
glTranslated(4.8,0,4);
glScaled(.3,1,1);
glRotated(-90.0,1,0,0);
wall(0.08);
glPopMatrix();
//wall below the window
glPushMatrix();
glTranslated(3.2,0,4);
glScaled(.4,.25,1);
glRotated(-90.0,1,0,0);
wall(0.08);
glPopMatrix();
//wall above the window
glPushMatrix();
glTranslated(3.2,3.03,4);
glScaled(.4,.25,1);
glRotated(-90.0,1,0,0);
wall(0.08);
glPopMatrix();
room();
watertank();
terece();
steps();
window();
fan();
cot(.6,.9,.06,.35,.009);
diningtable();
myclock();
solar();
GLfloat ambient[]={1,0.5,.5,1};
GLfloat specular[]={1,1,1,1};
GLfloat diffuse[]={1,.5,.5,1};
matprop(ambient,diffuse,specular,mat_shininess);
//main door
glPushMatrix();
glTranslated(0,0,4);
glRotated(maino,0,1,0);
glTranslated(0,0,-4);
glPushMatrix();
glTranslated(0,0,4);
glScaled(.12,.75,1);
glRotated(-90.0,1,0,0);
wall(0.04);
glPopMatrix();
glPushMatrix();
glTranslated(0,0,4);
glScaled(.5,1,.2);
glRotated(-90,1,0,0);
gluCylinder(Cylinder, 0.05, 0.05, 3, 16, 16);
glPopMatrix();
glPopMatrix();
//bolow room door
glPushMatrix();
glTranslated(4,0,(2-.025));
glRotated(romo,0,1,0);
glTranslated(-4,0,-(2-.025));
glPushMatrix();
glTranslated(4,0,2);
glScaled(.099,.75,1);
glRotated(-90.0,1,0,0);
wall(0.01);
glPopMatrix();
glPushMatrix();
glTranslated(4.01,0,2-.025);
glScaled(.5,1,.6);
glRotated(-90,1,0,0);
gluCylinder(Cylinder, 0.05, 0.05, 3, 16, 16);
glPopMatrix();
glPopMatrix();
glPopMatrix();
glFlush();
}
void display(void)
{
time(<ime); // Get time
newtime = localtime(<ime); // Convert to local time
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
gluLookAt(view[0],view[1],view[2],look[0],look[1],look[2],0.0,1.0,0.0);
earth();
compound();
house();
glFlush();
glutSwapBuffers();
glutPostRedisplay();
}
void Keyboard(unsigned char key,int x,int y)
{
switch(key)
{
//to move the camera along -ve x axis
case '4':
view[0]-=.1;
glutPostRedisplay();
break;
//to move the camera along +ve x axis
case '6':
view[0]+=.1;
glutPostRedisplay();
break;
//to move the camera along +ve y axis
case '7':
view[1]+=.1;
glutPostRedisplay();
break;
//to move the camera along -ve y axis
case '1':
if(view[1]>1.9)
view[1]-=.1;
glutPostRedisplay();
break;
//to move the camera along -ve z axis
case '8':
view[2]-=.1;
glutPostRedisplay();
break;
//to move the camera along +ve z axis
case '2':
view[2]+=.1;
glutPostRedisplay();
break;
//to run and stop the fan
case 'S':
case 's':
flag*=-1;
glutPostRedisplay();
break;
//to move the look position along +ve x axis
case 'r':
case 'R':
look[0]+=.1;
break;
//to move the look position along -ve x axis
case 'l':
case 'L':
look[0]-=.1;
break;
//to move the look position along +ve y axis
case 'U':
case 'u':
look[1]+=.1;
break;
//to move the look position along -ve y axis
case 'D':
case 'd':
look[1]-=.1;
break;
//to move the look position along +ve z axis
case 'f':
case 'F':
look[2]+=.1;
break;
//to move the look position along -ve z axis
case 'B':
case 'b':
look[2]-=.1;
break;
//to open and close the main door
case 'q':
case 'Q':
if(maino==0)
maino=85;
else
maino=0;
break;
//to open and close the below room door
case 'O':
case 'o':
if(romo==0)
romo=75;
else
romo=0;
break;
//to open and close the above room door
case 'p':
case 'P':
if(tro==0)
tro=70;
else
tro=0;
break;
//to open and close the main gate
case 'g':
case 'G':
if(mgo==0)
mgo=1;
else
mgo=0;
break;
//to open and close the sub gate
case 'h':
case 'H':
if(sgo==0)
sgo=50;
else
sgo=0;
break;
//inside view
case 'i':
case 'I':
view[0]=2.8;
view[1]=2;
view[2]=4.8;
look[0]=2.8;
look[1]=2;
look[2]=1;
break;
//top view
case 'T':
case 't':
view[0]=6;
view[1]=12;
view[2]=10;
look[0]=2;
look[1]=4;
look[2]=2;
break;
//front view
case 'j':
case 'J':
view[0]=2;
view[1]=2;
view[2]=12.9;
look[0]=3;
look[1]=2;
look[2]=3;
break;
//back view
case 'k':
case 'K':
view[0]=1;
view[1]=6;
view[2]=-7;
look[0]=2;
look[1]=4;
look[2]=2;
break;
}
}
void mySpecialKeyFunc( int key, int x, int y )
{
switch ( key ) {
case GLUT_KEY_UP:
if ( speed < 25.0) {
speed+=5;
}
break;
case GLUT_KEY_DOWN:
if (speed>0) {
speed-=5;
}
break;
}
}
void main_menu(int m)
{
switch(m)
{
case 1:
exit(0);
}
}
void fan_menu(int m)
{
switch(m)
{
case 1:
flag*=-1;
glutPostRedisplay();
break;
case 2:if ( speed < 30.0) {
speed+=5;
}
break;
case 3:
if (speed>0) {
speed-=5;
}
break;
}
}
void door_menu(int m)
{
switch(m)
{
case 1:
if(maino==0)
maino=85;
else
maino=0;
break;
case 2:
if(romo==0)
romo=75;
else
romo=0;
break;
case 3:
if(tro==0)
tro=90;
else
tro=0;
break;
}
}
void gate_menu(int m)
{
switch(m)
{
case 1:
if(mgo==0)
mgo=1;
else
mgo=0;
break;
case 2:
if(sgo==0)
sgo=50;
else
sgo=0;
break;
}
}
void house_view(int m)
{
switch(m)
{
case 1:
view[0]=2.8;
view[1]=2;
view[2]=4.8;
look[0]=2.8;
look[1]=2;
look[2]=1;
break;
case 2:
view[0]=6;
view[1]=12;
view[2]=10;
look[0]=2;
look[1]=8;
look[2]=2;
break;
case 3:
view[0]=2;
view[1]=2;
view[2]=12.9;
look[0]=3;
look[1]=2;
look[2]=3;
break;
case 4:
view[0]=1;
view[1]=6;
view[2]=-7;
look[0]=2;
look[1]=4;
look[2]=2;
break;
}
}
void menu()
{
int sub_menu1=glutCreateMenu(fan_menu);
glutAddMenuEntry("on/off fan(s)",1);
glutAddMenuEntry("speed up(up arrow)",2);
glutAddMenuEntry("speed down(down arrow)",3);
int sub_menu2=glutCreateMenu(door_menu);
glutAddMenuEntry("main door(q)",1);
glutAddMenuEntry("ground floor room door(o)",2);
glutAddMenuEntry("1st floor room door(p)",3);
int sub_menu3=glutCreateMenu(gate_menu);
glutAddMenuEntry("main gate(g)",1);
glutAddMenuEntry("sub gate(h)",2);
int sub_menu4=glutCreateMenu(house_view);
glutAddMenuEntry("front view(j)",3);
glutAddMenuEntry("top view(t)",2);
glutAddMenuEntry("inside view(i)",1);
glutAddMenuEntry("back view(k)",4);
glutCreateMenu(main_menu);
glutAddMenuEntry("quit",1);
glutAddSubMenu("fan menu",sub_menu1);
glutAddSubMenu("open/close door",sub_menu2);
glutAddSubMenu("open/close gate",sub_menu3);
glutAddSubMenu("house view",sub_menu4);
glutAttachMenu(GLUT_RIGHT_BUTTON);
}
int main(int argc,char**argv)
{
glutInit(&argc,argv);//to initialize the glut library
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);
glutInitWindowSize(w,h);
glutInitWindowPosition(0,0);
glutCreateWindow("er");
myinit();
glutDisplayFunc(display);
glutKeyboardFunc(Keyboard);
glutSpecialFunc(mySpecialKeyFunc);
menu();
glutFullScreen();//to see o/p in full screen on monitor
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glShadeModel(GL_SMOOTH);//smooth shaded
glEnable(GL_DEPTH_TEST);//to remove hidden surface
glEnable(GL_NORMALIZE);//to make normal vector to unit vector
glClearColor(0,.3,.8,0);
glViewport(0,0,w,h);
glutMainLoop();
return 0;
}
Features
Di dalam projek ini akan ada beberapa fiture yang akan dijadikan animasi dengan event mouse diataranya :
- gerbang depan : akan melakukan buka tutup pintu dengan klik kanan.
- gerbang samping : akan melakukan membuka menutup pintu dengan klik kanan.
- pintu depan : akan melakukan membuka dan menutup pintu dengan klik kanan.
- pintu atas : akan melakukan membuka dan menutup pintu dengan klik kanan.
- pintu tengah :akan melakukan membuka dan menutup pintu dengan klik kanan
- kipas angin : memutar kipas angin dengan kecepatan sedang dan cepat serta dapat mematikan kipas angin juga.
Event interaksi dengan pengguna
Event apa saja yang dapat dilakukan dalam projek yang anda buat. berikut ini adalah event yang dapat anda lakukan.
- klik kanan opsi quit digunakan untuk keluar dari animasi.
- klik kanan opsi fan menu digunakan untuk menu2 menjalankan kipas angin , mempercepat putaran dan mematikan kipas angin.
- klik kanan opsi open/close door digunakan untuk semua menu yang berkaitan dengan membuka pintu. baik itu pintu depan, belakang dan samping serta pintu dalam ruangan.
- klik kanan opsi open/close gate digunakan untuk membuka dan menutup gerbang depan dan samping
- klik kanan opsi view house digunakan untuk melihat rumah dari posisi samping , belakang atas dan posisi di dalam rumah.
berikut ini adalah hasil projek yang anda buat jika dilihat dati posisi dalam.
terimakasih semoga bermanfaat dan digunakan sebaik-baiknya untuk belajar dan membuat karya anda-anda semua supaya digunakan untuk dipelajari alurnya bukan untuk mencontek semuanya.
Daftar Pustaka
https://cglabprojects.blogspot.com/2014/02/3d-house-scene.html
ReplyDeleteTak faham bahagian code ni, apa gantian untuk thickness kalau tak nak guna code thickness tapi nak create wall?
void wall(double thickness)
{
glPushMatrix();
glTranslated(2, .5 * thickness, 2);
glScaled(4.0, thickness, 4.0);
glutSolidCube(1.0);
glPopMatrix();
}