W08-1---glu/glut函式
實心的圓形,錐形,環狀圓形
W08-2---關節T-R-T(移動, 旋轉, 移動)機器人手臂
順序 : 畫手臂-移動-旋轉-移動
做一個長方體在中間,讓它可以旋轉
以手肘關節當中心點(0,0)大幅度旋轉
把全部都搬移到右上方(0.5, 0.5, 0)的座標位置
右手 : 複製上手臂到下面當下手臂
(注意 : 最外圍要有備份矩陣跟還原矩陣包起來)
紅色當上手臂,黃色當下手臂
左手 : 複製右手到下面當左手
(注意 : 左右要對稱,(T,R,T)要加負號)
限制手擺動幅度,正常人的手不能繞一整圈~~
~~程式碼~~
#include <Gl/glut.h>
void arm()
{
glPushMatrix();
glScalef(1,0.3,0.3);
glutSolidCube(0.5);
glPopMatrix();
}
float angle=0;
int dx=1;
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();///右邊
glTranslatef(0.2,0,0);///把下面正在轉動的手臂移到右上角
glRotatef(angle, 0, 0, 1);///對Z軸轉動,像時針一樣轉動
glTranslatef(0.25,0,0);///把關節(旋轉中心)放到畫面正中心
glColor3f(1,0,0);///畫紅色的手
arm();///上手臂
glPushMatrix();
glTranslatef(0.25,0,0);///把下面正在轉動的手臂移到右上角
glRotatef(angle, 0, 0, 1);///對Z軸轉動,像時針一樣轉動
glTranslatef(0.25,0,0);///把關節(旋轉中心)放到畫面正中心
glColor3f(1,1,0);///畫黃色的手
arm();///下手臂
glPopMatrix();
glPopMatrix();
glPushMatrix();///左邊
glTranslatef(-0.2,0,0);///把下面正在轉動的手臂移到右上角
glRotatef(-angle, 0, 0, 1);///對Z軸轉動,像時針一樣轉動
glTranslatef(-0.25,0,0);///把關節(旋轉中心)放到畫面正中心
glColor3f(1,0,0);///畫紅色的手
arm();///上手臂
glPushMatrix();
glTranslatef(-0.25,0,0);///把下面正在轉動的手臂移到右上角
glRotatef(-angle, 0, 0, 1);///對Z軸轉動,像時針一樣轉動
glTranslatef(-0.25,0,0);///把關節(旋轉中心)放到畫面正中心
glColor3f(1,1,0);///畫黃色的手
arm();///下手臂
glPopMatrix();
glPopMatrix();
if(angle>60) dx=-1;
if(angle<0) dx=+1;
angle+=0.03*(dx);
glutSwapBuffers();
}
int main(int argc, char**argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("W08");
glutIdleFunc(display);
glutDisplayFunc(display);
glutMainLoop();
}
W08-3---利用T-R-T做出小小兵機器人
~~程式碼~~
#include <Gl/glut.h>#include <stdio.h>
#include <math.h> ///為了 cos() sin()
void arm()
{
glPushMatrix();
glScalef(1,0.3,0.3);
glutSolidCube(0.5);
glPopMatrix();
}
float angle=0;
int dx=1;
float teapotX=0, teapotY=0; ///這裡是-1.0 ~ +1.0的座標
void display()
{
glClearColor(228/255.0, 142/255.0, 190/255.0, 1);///粉色背景
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);///清背景
glBegin(GL_POLYGON); ///開始畫小小兵方的臉
glColor3f((233/255.0),(212/255.0) , (90/255.0));
for(float angle=0;angle<=2*3.1415;angle+=0.01){
glVertex2f( 0.13*cos(angle)+0.3, 0.13*sin(angle)+0.26 );
glVertex2f( 0.13*cos(angle)-0.3, 0.13*sin(angle)+0.26 );
glVertex2f( 0.13*cos(angle)-0.3, 0.13*sin(angle)-0.6 );
glVertex2f( 0.13*cos(angle)+0.3, 0.13*sin(angle)-0.6 );
}
//glVertex2f((-150)/150.2,-(-150)/150.0);///畫圖 : 設定數值
glEnd(); ///結束畫
glBegin(GL_POLYGON); ///開始畫小小兵方的衣服
glColor3f((20/255.0),(113/255.0) , (244/255.0));
for(float angle=0;angle<=2*3.1415;angle+=0.01){
glVertex2f( 0.13*cos(angle)+0.3, 0.13*sin(angle)-0.6 );
glVertex2f( 0.13*cos(angle)-0.3, 0.13*sin(angle)-0.6 );
glVertex2f( 0.13*cos(angle)-0.3, 0.13*sin(angle)-0.4 );
glVertex2f( 0.13*cos(angle)+0.3, 0.13*sin(angle)-0.4);
}
//glVertex2f((-150)/150.2,-(-150)/150.0);///畫圖 : 設定數值
glEnd(); ///結束畫
glBegin(GL_POLYGON); ///開始畫右眼灰
glColor3f((131/255.0),(134/255.0) , (132/255.0));
for(float angle=0;angle<=2*3.1415;angle+=0.01){
glVertex2f( 0.18*cos(angle)+0.155, 0.18*sin(angle)+0.1 );
}
glEnd(); ///結束畫
glBegin(GL_POLYGON); ///開始畫右眼白
glColor3f((252/255.0),(252/255.0) , (242/255.0));
for(float angle=0;angle<=2*3.1415;angle+=0.01){
glVertex2f( 0.125*cos(angle)+0.155, 0.125*sin(angle)+0.1 );
}
glEnd(); ///結束畫
glBegin(GL_POLYGON); ///開始畫右眼球
glColor3f((138/255.0),(51/255.0) , (3/255.0));
for(float angle=0;angle<=2*3.1415;angle+=0.01){
glVertex2f( 0.06*cos(angle)+0.12, 0.06*sin(angle)+0.08 );
}
glEnd(); ///結束畫
glBegin(GL_POLYGON); ///開始畫右眼黑
glColor3f((0/255.0),(0/255.0) , (0/255.0));
for(float angle=0;angle<=2*3.1415;angle+=0.01){
glVertex2f( 0.04*cos(angle)+0.12, 0.04*sin(angle)+0.09 );
}
glEnd(); ///結束畫
glBegin(GL_POLYGON); ///開始畫右眼朱
glColor3f((252/255.0),(252/255.0) , (242/255.0));
for(float angle=0;angle<=2*3.1415;angle+=0.01){
glVertex2f( 0.015*cos(angle)+0.12, 0.015*sin(angle)+0.09 );
}
glEnd(); ///結束畫
glBegin(GL_POLYGON); ///開始畫左眼灰
glColor3f((131/255.0),(134/255.0) , (132/255.0));
for(float angle=0;angle<=2*3.1415;angle+=0.01){
glVertex2f( 0.18*cos(angle)-0.155, 0.18*sin(angle)+0.1 );
}
glEnd(); ///結束畫
glBegin(GL_POLYGON); ///開始畫左眼白
glColor3f((252/255.0),(252/255.0) , (242/255.0));
for(float angle=0;angle<=2*3.1415;angle+=0.01){
glVertex2f( 0.125*cos(angle)-0.155, 0.125*sin(angle)+0.1 );
}
glEnd(); ///結束畫
glBegin(GL_POLYGON); ///開始畫左眼球
glColor3f((50/255.0),(145/255.0) , (15/255.0));
for(float angle=0;angle<=2*3.1415;angle+=0.01){
glVertex2f( 0.06*cos(angle)-0.12, 0.06*sin(angle)+0.08 );
}
glEnd(); ///結束畫
glBegin(GL_POLYGON); ///開始畫左眼黑
glColor3f((0/255.0),(0/255.0) , (0/255.0));
for(float angle=0;angle<=2*3.1415;angle+=0.01){
glVertex2f( 0.04*cos(angle)-0.12, 0.04*sin(angle)+0.09 );
}
glEnd(); ///結束畫
glBegin(GL_POLYGON); ///開始畫左眼朱
glColor3f((252/255.0),(252/255.0) , (242/255.0));
for(float angle=0;angle<=2*3.1415;angle+=0.01){
glVertex2f( 0.015*cos(angle)-0.12, 0.015*sin(angle)+0.09 );
}
glEnd(); ///結束畫
glBegin(GL_POLYGON); ///開始畫嘴巴
glColor3f((244/255.0),(20/255.0) , (20/255.0));
for(float angle=0;angle<=2*3.1415;angle+=0.01){
glVertex2f( 0.04*cos(angle)-0.06, 0.04*sin(angle)-0.18 );
glVertex2f( 0.04*cos(angle)-0, 0.04*sin(angle)-0.23 );
glVertex2f( 0.04*cos(angle)+0.06, 0.04*sin(angle)-0.18 );
glVertex2f( 0.04*cos(angle)+0, 0.04*sin(angle)-0.23 );
}
glEnd(); ///結束畫
glPushMatrix();///右邊
glTranslatef(0.38,-0.4,0);///把下面正在轉動的手臂移到右上角
glRotatef(angle, 0, 0, 1);///對Z軸轉動,像時針一樣轉動
glTranslatef(0.25,0,0);///把關節(旋轉中心)放到畫面正中心
glColor3f((233/255.0),(212/255.0) , (90/255.0));
arm();///上手臂
glPushMatrix();
glTranslatef(0.25,0,0);///把下面正在轉動的手臂移到右上角
glRotatef(angle, 0, 0, 1);///對Z軸轉動,像時針一樣轉動
glTranslatef(0.25,0,0);///把關節(旋轉中心)放到畫面正中心
glColor3f((233/255.0),(212/255.0) , (90/255.0));
arm();///下手臂
glPopMatrix();
glPopMatrix();
glPushMatrix();///左邊
glTranslatef(-0.38,-0.4,0);///把下面正在轉動的手臂移到右上角
glRotatef(-angle, 0, 0, 1);///對Z軸轉動,像時針一樣轉動
glTranslatef(-0.25,0,0);///把關節(旋轉中心)放到畫面正中心
glColor3f((233/255.0),(212/255.0) , (90/255.0));
arm();///上手臂
glPushMatrix();
glTranslatef(-0.25,0,0);///把下面正在轉動的手臂移到右上角
glRotatef(-angle, 0, 0, 1);///對Z軸轉動,像時針一樣轉動
glTranslatef(-0.25,0,0);///把關節(旋轉中心)放到畫面正中心
glColor3f((233/255.0),(212/255.0) , (90/255.0));
arm();///下手臂
glPopMatrix();
glPopMatrix();
if(angle>60) dx=-1;
if(angle<0) dx=+1;
angle+=0.03*(dx);
glutSwapBuffers();
}
int main(int argc, char**argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("W08");
glutIdleFunc(display);
glutDisplayFunc(display);
glutMainLoop();
}










沒有留言:
張貼留言