電腦圖學 Week06
今天要來講旋轉的部分~
1. 先用滑鼠來造成旋轉
紅色是新增的部分~
#include <GL/glut.h> ///使用GLUT外掛
#include <stdio.h>
int N=0,vx[2000], vy[2000]; ///有N個頂點
float angle=0; ///角度
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); ///清空
glPushMatrix();
glRotatef(angle,0,0,1); ///旋轉
glScalef(0.5,0.1,0.1); ///調成細長的
glColor3f(0.3,0.3,1.0); ///藍藍的
glutSolidCube(1); ///方塊
glPopMatrix();
glutSwapBuffers(); ///交換兩倍的buffers
}
void Keyboard( unsigned char key,int x,int y)
{
}
void motion(int x,int y) ///mouse motion 的函式
{
angle++;
display(); ///可以讓畫面很流暢
} ///減一半,再除一半,y加負號
int main(int argc,char ** argv)
{
glutInit( &argc,argv); ///GLUT初始設定
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH); ///顯示模式
glutCreateWindow("08161106 腳麻掉"); ///開視窗
glutDisplayFunc(display); ///等一下要顯示的函式
glutMotionFunc( motion ); ///準備mouse motion移動時(拖曳)
glutMainLoop(); ///主要迴圈
}
2. 現在來做一個會自己旋轉的正方形
紅色是新的程式碼
#include <GL/glut.h> ///使用GLUT外掛
float angle=0;
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); ///清空
glPushMatrix(); ///備份矩陣
glRotatef(angle++,0,0,1); ///每次Display就angle++
glutSolidCube(1); ///方塊
glPopMatrix();
glutSwapBuffers(); ///交換兩倍的buffers
}
int main(int argc,char ** argv)
{
glutInit( &argc,argv); ///GLUT初始設定
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH); ///顯示模式
glutCreateWindow("08161106 腳麻掉"); ///開視窗
glutIdleFunc(display); ///idle很閒的時候就一直重複
glutDisplayFunc(display); ///等一下要顯示的函式
glutMainLoop(); ///主要迴圈
}
3. 一個細細長長的長方型的轉動

