一、基本功能
實現了機器人的一隻手臂,由上臂、下臂、五根手指共同組成,通過A、S、D、F、G鍵向上旋轉,通過a、s、d、f、g鍵向下旋轉,通過方向鍵left和right轉向,通過up和down實現放縮。
效果圖如下:
二、實現過程
1、實現手臂
對於手臂的實現,可以使用一個經過放縮後的立方體作爲手臂的一段。手臂模型搭建好後,就是要確定手臂的位置,因爲手臂進行旋轉,不是繞手臂的中心節點(等同於立體體的體心)進行旋轉,它是繞手臂的一條邊(等同於立方體的一條邊)進行旋轉。
因此先調用glTranslatef()函數移動至手臂的旋轉邊上,在旋轉邊進行旋轉glRotate(),再走glTranslatef()進行繪製,此時繪製點即手臂的中心節點,而我們旋轉的位置在手臂的旋轉邊上。實現代碼如下所示:
glTranslatef(0.0, 0.0, -distance);
glRotatef(theta, 0.0, 1.0, 0.0);
/*繪製第一段*/
glTranslatef(-1.0*n, 0.0, 0.0);
glRotatef(shoulder, 0.0, 0.0, 1.0);
glTranslatef(1.0*n, 0.0, 0.0);
glPushMatrix();
glColor4f(1.0f, 0.0, 0.0, 0.0);
glScalef(2.0*n, 0.4*n, 1.0*n);
glutSolidCube(1.0);
//glutWireCube(1.0);
glPopMatrix();
繪製完該段手臂後,可以繼續使用上述代碼實現下臂。
2、實現手指
因爲手指的寬度是比手臂要窄的多,因此,繪製手指,需要先沿手臂寬度方向移動位置,設置好每個手指的起始位置,而手指的位置方法同手臂,因此循環上述過程即可。
3、實現手動控制手臂的轉動
通過創建鍵盤響應的相應回調函數即可實現這一功能。
4、遇到的問題與思考
在實現過程中,我在手指的繪製過程中卡了一下,因爲我自己認爲我寫的幾何變換沒有問題,但是卻無法被繪製出來,因此我想造成這種問題是否是我幾何變換導致的,因此我反覆推算幾何變換過程的結果,自己覺得並沒有問題,因此我進行放縮、旋轉進行觀察,判斷其是否可能是因爲被裁剪掉了,之後我發現也不是這個問題,因此我想是不是我給的放大係數n12、n13太小了導致的。因此我將其放大到與n一樣的大小,甚至更大,我發現我的手指可以畫出來,只是很小,我再次推送我的幾何變換式子,發現了問題之所在,我對glScalef的變換沒有去保護環境,也就是說,我的手指,是在n11的基礎上進一步被縮小了,而我的n11放縮係數是第一節手指,n12是第二節手指,因此我第二節手指的實際放縮倍數爲了n11*n12,導致畫出的手指很小,幾乎看不到,導致這一結果的原因也是因爲,自己一直漏考慮到了glScalef的變換。
5、源代碼
待上傳