You are on page 1of 6

8.3.

Memberi Warna Pada Obyek 3 Dimensi


Pada pembahasan di atas, obyek 3 dimensi digambar dalam model wireframe
(kerangka), padahal dalam pemakaian sebenarrnya setiap obyek diberi warna. Pada
obyek 3 dimensi pewarnaan dilakukan dengan mewarnai face, yang artinya setiap face
mempunyai warna. Untuk memberi warna pada setiap face maka fungsi untuk
menggambar obyek 3 dimensi dibuat dengan nama fungsi draw3Dw sebagai berikut:
void draw3Dw(object3D_t obyek, matrix3D_t mat, color_t col){
vector3D_t vec[1600], vecbuff[50];
vector3D_t vecNormal;
point2D_t p[50];
int i,j;
for(i=0;i<obyek.NumberofVertices;i++){
vec[i]=Point2Vector(obyek.pnt[i]);
vec[i]=mat*vec[i];
}
for(i=0;i<obyek.NumberofFaces;i++){
for(j=0;j<obyek.fc[i].NumberofVertices;j++)
vecbuff[j]=vec[obyek.fc[i].pnt[j]];
vecNormal=(vecbuff[1]-vecbuff[0])^(vecbuff[2]-vecbuff[0]);
if(vecNormal.v[2]<0){ for(j=0;j<obyek.fc[i].NumberofVertices;j++)
p[j]=Vector2Point2D(vecbuff[j]);
}
fillPolygon(p,obyek.fc[i].NumberofVertices,col);
}
}
for(i=0;i<obyek.NumberofFaces;i++){
for(j=0;j<obyek.fc[i].NumberofVertices;j++)
vecbuff[j]=vec[obyek.fc[i].pnt[j]];
vecNormal=(vecbuff[1]-vecbuff[0])^(vecbuff[2]-vecbuff[0]);
if(vecNormal.v[2]>=0){
for(j=0;j<obyek.fc[i].NumberofVertices;j++){
p[j]=Vector2Point2D(vecbuff[j]);
}
fillPolygon(p,obyek.fc[i].NumberofVertices,col);
setColor(0,0,0);
drawPolygon(p,obyek.fc[i].NumberofVertices);
}
}
}

Pada face yang terlihat diberi warna sesuai warna yang diinginkan (col) dan diberi garis
kerangka hitam, sedangkan pada face yang tidak terlihat diber warna yang sama tetapi
tidak diberi kerangka.

Contoh 8.2:
Membuat kerucut dengan warna merah, maka pada fungsi userdraw dapat dituliskan
dengan:
void userdraw(void){
matrix3D_t tilting=rotationXMTX(0.5)*rotationYMTX(-0.25);
setColor(0,1,0);
drawAxes(tilting);
object3D_t o;
color_t merah={1,0,0};
createCone(o,30,100,180);
draw3Dw(o,tilting,merah);
}

Hasilnya adalah sebagai berikut:

Gambar 8.5. Contoh kerucut dengan warna merah


Untuk menunjukkan sisi yang tidak terlihat, maka obyek perlu diputar sebesar 90º ke
arah sumbu X, dan programnya menjadi:
void userdraw(void){
matrix3D_t tilting=rotationXMTX(0.5)*rotationYMTX(-0.25);
setColor(0,1,0);
drawAxes(tilting);
object3D_t o;
color_t merah={1,0,0};
matrix3D_t mat=tilting*rotationXMTX(-0.76);
createCone(o,30,100,180);
draw3Dw(o,mat,merah);
}

Hasilnya adalah:

Gambar 8.6. Contoh perwarnaan face

Pewarnaan pada obyek seperti pada gambar 8.5 dan gambar 8.6 tidak
menghasilkan efek grafik yang baik, karena warna pada face meski warna dasarnya
sama tetapi akan memiliki perbedaan karena adanya cahaya yang jatuh pada face
tersebut. Pencahayaan yang jatuh pada benda sering disebut dengan shading yang
merupakan bagian dari optical view yang akan dibahas pada bagian berikut ini. Untuk
menggunakan optical view diperlukan beberapa definisi dan operator tambahan seperti
vektor satuan.
8.4. Memberi Warna Pada Face
Pada pembahasan di atas, warna yang diberikan pada obyek 3 dimensi adalah
sama atau satu warna. Pada pada banyak kasus ada obyek-obyek grafik yang
mempunyai warna yang berbeda pada setiap facenya.
Untuk memberi warna pada face, sehingga setiap face mempunyai warna yang
berbeda, maka definisi face yang sebelumnya adalah:
typedef struct {
int NumberofVertices;
int pnt[100];
} face_t;

ditambahkan definisi warna pada face tersebut, dan dituliskan dengan:


typedef struct {
int NumberofVertices;
int pnt[100];
color_t col;
} face_t;

Dan fungsi untuk menggambar obyek dengan warna yang berbeda-beda pada setiap
face adalah sebagai berikut.
void draw3Dw(object3D_t obyek,matrix3D_t mat){
vector3D_t vec[1600], vecbuff[50];
vector3D_t vecNormal;
point2D_t p[50];
int i,j;
for(i=0;i<obyek.NumberofVertices;i++){
vec[i]=Point2Vector(obyek.pnt[i]);
vec[i]=mat*vec[i];
}
for(i=0;i<obyek.NumberofFaces;i++){
for(j=0;j<obyek.fc[i].NumberofVertices;j++)
vecbuff[j]=vec[obyek.fc[i].pnt[j]];
vecNormal=(vecbuff[1]-vecbuff[0])^(vecbuff[2]-vecbuff[0]);
if(vecNormal.v[2]<0){
for(j=0;j<obyek.fc[i].NumberofVertices;j++){
p[j]=Vector2Point2D(vecbuff[j]);
}
fillPolygon(p,obyek.fc[i].NumberofVertices,obyek.fc[i].col);
}
}
for(i=0;i<obyek.NumberofFaces;i++){
for(j=0;j<obyek.fc[i].NumberofVertices;j++)
vecbuff[j]=vec[obyek.fc[i].pnt[j]];
vecNormal=(vecbuff[1]-vecbuff[0])^(vecbuff[2]-vecbuff[0]);
if(vecNormal.v[2]>=0){
for(j=0;j<obyek.fc[i].NumberofVertices;j++){
p[j]=Vector2Point2D(vecbuff[j]);
}
fillPolygon(p,obyek.fc[i].NumberofVertices,obyek.fc[i].col);
setColor(0,0,0);
drawPolygon(p,obyek.fc[i].NumberofVertices);
}
}
}

Contoh 8.3:
Membuat papan catur dengan warna berselang-seling kuning dan hitam dengan m-8
dan n=8, dapat dilakukan dengan fungsi userdraw berikut:
void userdraw(void){
matrix3D_t tilting=rotationXMTX(0.5)*rotationYMTX(-0.25);
setColor(0,1,0);
drawAxes(tilting);
object3D_t o;
color_t hitam={0,0,0};
color_t kuning={1,1,0};
createPlane(o,8,8,25,25);
for(int i=0;i<o.NumberofFaces;i++)
if(i%2==0)
o.fc[i].col=kuning;
else
o.fc[i].col=hitam;
draw3Dw(o,tilting);
}

Hasilnya adalah:
Gambar 8.7. Contoh papan catur

You might also like