2022年3月22日 星期二

(OwO)電腦圖學week05_3/22


0.老師介紹:電腦圖學之父 Ivan Sutherland (Sketchpad)




按任一鍵盤顯示其座標


#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);///送給glutInit 初始化


    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );


    glutCreateWindow("第5周程式!");


    glutDisplayFunc(display);


    glutKeyboardFunc(keyboard);


    glutMainLoop();


}



加入上次教的Mouse & Motion


#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);///送給glutInit 初始化


    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );


    glutCreateWindow("第5周程式!");


    glutDisplayFunc(display);


    glutKeyboardFunc(keyboard);

    glutMotionFunc(motion);

    glutMouseFunc(mouse);

    glutMainLoop();



}



可用滑鼠拖曳


#include <GL/glut.h>///簡化程式

#include<stdio.h>

float x=0, y=0, z=0;

int oldX=0 ,oldY=0;

void display()


{


    glPushMatrix();///備份矩陣


    glTranslatef( (x-150)/150.0 ,-(y-150)/150.0 , z);


    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );///畫圖前先清理畫面


    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);///送給glutInit 初始化


    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );


    glutCreateWindow("第5周程式!");


    glutDisplayFunc(display);


    glutKeyboardFunc(keyboard);

    glutMotionFunc(motion);

    glutMouseFunc(mouse);

    glutMainLoop();


}


正確的用滑鼠拖曳


#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);///RGBA,A為半透明功能目前未開

    glPushMatrix();///備份矩陣

    glTranslatef( (x-150)/150.0 ,-(y-150)/150.0 , z);

    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );///畫圖前先清理畫面

    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);///送給glutInit 初始化

    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );

    glutCreateWindow("第5周程式!");

    glutDisplayFunc(display);

    glutKeyboardFunc(keyboard);
    glutMotionFunc(motion);
    glutMouseFunc(mouse);
    glutMainLoop();



}






用滑鼠拖曳控制放大縮小


#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);///RGBA,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 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);///送給glutInit 初始化

    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );

    glutCreateWindow("第5周程式!");

    glutDisplayFunc(display);

    glutKeyboardFunc(keyboard);
    glutMotionFunc(motion);
    glutMouseFunc(mouse);
    glutMainLoop();



}




沒有留言:

張貼留言

VERY BEAUTIFUL, VERY POWERFUL

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