2022年3月22日 星期二

(圖學筆記)電腦圖學Week05

  Week 05

Step01 介紹電腦圖學之父 Ivan Sutherland Sketchpad 並嘗試再現其研究


Step02-1 打開網頁https://jsyeh.org/3dcg10/ 下載win32.zip 以及data.zip

step02-2 解壓縮 windows至windows資料夾並且將data資料夾放入windows資料夾

step02-3 打開Tranformation.exe 嘗試使用,下面區域可試交換兩行程式碼(移動,轉動)會有自轉,公轉效果。


Step 03-1 將程式碼key入

#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();

}

可得到成果
            

Step 03-2將程式碼改為

#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)
{

}
void mouse(int button ,int state,int x,int y)
{

}
void motion(int x,int y)
{

}
int main(int argc,char** argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("Week05 keyboard");

    glutDisplayFunc(display);
    glutKeyboardFunc(keyboard);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutMainLoop();
}




Step 03-3將程式碼改為
#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();
        glTranslated((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("Week05 keyboard");

    glutDisplayFunc(display);
    glutKeyboardFunc(keyboard);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutMainLoop();
}
可以用滑鼠拉茶壺了


Step 03-4將程式碼改為

#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);
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glTranslated((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)
{
    oldx=mousex;oldy=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("Week05 keyboard");

    glutDisplayFunc(display);
    glutKeyboardFunc(keyboard);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutMainLoop();
}
解決瞬間移動的問題


Step 03-5將程式碼改為
#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);
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glTranslated((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 mousex,int mousey)
{

}
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;
    //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);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutMainLoop();
}

可放大縮小



沒有留言:

張貼留言

VERY BEAUTIFUL, VERY POWERFUL

一.     一樣先安裝且設定好freeglut,OpecCV, 開啟CodeBlocks建立新專案 week11_gundam,                 把 MyGundam.zip下載解壓縮後的data資料夾放到freeglut/bin裡面 把week09_openc...