Shapes是什麼?
1. 環境設置
(a) 從 http://www.cmlab.csie.ntu.edu.tw/~jsyeh/3dcg10/ 下載 data.zip, windows.zip 及 glut32.dll
(b) 將 glut32.dll 複製到 windows 資料夾中
2. 打開 windows 資料夾中的 Shapes
3. 在 Command manipulation window (右邊的視窗) 上按右鍵就可以更改顯示的圖形
4. 在每個數值上按住並上下拖曳可以調整數值的大小
5. 在 Screen-space view (左邊的視窗) 上按右鍵 Toggle big vertices 可以將圖形的頂點放大
6. 在 Screen-space view 上按右鍵選 Toggle drawing outlines 可以幫圖形加上邊框
繪製茶壺
1. 依照上禮拜的步驟新增一個 GLUT project
#include <stdio.h>
#include <GL/glut.h>
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glutSolidTeapot(0.3);
glutSwapBuffers();
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
//顯示的參數
glutCreateWindow("A Teapot");
glutDisplayFunc(display);
///glutMouseFunc(mouse);
///glutMotionFunc(motion);
glutMainLoop();
}
印出滑鼠點擊的座標及狀態
#include <stdio.h>
#include <GL/glut.h>
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glutSolidTeapot(0.3);
glutSwapBuffers();
}
void mouse(int button, int state, int x, int y)
{
printf("%d %d %d %d\n", button, state, x, y);
//button: 左, 中, 右鍵
//state: 按下去/彈起
//x, y: mouse 的位置
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
//顯示的參數
glutCreateWindow("A Teapot");
glutDisplayFunc(display);
glutMouseFunc(mouse);
//呼叫函式 mouse
///glutMotionFunc(motion);
glutMainLoop();
}
取得圖形每個頂點的座標
1. 在圖形上任意點擊即可將對應的座標印出,mouse 下壓才會記錄
#include <stdio.h>
#include <GL/glut.h>
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glutSolidTeapot(0.3);
glutSwapBuffers();
}
void mouse(int button, int state, int x, int y)
{
if(state == GLUT_DOWN)
{
printf(" glVertex2f(%f, %f);\n", (x-150)/150.0, (150-y)/150.0);
}
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
//顯示的參數
glutCreateWindow("A Teapot");
glutDisplayFunc(display);
glutMouseFunc(mouse);
//呼叫函式 mouse
///glutMotionFunc(motion);
glutMainLoop();
}
#include <stdio.h>
#include <GL/glut.h>
float teapotX=0, teapotY=0;
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glTranslatef(teapotX, teapotY, 0);
glutSolidTeapot(0.3);
glPopMatrix();
glutSwapBuffers();
}
void motion(int x, int y)
{
teapotX = (x-150)/150.0;
//依照 motion 時的 x 來改 terpot 的座標
teapotY = (150-y)/150.0;
//依照 motion 時的 y 來改 teapot 的座標
glutPostRedisplay();
//重畫畫面
}
int main(int argc, char** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("Week03 Mouse");
glutDisplayFunc(display);
///glutMouseFunc(mouse);
glutMotionFunc(motion);
glutMainLoop();
}
讓圖形跟著滑鼠移動(二)
1. 移動中是以所點選的位置當作原點來移動,類似 Google Map 的移動
#include <stdio.h>
#include <GL/glut.h>
float teapotX=0, teapotY=0;
//茶壺的座標
int oldX=0, oldY=0;
//紀錄mouse在哪裡按下去
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glTranslatef(teapotX, teapotY, 0);
//依照茶壺的座標移動
glutSolidTeapot(0.3);
glPopMatrix();
glutSwapBuffers();
}
void mouse(int button, int state, int x, int y)
{
oldX = x;
oldY = y;
//紀錄按下去的點在哪裡
}
void motion(int x, int y)
//mouse motion 事件
{
teapotX += (x-oldX)/150.0;
teapotY += (oldY-y)/150.0;
oldX = x;
oldY = y;
//紀錄移動後新的位置
glutPostRedisplay();
}
int main(int argc, char** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("Week03 Mouse");
glutDisplayFunc(display);
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutMainLoop();
}













沒有留言:
張貼留言