2022年3月22日 星期二

END之書 week05

 1. 3dcg.org.....Transformation.exe...

    下方右鍵,可變自轉、公轉


2-1.按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.5);

    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("week keyboard");


    glutDisplayFunc(display);

    glutKeyboardFunc(keyboard);

    glutMainLoop();

}

2-2. 把上週、上上週的加進去,但中間空白


2-3. 加入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.5);
    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("week keyboard");

    glutDisplayFunc(display);
    glutKeyboardFunc(keyboard);///this week
    glutMouseFunc(mouse);///last last week
    glutMotionFunc(motion);///last week
    glutMainLoop();
}

2-4 加入mouse使其正常移動,並新增背景顏色



#include <GL/glut.h>
#include <stdio.h>

float x=150,y=150,z=0;
int oldX=0,oldY=0;

void display()
{
    glClearColor( 0.3 , 0.4 , 0.6 , 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);
        glColor3f(1,1,0);
        glutSolidTeapot(0.5);
    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("week keyboard");

    glutDisplayFunc(display);
    glutKeyboardFunc(keyboard);///this week
    glutMouseFunc(mouse);///last last week
    glutMotionFunc(motion);///last week
    glutMainLoop();
}

2-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.1 , 0.7 , 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);///縮放為scale倍
        glColor3f(1,1,0);
        glutSolidTeapot(0.5);
    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.1;///放大縮小
    if( mouseX-oldX < 0) scale*=0.9;

    (此行刪除,使其固定原地)

    oldX=mouseX , oldY=mouseY;
    display();
}

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

    glutDisplayFunc(display);
    glutKeyboardFunc(keyboard);///this week
    glutMouseFunc(mouse);///last last week
    glutMotionFunc(motion);///last week
    glutMainLoop();
}

沒有留言:

張貼留言

VERY BEAUTIFUL, VERY POWERFUL

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