1.介紹電腦圖學之父 伊凡·愛德華·蘇澤蘭 (Ivan Edward Sutherland)
出生:生於美國內布拉斯加州黑斯廷斯,計算機科學家,被認為是「計算機圖形學之父」[1]。因發明Sketchpad,拓展了計算機圖形學的領域,為1988年圖靈獎得主。
生平:在卡內基技術學院(今卡內基梅隆大學)取得學士學位,於加州理工學院取得碩士。1963年,在麻省理工學院取得計算機工程博士學位。他在博士論文中提出的Sketchpad程式,被認為是計算機圖形學的一大突破。
1962年,他著手進行自己的博士論文,在麻省理工學院開始創作Sketchpad程式。克勞德·夏農同意擔任他的指導教授,馬文·閔斯基等人也參與指導。
2.看課本範例
1.至https://jsyeh.org/3dcg10/下載 WIN32跟data.zip後解壓縮,並把data丟進去windows裡面,並執行Transformation.exe
2.在下面按下滑鼠右鍵 Swap translate/rotate ,讓物件公轉/自轉
3.從上禮拜的部落格中,複製上周的程式並加上
void keyboard( unsigned char key, int x, int y)
{
printf("現在按下:%c 座標在:%d %d\n", key, x, y);
}
#include <GL/glut.h>#include <stdio.h>void display(){glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );glColor3f( 1, 1, 0);glutSolidTeapot(0.3);glutSwapBuffers();}void keyboard( unsigned char key, int x, int y){printf("現在按下:%c 座標在:%d %d\n", key, x, y);}int main(int argc, char**argv){glutInit( &argc, argv );glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );glutCreateWindow("week06 keyboard");glutDisplayFunc( display );glutKeyboardFunc(keyboard);glutMainLoop();}
4.加入Mouse, Motion函式
#include <GL/glut.h>#include <stdio.h>float x=0, y=0, z=0, oldX, oldY;void display(){glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );glTranslatef( (x-150)/150.0, -(y-150)/150.0, z);glColor3f( 1, 1, 0);glutSolidTeapot(0.3);glPopMatrix();glutSwapBuffers();}void keyboard( unsigned char key, int x, int y){printf("現在按下:%c 座標在:%d %d\n", key, x, y);}void mouse( int botton, int state, int mouseX, int mousY){oldX = mouseX; oldY = mouseY;}void motion(int mouseX, int mousY){x += (mouseX-oldX);y += (mouseY-oldY);oldX = mouseX; oldY = mouseY;display();}int main(int argc, char**argv){glutInit( &argc, argv );glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );glutCreateWindow("week06 keyboard");glutDisplayFunc( display );glutKeyboardFunc(keyboard);glutMouseFunc(mouse);glutMotionFunc(motion);glutMainLoop();}
#include <GL/glut.h>#include <stdio.h>float x=0, y=0, z=0, scale=1.0, oldX, oldY;void display(){glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );glPushMatrix();//glTranslatef( (x-150)/150.0, -(y-150)/150.0, z);glScaled( scale, scale, scale );glColor3f( 1, 1, 0);glutSolidTeapot(0.3);glPopMatrix();glutSwapBuffers();}void keyboard( unsigned char key, int x, int y){printf("現在按下:%c 座標在:%d %d\n", key, x, y);}void mouse( int botton, int state, int mouseX,int mouseY){oldX = mouseX; oldY = mouseY;}void motion(int mouseX, int mouseY){if(mouseX>oldX )scale= scale * 1.01;if(mouseX<oldX )scale= scale * 0.99;//x += (mouseX-oldX);//y += (mouseY-oldY);oldX = mouseX; oldY = mouseY;display();}int main(int argc, char**argv){glutInit( &argc, argv );glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );glutCreateWindow("week06 keyboard");glutDisplayFunc( display );glutKeyboardFunc(keyboard);glutMouseFunc(mouse);glutMotionFunc(motion);glutMainLoop();}
#include <GL/glut.h>#include <stdio.h>float x=0, y=0, z=0, scale=1.0, angle=0.0, oldX, oldY;int now=1;void display(){glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );glPushMatrix();glTranslatef( (x-150)/150.0, -(y-150)/150.0, z);glScaled( scale, scale, scale );glRotatef( angle, 0, 0, 1);glColor3f( 1, 1, 0);glutSolidTeapot(0.3);glPopMatrix();glutSwapBuffers();}void keyboard( unsigned char key, int x, int y){//printf("現在按下:%c 座標在:%d %d\n", key, x, y);if(key=='w'|| key=='W')now=1;if(key=='e'|| key=='E')now=2;if(key=='r'|| key=='R')now=3;}void mouse( int botton, int state, int mouseX,int mouseY){oldX = mouseX; oldY = mouseY;}void motion(int mouseX, int mouseY){if(now==1){x += (mouseX-oldX);y += (mouseY-oldY);}else if(now==3){if(mouseX>oldX ) scale= scale * 1.01;if(mouseX<oldX ) scale= scale * 0.99;}oldX = mouseX; oldY = mouseY;display();}int main(int argc, char**argv){glutInit( &argc, argv );glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );glutCreateWindow("week06 keyboard");glutDisplayFunc( display );glutKeyboardFunc(keyboard);glutMouseFunc(mouse);glutMotionFunc(motion);glutMainLoop();}
7.使其增加選轉模式並更新背景顏色
#include <GL/glut.h>#include <stdio.h>float x=250, y=250, z=0, scale=1.0, angle=0.0, oldX, oldY;int now=1;void display(){glClearColor(0.5, 0.5, 0.5, 1);glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );glPushMatrix();glTranslatef( (x-250)/250.0, -(y-250)/250.0, z);glRotatef( angle, 0, 0, 1);glScaled( scale, scale, scale );glColor3f( 1, 1, 0);glutSolidTeapot(0.3);glPopMatrix();glutSwapBuffers();}void keyboard( unsigned char key, int x, int y){//printf("現在按下:%c 座標在:%d %d\n", key, x, y);if(key=='w'|| key=='W')now=1;if(key=='e'|| key=='E')now=2;if(key=='r'|| key=='R')now=3;}void mouse( int botton, int state, int mouseX,int mouseY){oldX = mouseX; oldY = mouseY;}void motion(int mouseX, int mouseY){if(now==1){x += (mouseX-oldX);y += (mouseY-oldY);}else if(now==2){angle += (mouseX-oldX);}else if(now==3){if(mouseX>oldX ) scale= scale * 1.01;if(mouseX<oldX ) scale= scale * 0.99;}oldX = mouseX; oldY = mouseY;display();}int main(int argc, char**argv){glutInit( &argc, argv );glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );glutInitWindowSize(500, 500);glutCreateWindow("week06 keyboard");glutDisplayFunc( display );glutKeyboardFunc(keyboard);glutMouseFunc(mouse);glutMotionFunc(motion);glutMainLoop();}
沒有留言:
張貼留言