💩Step01 用鍵盤顯示座標
1.前置作業:https://jsyeh.org/3dcg10/ 下載 window、data
2.到 moodle 下載 freeglut 解壓縮
3.開啟 codeblocks 建立新的 GLUT 檔案
-檔名:week05_keyboard
2.到 moodle 下載 freeglut 解壓縮
3.開啟 codeblocks 建立新的 GLUT 檔案
-檔名:week05_keyboard
-製作出一個滑鼠移到圖片某個位置,然後按一個數字或英文,會在小視窗上出現座標
#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("第05週的程式哦!");
glutDisplayFunc(display);
glutKeyboardFunc(keyboard);
glutMainLoop();
}
#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("第05週的程式哦!");
glutDisplayFunc(display);
glutKeyboardFunc(keyboard);
glutMainLoop();
}
💩Step02 接續 week05_keyboard 新增一個 keyboard+mouse+motion
1.檔名:week05_keyboard_mouse_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)
{
}
void mouse(int button,int state,int mouseX,int mouseY)
{
}
void motion(int mouseX,int mouseY)
{
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("第05週的程式哦!");
glutDisplayFunc(display);
glutKeyboardFunc(keyboard);
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutMainLoop();
}
#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)
{
}
void mouse(int button,int state,int mouseX,int mouseY)
{
}
void motion(int mouseX,int mouseY)
{
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("第05週的程式哦!");
glutDisplayFunc(display);
glutKeyboardFunc(keyboard);
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutMainLoop();
}
💩Step03 增加 scale 放大縮小功能
1.讓滑鼠往右移的時候會放大,往左時縮小
#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);
glColor3f(1,1,0);///黃色
glutSolidTeapot(0.3);///茶壺
glPopMatrix();///還原矩陣
glutSwapBuffers();
}
void keyboard(unsigned char key, int x, int y)
{
}
void mouse(int button,int state,int mouseX,int mouseY)
{
///為了解決瞬間移動的錯誤,改用正確的方法
oldX=mouseX; oldY=mouseY;
}
void motion(int mouseX,int mouseY)
{
if(mouseX-oldX > 0) scale *= 1.01;
if(mouseX-oldX < 0) scale *= 0.99;
oldX=mouseX; oldY=mouseY;
display();
}
int main(int argc, char** argv)
{
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow("第05週的程式哦!");
glutDisplayFunc(display);
glutKeyboardFunc(keyboard);
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutMainLoop();
完成!!!💞💞💞💞💞💞💞
沒有留言:
張貼留言