進入https://jsyeh.org/3dcg10/
下載date,win32,glut32.dll
解壓縮date.zip,windows.zip
將解壓縮後的date資料夾抓進windows資料夾
再開啟windows中的Transformation.exe
將上星期茶壺的程式碼(基礎10行)
#include <GL/glut.h>
void display()
{
glutSolidTeapot(0.3);
glutSwapBuffers();
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("GLUT Shapes");
glutDisplayFunc(display);
glutMainLoop();
}
加上新的程式碼讓他位移
#include <GL/glut.h>
void display()
{
glPushMatrix();///備份矩陣
glTranslated(0.5,0,0);///位移
glutSolidTeapot(0.3);
glPopMatrix();///還原矩陣
glutSwapBuffers();
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("week03");
glutDisplayFunc(display);
glutMainLoop();
}
mouse函數
加上mouse函數讓它可以偵測按下去的座標
*button
讓茶壺可以跟滑鼠移動
#include <GL/glut.h>
float X=0, Y=0;///利用 global 變數,在函式之間傳值 (大寫XY)
void display()
{
glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);///清背景,不然會有殘影
glPushMatrix();///備份矩陣
glTranslated(X,Y,0);
glutSolidTeapot(0.3);
glPopMatrix();///還原矩陣
glutSwapBuffers();
}
#include <stdio.h>
void mouse(int button,int state,int x,int y)///小寫xy
{ ///button左右鍵等 state按下去是0,放開是1
X=(x-150)/150.0;
Y=-(y-150)/150.0;///口訣:減一半,除一半,y加負號
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("week03");
glutDisplayFunc(display);
glutMouseFunc(mouse);///呼叫mouse函式
glutMainLoop();
}
用mouse函數輔助畫不規則圖形
#include <GL/glut.h>
#include <stdio.h>
void display()
{
glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);
glBegin(GL_POLYGON);
glVertex2f(-0.516,0.340);
glVertex2f(-0.516,0.288);
glVertex2f(-0.512,0.240);
glVertex2f(-0.512,0.156);
glVertex2f(-0.508,0.056);
glVertex2f(-0.516,-0.012);
glVertex2f(-0.476,-0.044);
glVertex2f(-0.408,-0.056);
glVertex2f(-0.264,-0.072);
glVertex2f(-0.152,-0.060);
glVertex2f(0.008,-0.052);
glVertex2f(0.144,0.576);
glVertex2f(0.148,0.496);
glVertex2f(0.132,0.340);
glVertex2f(0.124,0.144);
glVertex2f(0.124,0.048);
glVertex2f(0.140,-0.052);
glVertex2f(0.144,-0.108);
glEnd();
glColor3f(244/255.0, 209/255.0, 33/255.0);
glBegin(GL_POLYGON);
glVertex2f(-0.516,0.352);
glVertex2f(-0.516,0.424);
glVertex2f(-0.516,0.496);
glVertex2f(-0.520,0.568);
glVertex2f(-0.484,0.664);
glVertex2f(-0.452,0.616);
glVertex2f(-0.444,0.540);
glVertex2f(-0.404,0.500);
glVertex2f(-0.396,0.472);
glVertex2f(-0.384,0.444);
glVertex2f(-0.376,0.416);
glVertex2f(-0.284,0.996);
glEnd();
glBegin(GL_POLYGON);
glVertex2f(-0.104,0.504);
glVertex2f(-0.104,0.560);
glVertex2f(-0.104,0.636);
glVertex2f(-0.120,0.748);
glVertex2f(-0.108,0.876);
glVertex2f(-0.060,0.968);
glVertex2f(-0.044,0.900);
glVertex2f(-0.040,0.828);
glVertex2f(-0.016,0.768);
glVertex2f(0.012,0.712);
glVertex2f(0.044,0.644);
glVertex2f(0.064,0.588);
glVertex2f(0.080,0.572);
glEnd();
glutSwapBuffers();
}
void mouse(int button,int state,int x,int y)///小寫xy
{ ///button左右鍵等 state按下去是0,放開是1
float X =(x-250)/250.0;
float Y =-(y-250)/250.0; ///口訣:減一半,除一半,y加負號
if(state==GLUT_DOWN){///只有按下mouse才印出程式
printf(" glVertex2f(%.3f,%.3f);\n",X,Y);
}
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(500,500);
glutCreateWindow("week03");
glutDisplayFunc(display);
glutMouseFunc(mouse);
glutMainLoop();
}
沒有留言:
張貼留言