Professional Documents
Culture Documents
8
8
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:
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;
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