2024年3月11日 星期一

week04

 #week04

#在看glScalef

!:下載課本的範例:https://jsyeh.org/3dcg10/

2:下載data win32

3:把win32和data解壓縮

4:試glScalef(X,Y,Z);


##week04_mouse_glScalef

程式碼:
!!!!#include <GL/glut.h>
float s=1;///一開始是原本的一倍得大小
void display()
{   ///設定清背景的顏色
    glClearColor(1,1,0.9,1);
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glColor3f(0,1,0);///3f是R.G.B
    glPushMatrix();///備份矩陣
      glScalef(s,s,s);///縮放s倍
      glutSolidTeapot(0.3);
      glPopMatrix();
      glutSwapBuffers();
}


void motion(int x,int y)
{
    s=1+(x-150)/150.0;///會變大變小的變數0~1~2
    display();///重畫畫面喔
}
int main(int argc, char *argv[])
{
    glutInit(&argc, argv);///140
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);///143
     glutCreateWindow("week04_mouse_glScalef");///145
     glutDisplayFunc(display);///148
     glutMotionFunc(motion);
     glutMainLoop();///174
}









##試著交換translate/roate兩行程式
1:試課本範例:Transformation
2:先把translate移到右方,在rotate看看
3:下方程式,按右鍵,可swap translate/rotate交換
4 在rotare看看,差在哪裡
5:鏡頭分自轉和公轉
6:選轉軸不一樣
7:好像把一個自傳的人 搬到右邊去
8:好像是 吃辦桌時 桌子的大圓盤 把東西放上去 
 
#理解的技巧
把左耳靠著左肩 在看程式碼(從下往上看)
2:把旋轉中 長胖的藍色的車˙ 移到右邊去
!!程式碼
#include <GL/glut.h>
float teaportX=0.5,teaportY=0;///放右邊
float angle=0;///選轉角度
float s=0.;///一開始是原本的一倍得大小
void display()
{   ///設定清背景的顏色
    glClearColor(1,1,0.9,1);
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glColor3f(0,1,0);///3f是R.G.B
    glPushMatrix();///備份矩陣
       glTranslated(teaportX,teaportY,0);
       glRotatef(angle++,0,0,1);
       glScalef(s,s,s);///縮放s倍
       glutSolidTeapot(0.3);
      glPopMatrix();
      glutSwapBuffers();
}


void motion(int x,int y)
{
    s=1+(x-150)/150.0;///會變大變小的變數0~1~2
    display();///重畫畫面喔
}
int main(int argc, char *argv[])
{
    glutInit(&argc, argv);///140
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);///143
     glutCreateWindow("week04_mouse_glScalef");///145
     glutIdleFunc(display);///沒事做就display
     glutDisplayFunc(display);///148
     glutMotionFunc(motion);
     glutMainLoop();///174
}


!!第三個程式碼
1:茶壺會繞中心轉
#include <GL/glut.h>
float teaportX=0.5,teaportY=0;///放右邊
float angle=0;///選轉角度
float s=0.;///一開始是原本的一倍得大小
void display()
{   ///設定清背景的顏色
    glClearColor(1,1,0.9,1);
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glColor3f(0,1,0);///3f是R.G.B
    glPushMatrix();///備份矩陣
      glRotatef(angle++,0,0,1);
       glTranslated(teaportX,teaportY,0);
       glScalef(s,s,s);///縮放s倍
       glutSolidTeapot(0.3);
      glPopMatrix();
      glutSwapBuffers();
}


void motion(int x,int y)
{
    s=1+(x-150)/150.0;///會變大變小的變數0~1~2
    display();///重畫畫面喔
}
int main(int argc, char *argv[])
{
    glutInit(&argc, argv);///140
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);///143
     glutCreateWindow("week04_mouse_glScalef");///145
     glutIdleFunc(display);///沒事做就display
     glutDisplayFunc(display);///148
     glutMotionFunc(motion);
     glutMainLoop();///174
}

  ##
week04_keyboard_mouse_motion
1:把10行複製上去
程式碼:
#include<GL/glut.h>
#include <stdio.h>
void display()
{

    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
      glutSolidTeapot(0.3);
     glutSwapBuffers();
}
void keyboard(unsigned char key,int x,int y){
printf("key:%c x:%d y:%d\n",key,x,y);
}
int main(int argc, char *argv[])
{
    glutInit(&argc, argv);///140
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);///143

     glutCreateWindow("week04 keyboard mouse motion");///145
    glutDisplayFunc(display);
     glutKeyboardFunc(keyboard);///148

     glutMainLoop();///174
}

4:第四個名字是keyboard mouse
按一下就會有茶壺出現
!! 程式碼
#include<GL/glut.h>
#include <stdio.h>
int N=0;
float teaportX[1000],teaportY[1000];
void display()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    for(int i=0;i<N;i++){
        glPushMatrix();
         glTranslatef(teaportX[i],teaportY[i],0);
         glutSolidTeapot(0.3);
     glPopMatrix();
    }
    glutSwapBuffers();
}
void keyboard(unsigned char key,int x,int y){
printf("key:%c x:%d y:%d\n",key,x,y);
}///小心中文輸入法,要切換成英文
void mouse(int button,int state,int x,int y){
 teaportX[N]=(x-150)/150.0;
 teaportY[N]=-(y-150)/150.0;
 N++;
}
int main(int argc, char *argv[])
{
    glutInit(&argc, argv);///140
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);///143

     glutCreateWindow("week04 keyboard mouse motion");///145
    glutDisplayFunc(display);
     glutKeyboardFunc(keyboard);///148
    glutMouseFunc(mouse);
     glutMainLoop();///174
}




  
   

沒有留言:

張貼留言