2010年4月11日 星期日

作業二 3D立體木偶機器人


我的機器人:


一.程式設計與寫作方法

這次作業是要繪製3D機器人,這機器人每部分都是使用

glutSolidCube 和 glutSolidSphere 兩種函式完成


剛開始的機器人:

看起來很不立體,後來想到要打光,於是在init()加入光的一些參數:

GLfloat position[] = { 1.0, 1.0, 1.0, 0.0 }; //光源位置

glLightfv(GL_LIGHT0, GL_POSITION, position);

glShadeModel (GL_SMOOTH);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);


之後可以讓機器人有立體感:

糟糕的情況出現了...機器人變成黑白的! 這裡花了我很久的時間研究,

後來發現可以利用:

glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);

這些材質的函式去調每個部分的色彩。


完成機器人架構後開始替他增加功能,全部的部分我都利用:

glPushMatrix();
glTranslatef (oX, oY, oZ); //以這裡為轉動中心點
glRotatef ( rO, 1.0, 0.0, 0.0); //轉動
glTranslatef (rX, rY, rZ); // 離轉動中心多遠
glScalef (sX, sY, sZ);
glutSolidCube (1.0);
glPopMatrix();

利用平移和轉動可以讓機器人做各種動作!

路(按w):

彎腰(按s):

二.心得與討論

這次的作業很有趣,最花時間的部分大概就是

調整轉動中心和讓機器人看起來更有立體感。

這次感覺對opengl更瞭解了,例如這次我設計機器人

他每個身體的架構只差在位置和大小,就可以自己宣告

//drawCube(ownRotateX,ownRotateY,ownRotateZ,RotateObject,revolutionX,

revolutionY,revolutionZ,scaleX,scaleY,scaleZ, r, g, b);


void drawSphere(GLfloat oX,GLfloat oY,GLfloat oZ, GLfloat r, GLfloat g, GLfloat b, GLfloat radius, GLfloat rO);

這樣就讓程式碼大幅縮減。