2022/3/15 第五周
主題 : 移動、旋轉、縮放、矩陣
1. 電腦圖學之父------伊凡·蘇澤蘭 Ivan Edward Sutherland
發明
2. 開啟windows/transformation.exe
下面可以交換Rotatef跟Translatef的上下順序
公轉與自轉的差別
#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("week05 keyboard");
glutDisplayFunc(display);
glutKeyboardFunc(keyboard);///鍵盤函式
glutMainLoop();
}
4. 配合上周的滑鼠函式 和 motion函式
#include <GL/glut.h>
#include <stdio.h>
float x=0, y=0, z=0;
int oldX=0, oldY=0;
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();///備份矩陣
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 mouseX, int mouseY)///鍵盤函式 keyboard
{
}
void mouse(int button, int state, int mouseX, int mouseY)///上上週的主題 mouse
{
}
void motion(int mouseX, int mouseY)///上週的主題 motion
{
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("week05 keyboard");
glutDisplayFunc(display);
glutKeyboardFunc(keyboard);///鍵盤函式 keyboard
glutMouseFunc(mouse);///上上週的主題 mouse
glutMotionFunc(motion);///上週的主題 motion
glutMainLoop();
}
5. 讓茶壺出現在中間 跟 加上背景顏色 和 修改茶壺在移動的時候的瞬間移動問題
#include <GL/glut.h>
#include <stdio.h>
float x=150, y=150, z=0;///茶壺出現在中間
int oldX=0, oldY=0;
void display()
{
glClearColor(0.5, 0.5, 0.5, 1);///背景顏色 灰 R,G,B,A A:半透明功能
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();///備份矩陣
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 mouseX, int mouseY)///鍵盤函式 keyboard
{
}
void mouse(int button, int state, int mouseX, int mouseY)///上上週的主題 mouse
{
oldX = mouseX; oldY = mouseY;///解決瞬間移動的問題
}
void motion(int mouseX, int mouseY)///上週的主題 motion
{
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("week05 keyboard");
glutDisplayFunc(display);
glutKeyboardFunc(keyboard);///鍵盤函式 keyboard
glutMouseFunc(mouse);///上上週的主題 mouse
glutMotionFunc(motion);///上週的主題 motion
glutMainLoop();
}
6. 讓茶壺可以放大縮小
#include <GL/glut.h>
#include <stdio.h>
float x=150, y=150, z=0 ,scale=1.0;
int oldX=0, oldY=0;
void display()
{
glClearColor(0.5, 0.5, 0.5, 1);///背景顏色 灰 R,G,B,A A:半透明功能
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();///備份矩陣
glTranslatef((x-150)/150.0, -(y-150)/150.0, z);
glScalef(scale,scale,scale);///縮放都乘 scale倍
glColor3f(1,1,0);
glutSolidTeapot(0.3);
glPopMatrix();///還原矩陣
glutSwapBuffers();
}
void keyboard(unsigned char key, int mouseX, int mouseY)///鍵盤函式 keyboard
{
}
void mouse(int button, int state, int mouseX, int mouseY)///上上週的主題 mouse
{
oldX = mouseX; oldY = mouseY;///解決瞬間移動的問題
}
void motion(int mouseX, int mouseY)///上週的主題 motion
{
if( mouseX-oldX > 0 ) scale*=1.01;///往右邊拉 放大
if( mouseX-oldX < 0 ) 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("week05 keyboard");
glutDisplayFunc(display);
glutKeyboardFunc(keyboard);///鍵盤函式 keyboard
glutMouseFunc(mouse);///上上週的主題 mouse
glutMotionFunc(motion);///上週的主題 motion
glutMainLoop();
}
###題外話------想要將github的程式碼放在blogger
1. gist.github.com
2. 再用blogger左上角(筆)的html檢視,把紅色圈起來的網址貼上去
沒有留言:
張貼留言