GRAFIKA KOMPUTER
FATHAN AKMAL
0701172102
Fathan Akmal
2
DAFTAR ISI
3
DAFTAR GAMBAR
4
MODUL 1
OUTPUT PRIMITIF
Dasar teori
Output primitif adalah bentuk geometri dasar yang dapat digunakan untuk membentuk
obyek yang lebih komplek. Dengan memasukkan output primitif tersebut sebagai stuktur yang
lebih kompleks. Setiap output primitif mempunyai data koordinat dan informasi lain tentang
bagaimana cara object ditampilkan pada layar. Titik dan garis lurus adalah bentuk geometri
paling sederhana dan komponen gambar.
Borland C++ Builder menyediakan Canvas yang dapat digunakan untuk menampilkan
gambar maupun tulisan ke layar. Kelas Canvas pada umumnya merupakan atribut dari kelas
Lain. Beberapa kelas yang mempuntai atribut Canvas antara lain TPaintBox, TShape.
2. Garis(line)
Garis adalah kumpulan titik-titik/pixel yang tersusun secara lurus dan linier dari titik awal
sampai titik akhir.
5
Kode untuk membuat garis :
Canvas->MoveTo(x0, y0);
Canvas->MoveTo(x1, y1);
…
Canvas->LineTo(xn, yn)
2. Atribut Kurva
Parameter untuk atribut kurva sama dengan atribut segmen garis. Kurva dapat ditampilkan
dengan berbagai warna, tebal, dot-dash(Style garis) dan pilihan pen atau brush. Selain itu untuk
pengisian suatu bidang tertentu termasuk memilih warna antara solid dan pattern tertentu dan
memilih warna pattern yang ada.
6
a. x_inc = dx / step
b. y_inc = dy / step
6. Koordinat selanjutnya (x+x_inc, y+y_inc)
7. Plot pixel pada layar, nilai koordinat hasil perhitungan dibulatkan
8. .Ulangi nomor 6 dan 7 untuk menentukan posisi pixel berikutnya sampai x = x1 atau
y = y1.
Percobaan 1 :
Program yang akan dirancang berfungsi untuk mengetahui cara membuat titik di Visual
secara benar. Adapun aplikasi yang digunakan adalah aplikasi Microsoft Visual Studio. Untuk
memahami pembuatan titik, diperlukan glut.h, glut32.dll,glut32 dan buka visual studio pilih
New Project, pilih Win32 Colsole Application. Pastikan Precompiled Header dan Security
Development Lifecycle (SDL) Checks tidak diceklis. Ceklis Empty Project.
Analisis Coding:
//buat titik
#include <GL/glut.h>
voidtampil() {
glClear(GL_COLOR_BUFFER_BIT);
// TITIK
glPointSize(10);
glBegin(GL_POINTS);
glVertex2i(75, 75);
glVertex2i(-75, 75);
glVertex2i(-75, -75);
glVertex2i(75, -75);
glEnd();
glFlush();
}
main() {
glutInitWindowSize(320, 240);
7
glutCreateWindow("Percobaan 2");
gluOrtho2D(-320, 320, -240, 240);
glutDisplayFunc(tampil);
glutMainLoop();
}
Hasil Output:
Percobaan 2 :
Program yang akan dirancang berfungsi untuk mengetahui cara membuat garis di
Visual secara benar. Adapun aplikasi yang digunakan adalah aplikasi Microsoft Visual Studio.
Untuk memahami pembuatan garis, diperlukan glut.h, glut32.dll,glut32 dan buka visual studio
pilih New Project, pilih Win32 Colsole Application. Pastikan Precompiled Header dan Security
Development Lifecycle (SDL) Checks tidak diceklis. Ceklis Empty Project.
Analisis Coding:
#include <GL/glut.h>
voidtampil() {
glClear(GL_COLOR_BUFFER_BIT);
// GARIS
glLineWidth(2);
8
glBegin(GL_LINES);
glVertex2i(75, 75);
glVertex2i(-75, 75);
glVertex2i(-75, -75);
glVertex2i(75, -75);
glEnd();
glFlush();
}
main() {
glutInitWindowSize(320, 240);
glutCreateWindow("percobaan3");
gluOrtho2D(-320, 320, -240, 240);
glutDisplayFunc(tampil);
glutMainLoop();
}
Hasil Output:
9
LEMBAR PENGESAHAN
Menyetujui,
( ) ( )
Mengetahui,
( Sriani, M.Kom )
10
MODUL 2
GRAFIK 2 DIMENSI
Dasar Teori
11
9. Donut
10. Star
11. Helix
Percobaan 1 :
Program yang akan dirancang berfungsi untuk mengetahui cara membuat Grafik 2
Dimensi di Visual secara benar. Adapun aplikasi yang digunakan adalah aplikasi Microsoft
Visual Studio. Untuk memahami pembuatan Grafik 2 Dimensi, diperlukan glut.h,
glut32.dll,glut32 dan buka visual studio pilih New Project, pilih Win32 Colsole Application.
Pastikan Precompiled Header dan Security Development Lifecycle (SDL) Checks tidak
diceklis. Ceklis Empty Project.
Analisis Coding:
//Buat segitiga
#include<GL/glut.h>
void userdraw()
{
staticint tick=0;
void drawDot(int x, int y) ;
glBegin(GL_LINE_LOOP);
glVertex2i(100,50);
glVertex2i(100,130);
glVertex2i(150,130);
glColor3f(1.0,0.0,0.0);//mewarnai merah pada garis
glEnd();
}
void display(void)
{
//clear screen
glClear(GL_COLOR_BUFFER_BIT);
userdraw();
glutSwapBuffers();
12
}
Hasil Output:
13
LEMBAR PENGESAHAN
Menyetujui,
( ) ( )
Mengetahui,
( Sriani, M.Kom )
14
MODUL 3
GRAFIK 3 DIMENSI
Dasar Teori
3 dimensi biasa disebut 3D atau adalah bentuk dari benda yang memiliki panjang, lebar,
dan tinggi. Grafik 3 Dimensi merupakan teknik penggambaran yg berpatokan pada titik
koordinat sumbu x (datar), sumbu y (tegak), dan sumbu z (miring). Representasi dari data
geometrik 3 dimensi sebagai hasil dari pemrosesan dan pemberian efek cahaya terhadap grafika
komputer 2D. Tiga Dimensi, biasanya digunakan dalam penanganan grafis.
Grafik 3D merupakan perkembangan dari grafik 2D. Didalam grafika komputer, 3D
merupakan bentuk grafik yang menggunakan representasi data geometri tiga dimensi.
Suatu objek rangka 3D apabila disinari dari arah tertentu akan membentuk bayangan
pada permukaan gambar.
Proses pembuatan grafik komputer 3D dapat dibagi ke dalam tiga fase, yaitu 3D
modeling yang mendeskripsikan bentuk dari sebuah objek, layout dan animation yang
mendeskripsikan gerakan dan tata letak sebuah objek, dan 3D rendering yang memproduksi
image dari objek tersebut.
Istilah atau Pengertian Grafik 3D adalah sebuah gambar, garis, lengkungan, dan
sebagainya yang memiliki titik-titik yang menghubungkan menjadi sebuah bentuk 3D. Saat ini
video card menggunakan variasi dari instruksi-instruksi yang ditanamkan dalam video card itu
sendiri (bukan berasal dari software) untuk mencapai hasil grafik yang lebih realistis dalam
memainkan game komputer.
Macam-macam objek 3 dimensi:
1. Box
2. Sphare
3. Cyllinder
4. Tube
5. Pyramid
6. Plane
15
Percobaan 1 :
Program yang akan dirancang berfungsi untuk mengetahui cara membuat Grafik 3D di
Visual secara benar. Adapun aplikasi yang digunakan adalah aplikasi Microsoft Visual Studio.
Untuk memahami pembuatan Grafik 3D, diperlukan glut.h, glut32.dll,glut32 dan buka visual
studio pilih New Project, pilih Win32 Colsole Application. Pastikan Precompiled Header dan
Security Development Lifecycle (SDL) Checks tidak diceklis. Ceklis Empty Project.
Analisis Coding:
//buat prisma
#include<GL/glut.h>
#include<math.h>
struct point {
float x,y,z;
};
struct vektor {
float v[4];
};
struct matriks {
float m[4][4];
};
struct face {
int jumtitikons;
int indextitik[40];
};
struct objek {
int jumtitik;
point titik[40];
int jumsisi;
face sisi[30];
};
matriks mat;
float theta=0.5;
vektor point2vektor(objek balok, int i) {
vektor vec;
16
vec.v[0] = balok.titik[i].x;
vec.v[1] = balok.titik[i].y;
vec.v[2] = balok.titik[i].z;
vec.v[3] = 1;
return vec;
}
point vektor2point(vektor vec) {
point pnt;
pnt.x = vec.v[0];
pnt.y = vec.v[1];
pnt.z = vec.v[2];
return pnt;
}
matriks identitas(void) {
int i,j;
matriks mat;
for (i=0;i<4;i++) {
for (j=0;j<4;j++) {
if (i==j)
mat.m[i][j] = 1;
else
mat.m[i][j] = 0;
}}
return mat;
}
matriks translasi(float dx, float dy, float dz) {
matriks trans = identitas();
trans.m[0][3] = dx;
trans.m[1][3] = dx;
trans.m[2][3] = dx;
return trans;
}
matriks rotasiX(float theta) {
matriks rotate = identitas();
17
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;
}
matriks rotasiY(float theta) {
matriks rotate = identitas();
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;
}
matriks rotasiZ(float theta) {
matriks rotate = identitas();
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][2] = cs;
return rotate;
}
vektor kali (matriks mat, vektor b) {
int i,j;
vektor c;
for (i=0;i<4;i++) {
c.v[i] = 0;
for (j=0;j<4;j++) {
18
c.v[i]+= mat.m[i][j] * b.v[j];
} }return c;
}
matriks kalim (matriks a, matriks b) {
int i,j,k;
matriks c;
for (i=0;i<4;i++) {
for (j=0;j<4;j++) {
c.m[i][j] = 0;
for (k=0;k<4;k++) {
c.m[i][j]+=a.m[i][k] * b.m[k][j];
}}}
return c;
}
matriks titling = kalim(rotasiX(theta),rotasiY(-theta));
vektor cross (vektor a, vektor b) {
vektor c;
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;
}
void DrawPolygon(objek obj)
{
int i,j;
float r,g,b;
for(i=0;i<obj.jumsisi;i++)
{
r=1.0f; g=0.0f; b=0.0f;
glBegin(GL_POLYGON);
if (i==0) { r=1.0f; g=0.0f; b=0.0f; }
if (i==1) { r=0.0f; g=1.0f; b=0.0f; }
if (i==2) { r=0.0f; g=0.0f; b=1.0f; }
19
if (i==3) { r=1.0f; g=1.0f; b=0.0f; }
if (i==4) { r=1.0f; g=0.0f; b=1.0f; }
if (i==5) { r=0.0f; g=1.0f; b=1.0f; }
if (i==6) { r=0.5f; g=0.0f; b=1.0f; }
if (i==7) { r=0.5f; g=0.5f; b=0.5f; }
glColor3f(r,g,b);
for(j=0;j<obj.sisi[i].jumtitikons;j++)
{
glVertex3f(obj.titik[obj.sisi[i].indextitik[j]].x,
obj.titik[obj.sisi[i].indextitik[j]].y,
obj.titik[obj.sisi[i].indextitik[j]].z);
}
glEnd();
}}
void gambarprisma() {
int i;
vektor hasil,HslKali;point HslTitik;
mat = titling;
objek prisma = {6,{{0,100,0},{100,0,0},{0,0,100},
{-100,0,0},{0,0,-100},{0,-100,0}}, 9, {{3,{0,1,2}},{3,{0,2,3}},
{3,{0,3,4}},{3,{0,4,1}},{4,{1,4,3,2}},{3,{5,4,1}},{3,{5,2,1}},{3,{5,2,3}},
{3,{5,3,4}}}};
for (i=0;i<8;i++) {
hasil = point2vektor(prisma,i);
HslKali = kali(mat,hasil);
HslTitik = vektor2point(HslKali);
prisma.titik[i] = HslTitik;
}
DrawPolygon(prisma);
}
void UserDraw() {
glClearColor(1.0f,1.0f,1.0f,0.0f);
glClear(GL_COLOR_BUFFER_BIT);
glRotatef(0.1f,0.0f,1.0f,0.0f);
20
gambarprisma();
glutSwapBuffers(); }
void main(int argc,char **argv) {
glutInit(&argc,argv);
glutInitWindowPosition(20,20);
glutInitWindowSize(640,640);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
glutCreateWindow("Point To Vektor");
glOrtho(-200.0f,200.0f,-200.0f,200.0f,-200.0f,200.0f);
glutIdleFunc(UserDraw);
glutDisplayFunc(UserDraw);
glutMainLoop();
}
Hasil Output:
21
LEMBAR PENGESAHAN
Menyetujui,
( ) ( )
Mengetahui,
( Sriani, M.Kom )
22
MODUL 4
TRANSFORMASI 2D KE 3D
Dasar Teori
Transformasi dua dimensi adalah suatu model atau bentuk atau teknik-teknik
memindahkan atau mengubah nilai posisi objek dalam sistem koordinat dua dimensi.
Pemindahan objek ini dapat diartikan sebagai pemindahan titik.
Ada dua cara yang dapat digunakan untuk mentransformasi gambar yaitu :
1. Transformasi objek
Definisinya adalah mengubah koordinat-koordinat dari tiap-tiap titik di objek dengan
beberapa aturan, meninggalkan underlying system koordinat yang tidak bisa di ubah lagi.
2. Transformasi koordinat
Definisinya adalah system koordinat yang baru di buat sebelumnya merupakan semua
titik objek dalam system yang baru.
Rumus perhitungan untuk setiap transformasi, yaitu :
a. Translasi
Rumus yang digunakan, yaitu :
x′ = x + tx
y′ = y + ty
Keterangan :
x′ : koordinat x yang dibentuk setelah translasi
x : koordinat x awal
tx : besarnya translasi (perpindahan) x
y′ : koordinat y yang dibentuk setelah translasi
y : koordinat y awal
ty : besarnya translasi (perpindahan) y
Percobaan 1 :
Program yang akan dirancang berfungsi untuk mengetahui cara membuat Transportasi
2D ke 3D di Visual secara benar. Adapun aplikasi yang digunakan adalah aplikasi Microsoft
Visual Studio. Untuk memahami pembuatan Transportasi 2D ke 3D diperlukan glut.h,
glut32.dll,glut32 dan buka visual studio pilih New Project, pilih Win32 Colsole Application.
23
Pastikan Precompiled Header dan Security Development Lifecycle (SDL) Checks tidak
diceklis. Ceklis Empty Project.
Analisis Coding :
//buat lampion
#include<stdlib.h>
#include<GL/glut.h>
#include<windows.h>
int w=800, h=600, z=0;
int x1=0, y1=0, z1=0, sudut=0;
void renderScene (void)
{
staticfloat alpha =0;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearColor (0, 0, 0, 0);
glLoadIdentity ();
glTranslatef (0, 0, z);
glRotatef (sudut, x1, y1, z1);
glRotatef (alpha,1,1,1);
glColor3f(1, 1, 0);
alpha = alpha +0.5;
//glutWireCube (3);//fungsi kubus
//glutSolidCube(3);//kubus penuh warna
glutWireSphere(2,90,90);//fungsi bola
//glutWireCone(2, 4, 25, 25);//fungsi kerucut
glColor3f(1,0,0);
glutWireTorus (4, 2, 90, 30);//fungsi donat
//glutWireTeapot (4);//fungsi ceret
//glutSolidIcosahedron ();//fungsi delima
//glutWireDodecahedron ();//fungsi bola
//glutWireTetrahedron();//fungsi piramida
glutSwapBuffers ();
}
24
void resize (intw1, inth1) {
glViewport (0, 0, w1, h1);
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
gluPerspective (45.0,(float) w1/(float) h1,1.0, 100.0);
glMatrixMode (GL_MODELVIEW);
glLoadIdentity ();
}
void Keyboard (GLubytekey, GLintx, GLinty)
{
if (key == 'a' || key == 'A') z+=2;
if (key == 'd' || key == 'D') z-=2;
if (key == 'x' || key == 'X')
{
x1=1;
y1=0;
z1=0;
sudut +=10;
}
if (key == 'y' || key == 'Y')
{
x1=0;
y1=1;
z1=0;
sudut +=-10;
}
if (key == 'z'|| key == 'Z')
{
x1=0;
y1=0;z1=1;
sudut +=-10;
}
if ( key == 'f'|| key == 'F')
25
{
glutFullScreen ();
}
{
int foo;
foo = x + y;
if ('q' == key || 'Q' == key || 27 == key)
exit (0);
}
}
void timer (intvalue)
{
glutPostRedisplay ();
glutTimerFunc (1,timer,0);
}
void main (intargc, char **argv)
{
glutInit (&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGBA);
glutInitWindowPosition (100,100);
glutInitWindowSize (w,h);
glutCreateWindow ("3D Dimas");
gluOrtho2D (-w/2,w/2,-h/2,h/2);
glutDisplayFunc (renderScene);
glutReshapeFunc (resize);
glutKeyboardFunc (Keyboard);
glutTimerFunc (1,timer,0);
glutMainLoop ();
}
Output:
26
Gambar 3.1 Output Lampion
27
LEMBAR PENGESAHAN
Judul : Transoptasi 2D ke 3D
Nama : Fathan Akmal
NIM : 0701172102
Program Studi : Ilmu Komputer
Menyetujui,
( ) ( )
Mengetahui,
( Sriani, M.Kom )
28
MODUL 5
SHADING OPEN GL
Dasar Teori
Shading merupakan sebuah teknik gabungan antara pewarnaan dan pencahayaan
terhadap polygon, titik, garis untuk menampilkan efek gelap, terang, halus ataupun kasar pada
bagian tertentu dari permukaan objek.Non-ShadingNon-ShadingNo Edge linesShading.
Shading mengacu pada penggambaran kedalaman suatu ilustrasi dengan mengubah-
ubah tingkat dari kegelapan suatu object (darkness).
Pola-pola yang terang (misalnya objek yang memiliki area terang dan area berbayang)
akan sangat membantu dalam pembuatan ilusi kedalaman pada kertas dan layar komputer.
Percobaan 1:
Program yang akan dirancang berfungsi untuk mengetahui cara membuat Shading
Opeb Gl di Visual secara benar. Adapun aplikasi yang digunakan adalah aplikasi Microsoft
Visual Studio. Untuk memahami pembuatan Shading Open GL, diperlukan glut.h,
glut32.dll,glut32 dan buka visual studio pilih New Project, pilih Win32 Colsole Application.
Pastikan Precompiled Header dan Security Development Lifecycle (SDL) Checks tidak
diceklis. Ceklis Empty Project.
Analisis Coding :
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <GL/glut.h>
GLenum doubleBuffer;
29
long patchData[][16] = {
{102,103,104,105,4,5,6,7,8,9,10,11,12,13,14,15},
{12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27},
{24,25,26,27,29,30,31,32,33,34,35,36,37,38,39,40},
{96,96,96,96,97,98,99,100,101,101,101,101,0,1,2,3,},
{0,1,2,3,106,107,108,109,110,111,112,113,114,115,116,117},
{118,118,118,118,124,122,119,121,123,126,125,120,40,39,38,37},
{41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56},
{53,54,55,56,57,58,59,60,61,62,63,64,28,65,66,67},
{68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83},
{80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95}
};
float cpData[][3] = {
{0.2,0,2.7},{0.2,-0.112,2.7},{0.112,-0.2,2.7},{0,-0.2,2.7},
{1.3375,0,2.53125},{1.3375,-0.749,2.53125},{0.749,-1.3375,2.53125},
{0,-1.3375,2.53125},{1.4375,0,2.53125},{1.4375,-0.805,2.53125},
{0.805,-1.4375,2.53125},{0,-1.4375,2.53125},{1.5,0,2.4},{1.5,-0.84,2.4},
{0.84,-1.5,2.4},{0,-1.5,2.4},{1.75,0,1.875},{1.75,-0.98,1.875},
{0.98,-1.75,1.875},{0,-1.75,1.875},{2,0,1.35},{2,-1.12,1.35},
{1.12,-2,1.35},{0,-2,1.35},{2,0,0.9},{2,-1.12,0.9},{1.12,-2,0.9},
{0,-2,0.9},{-2,0,0.9},{2,0,0.45},{2,-1.12,0.45},{1.12,-2,0.45},
{0,-2,0.45},{1.5,0,0.225},{1.5,-0.84,0.225},{0.84,-1.5,0.225},
{0,-1.5,0.225},{1.5,0,0.15},{1.5,-0.84,0.15},{0.84,-1.5,0.15},
{0,-1.5,0.15},{-1.6,0,2.025},{-1.6,-0.3,2.025},{-1.5,-0.3,2.25},
{-1.5,0,2.25},{-2.3,0,2.025},{-2.3,-0.3,2.025},{-2.5,-0.3,2.25},
{-2.5,0,2.25},{-2.7,0,2.025},{-2.7,-0.3,2.025},{-3,-0.3,2.25},
{-3,0,2.25},{-2.7,0,1.8},{-2.7,-0.3,1.8},{-3,-0.3,1.8},{-3,0,1.8},
{-2.7,0,1.575},{-2.7,-0.3,1.575},{-3,-0.3,1.35},{-3,0,1.35},
{-2.5,0,1.125},{-2.5,-0.3,1.125},{-2.65,-0.3,0.9375},{-2.65,0,0.9375},
{-2,-0.3,0.9},{-1.9,-0.3,0.6},{-1.9,0,0.6},{1.7,0,1.425},
{1.7,-0.66,1.425},{1.7,-0.66,0.6},{1.7,0,0.6},{2.6,0,1.425},
{2.6,-0.66,1.425},{3.1,-0.66,0.825},{3.1,0,0.825},{2.3,0,2.1},
{2.3,-0.25,2.1},{2.4,-0.25,2.025},{2.4,0,2.025},{2.7,0,2.4},
{2.7,-0.25,2.4},{3.3,-0.25,2.4},{3.3,0,2.4},{2.8,0,2.475},
{2.8,-0.25,2.475},{3.525,-0.25,2.49375},{3.525,0,2.49375},
{2.9,0,2.475},{2.9,-0.15,2.475},{3.45,-0.15,2.5125},{3.45,0,2.5125},
{2.8,0,2.4},{2.8,-0.15,2.4},{3.2,-0.15,2.4},{3.2,0,2.4},{0,0,3.15},
{0.8,0,3.15},{0.8,-0.45,3.15},{0.45,-0.8,3.15},{0,-0.8,3.15},
{0,0,2.85},{1.4,0,2.4},{1.4,-0.784,2.4},{0.784,-1.4,2.4},{0,-1.4,2.4},
{0.4,0,2.55},{0.4,-0.224,2.55},{0.224,-0.4,2.55},{0,-0.4,2.55},
{1.3,0,2.55},{1.3,-0.728,2.55},{0.728,-1.3,2.55},{0,-1.3,2.55},
{1.3,0,2.4},{1.3,-0.728,2.4},{0.728,-1.3,2.4},{0,-1.3,2.4},{0,0,0},
{1.425,-0.798,0},{1.5,0,0.075},{1.425,0,0},{0.798,-1.425,0},
{0,-1.5,0.075},{0,-1.425,0},{1.5,-0.84,0.075},{0.84,-1.5,0.075}
};
30
float p[4][4][3], q[4][4][3], r[4][4][3], s[4][4][3];
long i, j, k, l;
teaList = 1;
glNewList(teaList, GL_COMPILE);
glPushMatrix();
glRotatef(270.0, 1.0, 0.0, 0.0);
for (i = 0; i < 10; i++) {
for (j = 0; j < 4; j++) {
for (k = 0; k < 4; k++) {
for (l = 0; l < 3; l++) {
p[j][k][l] = cpData[patchData[i][j*4+k]][l];
q[j][k][l] = cpData[patchData[i][j*4+(3-k)]][l];
if (l == 1) {
q[j][k][l] *= -1.0;
}
if (i < 6) {
r[j][k][l] = cpData[patchData[i][j*4+(3-k)]][l];
if (l == 0) {
r[j][k][l] *= -1.0;
}
s[j][k][l] = cpData[patchData[i][j*4+k]][l];
if (l == 0) {
s[j][k][l] *= -1.0;
}
if (l == 1) {
s[j][k][l] *= -1.0;
}
}
}
}
}
glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, &p[0][0][0]);
glEnable(GL_MAP2_VERTEX_3);
glMapGrid2f(grid, 0.0, 1.0, grid, 0.0, 1.0);
glEvalMesh2(GL_FILL, 0, grid, 0, grid);
glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, &q[0][0][0]);
glEvalMesh2(GL_FILL, 0, grid, 0, grid); if (i < 6)
{
glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, &r[0][0][0]);
glEvalMesh2(GL_FILL, 0, grid, 0, grid);
glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, &s[0][0][0]);
glEvalMesh2(GL_FILL, 0, grid, 0, grid);
}
}
glDisable(GL_MAP2_VERTEX_3);
glPopMatrix();
glEndList();
}
31
static void Init(void)
{
float position[] = {0.0, 3.0, 3.0, 0.0};
float local_view[] = {0.0};
float ambient[] = {0.1745, 0.01175, 0.01175};
float diffuse[] = {0.61424, 0.04136, 0.04136};
float specular[] = {0.727811, 0.626959, 0.626959};
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
glFrontFace(GL_CW);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_AUTO_NORMAL);
glEnable(GL_NORMALIZE);
Teapot(14);
}
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-6.0, 6.0, -6.0, 6.0, -1.0, 10.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
switch (key) {
case 27:
exit(0);
}
32
}
switch (key) {
case GLUT_KEY_UP:
rotX -= 20.0;
glutPostRedisplay();
break;
case GLUT_KEY_DOWN:
rotX += 20.0;
glutPostRedisplay();
break;
case GLUT_KEY_LEFT:
rotY -= 20.0;
glutPostRedisplay();
break;
case GLUT_KEY_RIGHT:
rotY += 20.0;
glutPostRedisplay();
break;
}
}
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glCallList(teaList);
glPopMatrix();
if (doubleBuffer){
glutSwapBuffers();
} else {
glFlush();
}
}
33
doubleBuffer = GL_FALSE;
glutInit(&argc, argv);
Args(argc, argv);
Init();
glutReshapeFunc(Reshape);
glutKeyboardFunc(Key);
glutSpecialFunc(SpecialKey);
glutDisplayFunc(Draw);
glutMainLoop();
}
Hasil Output :
34
LEMBAR PENGESAHAN
Menyetujui,
( ) ( )
Mengetahui,
( Sriani, M.Kom )
35
PROJECT MOBIL
Analisis Coding :
36
37
38
Hasil Output :
39
LEMBAR PENGESAHAN
Menyetujui,
( ) ( )
Mengetahui,
( Sriani, M.Kom )
40
41