h>
#include<math.h>
#include<GL/glut.h>
typedef struct {
float m[4][4];
} matrix3D_t;
typedef struct {
float v[4];
} vector3D_t;
typedef struct {
float x;
float y;
float z;
} point3D_t;
typedef struct {
float x;
float y;
} point2D_t;
typedef struct {
float r;
float g;
float b;
} color_t;
matrix3D_t createIdentity(void)
{
matrix3D_t u;
int i,j;
for (i=0;i<4;i++){
u.m[i][i]=1.;
return u;
matrix3D_t c;//c=a*b
int i,j,k;
c.m[i][j]=0.;
return c;
vector3D_t c;//c=a*b
int i,j;
for (i=0;i<4;i++){
c.v[i]=0;
return c;
matrix3D_t trans=createIdentity();
trans .m[0][3]=dx;
trans .m[1][3]=dy;
trans .m[2][3]=dz;
return trans;
matrix3D_t rotate=createIdentity();
float cs=cos(theta);
float sn=sin(theta);
rotate.m[1][1]=cs;
rotate.m[1][2]=-sn;
rotate.m[2][1]=sn;
rotate.m[2][2]=cs;
return rotate;
matrix3D_t rotate=createIdentity();
float cs=cos(theta);
float sn=sin(theta);
rotate.m[0][0]=cs;
rotate.m[0][2]=-sn;
rotate.m[2][0]=sn;
rotate.m[2][2]=cs;
return rotate;
matrix3D_t rotate=createIdentity();
float cs=cos(theta);
float sn=sin(theta);
rotate.m[0][0]=cs;
rotate.m[0][1]=-sn;
rotate.m[1][0]=sn;
rotate.m[1][1]=cs;
return rotate;
matrix3D_t scale=createIdentity();
scale.m[0][0]=factorx;
scale.m[1][1]=factory;
scale.m[2][2]=factorz;
return scale;
point2D_t pnt;
pnt.x=vec.v[0];
pnt.y=vec.v[1];
return pnt;
point3D_t pnt;
pnt.x=vec.v[0];
pnt.y=vec.v[1];
pnt.z=vec.v[2];
return pnt;
vector3D_t vec;
vec.v[0]=pnt.x;
vec.v[1]=pnt.y;
vec.v[2]=pnt.z;
vec.v[3]=1.;
return vec;
}
{ float c;//c=a*b
int i;
c=0;
for (i=0;i<3;i++){
c+=a.v[i]*b.v[i];
return c;
// i j k
// a0 a1 a2
// b0 b1 b2
vector3D_t c;//c=a*b
c.v[0]=a.v[1]*b.v[2]-a.v[2]*b.v[1];
c.v[1]=a.v[2]*b.v[0]-a.v[0]*b.v[2];
c.v[2]=a.v[0]*b.v[1]-a.v[1]*b.v[0];
c.v[3]=1.;
return c;
vector3D_t c;//c=v1-v0
c.v[0]=v1.v[0]-v0.v[0];
c.v[1]=v1.v[1]-v0.v[1];
c.v[2]=v1.v[2]-v0.v[2];
c.v[3]=1.;
return c;
vector3D_t c;//c=-v
c.v[0]=-v.v[0];
c.v[1]=-v.v[1];
c.v[2]=-v.v[2];
c.v[3]=1.;
return c;
vector3D_t c;//c=r*b
int i;
for (i=0;i<3;i++) {
c.v[i]=r*b.v[i];
c.v[3]=1.;
return c;
{ vector3D_t c;//c=r*b
int i;
for (i=0;i<3;i++) {
c.v[i]=r*b.v[i];
c.v[3]=1.;
return c;
float funcPositive(float x)
if (0.<x) return x;
// x to yth power
//ln z = y ln x z = exp (y ln x)
if (x==0.) return 0;
return exp(y*log(x));
{
color_t col;
col.r=c1.r+c2.r;
col.g=c1.g+c2.g;
col.b=c1.b+c2.b;
return col;
color_t col;
col.r=r*c.r;
col.g=r*c.g;
col.b=r*c.b;
return col;
color_t col;
col.r=r*c.r;
col.g=r*c.g;
col.b=r*c.b;
return col;
{ glBegin(GL_POINTS);
glVertex2f(x, y);
glEnd();
glBegin(GL_LINES);
glVertex2f(x1, y1);
glVertex2f(x2, y2);
glEnd();
drawLine(p1.x,p1.y,p2.x,p2.y);
int i;
glBegin(GL_LINE_STRIP);
glVertex2f(pnt[i].x, pnt[i].y);
glEnd();
int i;
glBegin(GL_LINE_LOOP);
glVertex2f(pnt[i].x, pnt[i].y);
glEnd();
int i;
setColor(color);
glBegin(GL_POLYGON);
glVertex2f(pnt[i].x, pnt[i].y);
}
glEnd();
{ int i;
glBegin(GL_POLYGON);
setColor(col[i]);
glVertex2f(pnt[i].x, pnt[i].y);
glEnd();
void userdraw(void);
void display(void)
glClear(GL_COLOR_BUFFER_BIT);
userdraw();
glutSwapBuffers();
drawLine(x,y,x+10,y+12);drawLine(x,y+12,x+10,y);
{
drawLine(x+5,y,x+5,y+7); drawLine(x,y+12,x+5,y+7);
drawLine(x+10,y+12,x+5,y+7);
drawLine(x,y+12,x+10,y+12); drawLine(x+10,y+12,x,y);
drawLine(x,y,x+10,y);
point3D_t axes[14]={
{HALFAXIS,0,0},{HALFAXIS,0,0},{HALFAXIS1,5,0},
{HALFAXIS1,0,0},{0,0,0},{0,HALFAXIS,0},
{0,HALFAXIS,0},{0,HALFAXIS1,5},{0,HALFAXIS1,0},{0,0,0},
{0,0,-HALFAXIS},{0,0,HALFAXIS},{5,0,HALFAXIS1},{0,0,HALFAXIS1}};
vector3D_t vec[14];
point2D_t buff[14];
int i;
for (i=0;i<14;i++) {
vec[i]=Point2Vector(axes[i]);
vec[i]=view*vec[i];
buff[i]=Vector2Point2D(vec[i]);
}
drawPolyline(buff,14);
drawcharX(buff[1].x,buff[1].y);
drawcharY(buff[6].x,buff[6].y);
drawcharZ(buff[11].x-14,buff[11].y);
typedef struct {
} face_t;
typedef struct {
int NumberofVertices;
int NumberofFaces;
face_t fc[200];
}object3D_t;
void userdraw(void)
matrix3D_t tilting=rotationXMTX(theta)*rotationYMTX(-theta);
setColor(1,1,1);
drawAxes(tilting);
object3D_t prisma={
//R LUAR
{10,20,30},{10,90,30},{40,90,30},{50,80,30},{50,60,30},{40,50,30},{30,50,30},{50,30,30},{50,20,30},{40,20
,30},{40,30,30},{20,50,30},{20,20,30},
{10,20,10},{10,90,10},{40,90,10},{50,80,10},{50,60,10},{40,50,10},{30,50,10},{50,30,10},{50,20,10},{40,20
,10},{40,30,10},{20,50,10},{20,20,10},
//R DALAM
{20,60,30},{20,80,30},{30,80,30},{40,70,30},{30,60,30},
{20,60,10},{20,80,10},{30,80,10},{40,70,10},{30,60,10},
//I
{60,20,30},{60,90,30},{70,90,30},{70,20,30},
{60,20,10},{60,90,10},{70,90,10},{70,20,10},
//Z
{80,20,30},{80,30,30},{110,80,30},{80,80,30},{80,90,30},{120,90,30},{120,80,30},{90,30,30},{120,30,30},{
120,20,30},
{80,20,10},{80,30,10},{110,80,10},{80,80,10},{80,90,10},{120,90,10},{120,80,10},{90,30,10},{120,30,10},{
120,20,10},
//A LUAR
{130,20,30},{130,70,30},{140,90,30},{160,90,30},{170,70,30},{170,20,30},{160,20,30},{160,50,30},{140,50
,30},{140,20,30},
{130,20,10},{130,70,10},{140,90,10},{160,90,10},{170,70,10},{170,20,10},{160,20,10},{160,50,10},{140,50
,10},{140,20,10},
//A DALAM
{140,60,30},{150,80,30},{160,60,30},
{140,60,10},{150,80,10},{160,60,10},
//L
{180,20,30},{180,90,30},{190,90,30},{190,30,30},{220,30,30},{220,20,30},
{180,20,10},{180,90,10},{190,90,10},{190,30,10},{220,30,10},{220,20,10},
},
200,{
//R LUAR
{13,{0,1,2,3,4,5,6,7,8,9,10,11,12}},
{13,{13,14,15,16,17,18,19,20,21,22,23,24,25}},
{26,{13,0,1,14,15,2,3,16,17,4,5,18,19,6,7,19,20,8,9,21,22,10,11,23,24,12,25}},
//R DALAM
{5,{26,27,28,29,30}},
{5,{31,32,33,34,35}},
{10,{31,26,27,32,33,28,29,34,35,30}},
//I
{4,{36,37,38,39}},
{4,{40,41,42,43}},
{8,{40,36,37,41,42,38,39,43}},
//Z
{10,{44,45,46,47,48,49,50,51,52,53}},
{10,{54,55,56,57,58,59,60,61,62,63}},
{20,{54,44,45,55,56,46,47,57,58,48,49,59,60,50,51,61,62,52,53,63}},
//A LUAR
{10,{64,65,66,67,68,69,70,71,72,73}},
{10,{74,75,76,77,78,79,80,81,82,83}},
{20,{74,64,65,75,76,66,67,77,78,68,69,79,80,70,71,81,82,72,73,83}},
//A DALAM
{3,{84,85,86}},
{3,{87,88,89}},
{6,{87,84,85,88,89,86}},
//L
{6,{90,91,92,93,94,95}},
{6,{96,97,98,99,100,101}},
{12,{96,90,91,97,98,92,93,99,100,94,95,101}},
};
vector3D_t vec[200];
point2D_t buff[200];
matrix3D_t rot,mat,trans;
int i,j;
setColor(0.,255.,255.);
rot=rotationYMTX(0.001*tick);
trans=translationMTX(1,1,0);
mat=tilting*rot;
mat=trans*mat;
for (i=0;i<prisma.NumberofVertices;i++){
vec[i]=Point2Vector(prisma.pnt[i]);
vec[i]=mat*vec[i];
for (i=0;i<prisma.NumberofFaces;i++){
for (j=0;j<prisma.fc[i].NumberofVertices;j++){
buff[j]=Vector2Point2D(vec[prisma.fc[i].pnt[j]]);
drawPolygon(buff,prisma.fc[i].NumberofVertices);
tick--;
glutInit(&argc,argv);
glutInitWindowPosition(100,100);
glutInitWindowSize(640,480);
glutCreateWindow("nama 3D");
glutIdleFunc(display);
glutDisplayFunc(display);
glutMainLoop();
return 0;