紅色是新的程式碼
#include <GL/glut.h> ///使用GLUT外掛
float angle=0;
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); ///清空
glPushMatrix(); ///備份矩陣
///glTranslatef(0,0,0); ///(3)把正確旋轉的手臂掛在肩上
glRotatef(angle++,0,0,1); ///(2)轉動
glTranslatef(-0.25,0,0); ///(1)將旋轉中心放在正中心
glScalef(0.5,0.1,0.1); ///細細長長的
glutSolidCube(1); ///方塊
glPopMatrix();
glutSwapBuffers(); ///交換兩倍的buffers
} ///減一半,再除一半,y加負號
int main(int argc,char ** argv)
{
glutInit( &argc,argv); ///GLUT初始設定
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH); ///顯示模式
glutCreateWindow("08161106 腳麻掉"); ///開視窗
glutIdleFunc(display); ///idle很閒的時候就一直重複
glutDisplayFunc(display); ///等一下要顯示的函式
glutMainLoop(); ///主要迴圈
}
4. 一個細細長長的長方型的轉動,加上一個不會動的長方形
#include <GL/glut.h> ///使用GLUT外掛
float angle=0;
void hand()
{
glPushMatrix();
glScalef(0.5,0.1,0.1); ///細細長長的長方形
glutSolidCube(1);
glPopMatrix();
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); ///清空
glPushMatrix(); ///備份矩陣
glTranslatef(-0.25,0,0); ///(3)把正確旋轉的手臂掛在肩上
glRotatef(angle++,0,0,1); ///(2)轉動
glTranslatef(-0.25,0,0); ///(1)將旋轉中心放在正中心
hand();
glPopMatrix();
hand();
glutSwapBuffers(); ///交換兩倍的buffers
} ///減一半,再除一半,y加負號
int main(int argc,char ** argv)
{
glutInit( &argc,argv); ///GLUT初始設定
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH); ///顯示模式
glutCreateWindow("08161106 腳麻掉"); ///開視窗
glutIdleFunc(display); ///idle很閒的時候就一直重複
glutDisplayFunc(display); ///等一下要顯示的函式
glutMainLoop(); ///主要迴圈
}
5. 一個正確的手臂掛在肩關節,一個下手臂掛在手肘關節
#include <GL/glut.h> ///使用GLUT外掛
float angle=0;
void hand()
{
glPushMatrix();
glScalef(0.5,0.1,0.1);
glutSolidCube(1);
glPopMatrix();
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); ///清空
glPushMatrix(); ///備份矩陣
glTranslatef(-0.25,0,0); ///(3)把正確旋轉的手臂掛在肩關節
glRotatef(angle,0,0,1); ///(2)轉動
glTranslatef(-0.25,0,0); ///(1)將旋轉中心放在正中心
hand(); ///上手臂
glPushMatrix(); ///備份矩陣
glTranslatef(-0.25,0,0); ///(3)把正確旋轉的手肘掛在肘關節
glRotatef(angle,0,0,1); ///(2)轉動
glTranslatef(-0.25,0,0); ///(1)將旋轉中心放在正中心
hand(); ///下手肘
glPopMatrix();
glPopMatrix();
glutSwapBuffers(); ///交換兩倍的buffers
angle++; ///要放外面
} ///減一半,再除一半,y加負號
int main(int argc,char ** argv)
{
glutInit( &argc,argv); ///GLUT初始設定
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH); ///顯示模式
glutCreateWindow("08161106 腳麻掉"); ///開視窗
glutIdleFunc(display); ///idle很閒的時候就一直重複
glutDisplayFunc(display); ///等一下要顯示的函式
glutMainLoop(); ///主要迴圈
}
6.機器人的兩隻手~
總共就是兩個Push,兩個Pop,各一組=兩隻手#include <GL/glut.h> ///使用GLUT外掛
float angle=0;
void hand()
{
glPushMatrix();
glScalef(0.5,0.1,0.1);
glutSolidCube(1);
glPopMatrix();
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); ///清空
glPushMatrix(); ///備份矩陣
glTranslatef(-0.25,0,0); ///(3)把正確旋轉的手臂掛在肩關節
glRotatef(angle,0,0,1); ///(2)轉動
glTranslatef(-0.25,0,0); ///(1)將旋轉中心放在正中心
hand(); ///上手臂
glPushMatrix(); ///備份矩陣
glTranslatef(-0.25,0,0); ///(3)把正確旋轉的手肘掛在肘關節
glRotatef(angle,0,0,1); ///(2)轉動
glTranslatef(-0.25,0,0); ///(1)將旋轉中心放在正中心
hand(); ///下手肘
glPopMatrix();
glPopMatrix();
glPushMatrix(); ///備份矩陣
glTranslatef(0.25,0,0); ///(3)把正確旋轉的手臂掛在肩關節
glRotatef(-angle,0,0,1); ///(2)轉動
glTranslatef(0.25,0,0); ///(1)將旋轉中心放在正中心
hand(); ///上手臂
glPushMatrix(); ///備份矩陣
glTranslatef(0.25,0,0); ///(3)把正確旋轉的手肘掛在肘關節
glRotatef(-angle,0,0,1); ///(2)轉動
glTranslatef(0.25,0,0); ///(1)將旋轉中心放在正中心
hand(); ///下手肘
glPopMatrix();
glPopMatrix();
glutSwapBuffers(); ///交換兩倍的buffers
angle++;
} ///減一半,再除一半,y加負號
int main(int argc,char ** argv)
{
glutInit( &argc,argv); ///GLUT初始設定
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH); ///顯示模式
glutCreateWindow("08161106 腳麻掉"); ///開視窗
glutIdleFunc(display); ///idle很閒的時候就一直重複
glutDisplayFunc(display); ///等一下要顯示的函式
glutMainLoop(); ///主要迴圈
}
沒有留言:
張貼留言