2024年3月4日 星期一

哈囉你好嗎隨便 week3

1.基本10行


#include <GL/glut.h>

void display()
{
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);///清畫面

    glColor3f(0,0,0);///顏色(RGB)
    glutSolidTeapot(0.3);///就一個神燈



    glutSwapBuffers();///畫好提交
}

int main(int argc, char** argv)///主函式 進階版 看不懂
{
    glutInit( &argc, argv);///把參數給glutInit 初始化
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );///雙緩衝區+3D深度功能
    glutCreateWindow("第二周的程式");///開GLUT視窗

    glutDisplayFunc(display);///用來顯示的函式

    glutMainLoop();
}




2.mouse

void mouse (int button, int state , int x,int y )
{
 自己的要求
}///點下去一次 放開也一次


    glutCreateWindow("第二周的程式");///開GLUT視窗

    在這裡    

    glutMainLoop();


void mouse (int button, int state , int x,int y )
{
 printf("%d %d %d %d\n",button,state,x,y);
}///印出座標--->記得要include <stdio.h>
四個數字
0左鍵 1中鍵 2右鍵
0點下去 1放開
x
y


if(state==GLUT_DOWN)///如果左鍵壓下去
{
 printf("(%d-150)/150  -(%d-150)/150\n",x,y);
}///印出座標--->記得要include <stdio.h>



3.範例 


去https://jsyeh.org/3dcg10/
下載 data跟win32
把data丟在win32
執行 Transformation.exe
可以去玩他


4.讓茶壺跟我者滑鼠動

(前年的)
#include <GL/glut.h>
float mouseX=0, mouseY=0;
void myTeapot(float x,float y)
{
///    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);///清畫面
    glPushMatrix();///備份舊的位置
        ///移動會累積,因為它會修改矩陣
        glTranslatef(x,y,0);///右上角
        glColor3f(1,1,0);///顏色(RGB)
        glutSolidTeapot(0.3);///就一個神燈
    glPopMatrix();///還原矩陣

}
void display()
{
     glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
     myTeapot((mouseX-150)/150.0,-(mouseY-150)/150.0);
     glutSwapBuffers();
}
void mouse (int button, int state , int x,int y )
{
    mouseX=x; mouseY=y;
}
int main(int argc, char** argv)///主函式 進階版 看不懂
{
    glutInit( &argc, argv);///把參數給glutInit 初始化
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );///雙緩衝區+3D深度功能
    glutCreateWindow("week03-移動");///開GLUT視窗

    glutDisplayFunc(display);
    glutMouseFunc(mouse);

    glutMainLoop();
}



(今年的)
#include <GL/glut.h>
float teapotX=0, teapotY=0;
void myTeapot(float x,float y)
{
///    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);///清畫面
    glPushMatrix();///備份舊的位置
        ///移動會累積,因為它會修改矩陣
        glTranslatef(x,y,0);///右上角
        glColor3f(1,1,0);///顏色(RGB)
        glutSolidTeapot(0.3);///就一個神燈
    glPopMatrix();///還原矩陣

}
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 )
{
    teapotX=(x-150)/150.0;
    teapotY=-(y-150)/150.0;
}
int main(int argc, char** argv)///主函式 進階版 看不懂
{
    glutInit( &argc, argv);///把參數給glutInit 初始化
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );///雙緩衝區+3D深度功能
    glutCreateWindow("week03-移動");///開GLUT視窗

    glutDisplayFunc(display);
    glutMouseFunc(mouse);

    glutMainLoop();
}


功能一樣

5.旋轉

首先訂一個旋轉軸
旋轉軸先定義點 定義完之後與原點的連線
訂好後右手比讚方向指向你的旋轉軸
其餘4指方向為旋轉方向
xyz的軸方向不要搞錯




6.實作(旋轉)

(前年的)

#include <GL/glut.h>

void display()
{
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);///清畫面
    glPushMatrix();///備分矩陣
        glRotatef(90,0,0,1);///旋轉
        glColor3f(1,0,0);///顏色(RGB)
        glutSolidTeapot(0.3);///就一個神燈
    glPopMatrix();///還原矩陣

    glutSwapBuffers();///畫好提交
}

int main(int argc, char** argv)///主函式 進階版 看不懂
{
    glutInit( &argc, argv);///把參數給glutInit 初始化
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );///雙緩衝區+3D深度功能
    glutCreateWindow("第4周的程式");///開GLUT視窗

    glutDisplayFunc(display);///用來顯示的函式

    glutMainLoop();
}


(今年的)

#include <GL/glut.h>
#include <stdio.h>
float angle = 0;
float teapotX=0, teapotY=0;
void myTeapot(float x,float y);

void display()
{
     glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
      glPushMatrix();
        glRotatef(angle,0,0,1);
        glutSolidTeapot(0.3);///就一個神燈
    glPopMatrix();///還原矩陣

     glutSwapBuffers();
}
void mouse (int button, int state , int x,int y )
{///修正
    teapotX=(x-150)/150.0;
    teapotY=-(y-150)/150.0;
}

void motion(int x, int y)
{
    angle=x;
    display();
}
int main(int argc, char** argv)///主函式 進階版 看不懂
{
    glutInit( &argc, argv);///把參數給glutInit 初始化
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );///雙緩衝區+3D深度功能
    glutCreateWindow("week03-旋轉");///開GLUT視窗

    glutDisplayFunc(display);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);

    glutMainLoop();
}


7.用鍵盤融合


#include <GL/glut.h>
#include <stdio.h>
float angle = 0;
float teapotX=0, teapotY=0;

void myTeapot(float x,float y);

void display()
{
     glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
      glPushMatrix();
      glTranslatef(teapotX,teapotY,0);
        glRotatef(angle,0,0,1);
        glutSolidTeapot(0.3);///就一個神燈
    glPopMatrix();///還原矩陣

     glutSwapBuffers();
}

int method=1;///1 rotate 2 translate
int oldX=0,oldY=0;

void mouse (int button, int state , int x,int y )
{
 oldX=x;
 oldY=y;
}
void keyboard(unsigned char key , int x, int y)
{
    if (key=='e')method=1;///rotate
    if (key=='w')method=2;///transltate
}
void motion(int x, int y)
{
    if(method==1)
    {
        angle+=x-oldX;
    }
    else if(method==2)
    {
        teapotX+=(x-oldX)/150.0;
        teapotY-=(y-oldY)/150.0;
    }

    oldX=x;
    oldY=y;
    display();
}
int main(int argc, char** argv)///主函式 進階版 看不懂
{
    glutInit( &argc, argv);///把參數給glutInit 初始化
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );///雙緩衝區+3D深度功能
    glutCreateWindow("week03-旋轉");///開GLUT視窗

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

沒有留言:

張貼留言