先回答
問題3,這對函數的調用就是保證他們之間的變換不會作用於以外的任何繪制,比如繪制第壹個立方體縮放時不調用glPushMatrix()和glPopMatrix(); 妳看看後面的繪制效果。實際上就是保存當前矩陣和恢復當前矩陣啊。。。要是我沒解釋清楚接著問吧
問題1,OpenGL是管道機制的,變換是按順序作用於後面的繪制,所以
glutWireCube?(1.0);glScalef?(2.0,?0.4,?1.0);//這個變換不會作用於他之前的坐標點
問題2,就上臂來說,縮放後的立方體X方向是兩個單位長,如果妳直接做旋轉那個是繞著立方體X方向的中間轉,所以先右移壹個單位,再旋轉就是繞著立方體左端旋轉了,然後再挪回壹個單位。。。由於glPushMatrix()和glPopMatrix(); 的搭配調用,實際上對上臂的變換是作用於前臂的。畫前臂同樣是先右移以保證繞左端旋轉而不是中間,然後再右移壹個單位把它接到上臂那個立方體右端。
下面貼出的代碼按照glPushMatrix()和glPopMatrix()對縮進,看看是不是容易看清些
glPushMatrix();glTranslatef?(-1.0,?0.0,?0.0);
glRotatef?((GLfloat)?shoulder,?0.0,?0.0,?1.0);
glTranslatef?(1.0,?0.0,?0.0);
glPushMatrix();
glScalef?(2.0,?0.4,?1.0);
glutWireCube?(1.0);
glPopMatrix();
glTranslatef?(1.0,?0.0,?0.0);
glRotatef?((GLfloat)?elbow,?0.0,?0.0,?1.0);
glTranslatef?(1.0,?0.0,?0.0);
glPushMatrix();
glScalef?(2.0,?0.4,?1.0);
glutWireCube?(1.0);
glPopMatrix();
glPopMatrix();
glutSwapBuffers();