2022年3月21日 星期一

09160111week05

 1-1   到jsyeh.org的3dcg10中

         windows.zip下載 windows\Transformation.exe

         data.zip下載 windows\data\很多模式

         把data拉進windows然後執行windows\Transformation.exe

         右上角換模式,下方可以換角度。

1-2    

  旋轉軸依照不同的x y z轉向不同的方向



依照X軸轉
依照Y軸轉
依照Z軸轉
2-1

#include <GL/glut.h>

void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
    glRotatef(180,0,0,1);  (以x軸旋轉180度)
    glColor3f(1,1,0);
    glutSolidTeapot(0.3);
     glPopMatrix();
    glutSwapBuffers();
}


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

    glutDisplayFunc(display);///Display顯示
    glutMainLoop();
}


2-2
加入angle因為不同的角度,改變茶壺的旋轉方向。
#include <GL/glut.h>
float angle=0;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
    glRotatef(angle,0,0,1);
    glColor3f(1,1,0);
    glutSolidTeapot(0.3);
     glPopMatrix();
    glutSwapBuffers();
}
  void motion(int x,int y)
  {
    angle=x;
    display();
  }

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

    glutDisplayFunc(display);///Display顯示
    glutMotionFunc(motion);
    glutMainLoop();
}

2-3
#include <GL/glut.h>
float angle=0,oldX=0;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
    glRotatef(angle,0,0,1);
    glColor3f(1,1,0);
    glutSolidTeapot(0.3);
     glPopMatrix();
    glutSwapBuffers();
}
  void mouse(int button,int state,int x,int y)
  {
    oldX=x;
  }

   void motion(int x,int y)
  {
     angle+=(x-oldX);
     oldX=x;
     display();
  }

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

    glutDisplayFunc(display);///Display顯示
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutMainLoop();
}
3-1
一開始沒有頂點,用迴圈畫出N個頂點, N++多一個頂點,  x[N-1]=mouseX新增頂點的X座標
  y[N-1]=mouseY新增頂點的Y座標。

#include <stdio.h>
#include <GL/glut.h>
int N=0;  
int x[1000],y[1000];
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glBegin(GL_LINE_LOOP);
    for(int i=0;i<N;i++){
        glVertex2f((x[i]-150)/150.0,-(y[i]-150)/150.0);
    }
     glEnd();
     glutSwapBuffers();
}
  void mouse(int button,int state,int mouseX,int mouseY)
  {
    if(state==GLUT_DOWN){
        N++;
        x[N-1]=mouseX;
        y[N-1]=mouseY;
        printf("現在按下滑鼠,得到新座標 %d %d\n",x[N-1],y[N-1]);
    }
     display();
  }

int main( int argc, char**argv )
{
    glutInit( &argc, argv);
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
    glutCreateWindow("week05 複習mouse");

    glutDisplayFunc(display);///Display顯示
    glutMouseFunc(mouse);

    glutMainLoop();
}
3-2
縮減程式碼讓滑鼠能夠直接畫出圖形。
#include <stdio.h>
#include <GL/glut.h>
int N=0;
int x[1000],y[1000];
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glBegin(GL_LINE_LOOP);
    for(int i=0;i<N;i++){
        glVertex2f((x[i]-150)/150.0,-(y[i]-150)/150.0);
    }
     glEnd();
     glutSwapBuffers();
}
  void motion(int mouseX,int mouseY)
  {

        N++;
        x[N-1]=mouseX;
        y[N-1]=mouseY;
        printf("現在按下滑鼠,得到新座標 %d %d\n",x[N-1],y[N-1]);

        display();
  }

int main( int argc, char**argv )
{
    glutInit( &argc, argv);
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
    glutCreateWindow("week05 複習mouse");

    glutDisplayFunc(display);///Display顯示
    glutMotionFunc(motion);

    glutMainLoop();
}





沒有留言:

張貼留言