顯示具有 08160502_楊炫浩 標籤的文章。 顯示所有文章
顯示具有 08160502_楊炫浩 標籤的文章。 顯示所有文章

2021年6月15日 星期二

電腦圖學week16

這禮拜要把上程式拿來延並要讀入的檔案"angle.txt"

#include <stdio.h>

#include <GL/glut.h>

float angle[20]={},diff=2;

int angleID=0; ///現在要改第幾個角度

int oldx=0;

FILE*fout = NULL;

///FILE*fin = NULL;///檔案指標fin

void timer(int t)

{

    ///glutTimerFunc(30, timer,t+1);

    ///if (fin==NULL) fin=fopen("angle.txt","r");

   ///for(int i=0;i<20;i++) fscanf (fin ,"%f",&angle[i]);///讀資料

    ///glutPostRedisplay();///播放動畫,重畫畫面

}

void mouse (int button,int state,int x,int y)

{

    oldx=x;///mouse按下去時,記下位置

}

void motion(int x,int y)

{

    angle[angleID]+=x-oldx;

    oldx=x;///更新位置

    glutPostRedisplay();


    if (fout==NULL) fout=fopen("angle.txt","w+");

    for (int i=0;i<20;i++) fprintf (fout,"%.1f",angle[i]);

    fprintf (fout,"\n");

    for (int i=0;i<20;i++) printf ("%.1f",angle[i]);

    printf ("\n");

}

void keyboard(unsigned char key,int x,int y)

{

    if (key == '0') angleID=0;

    if (key == '1') angleID=1;

    if (key == '2') angleID=2;

    if (key == '3') angleID=3;

}

void display()

{

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glPushMatrix();

        glutSolidTeapot( 0.3 );///身體

        glPushMatrix();///左半邊

            glTranslatef(-0.3,0,0);///(3)掛在正確的地方

            glRotatef(angle[0],0,0,1);///(2)旋轉

            glTranslatef(-0.3,0,0);///(1)把關節放到正中心

            glutSolidTeapot( 0.3 );///左手臂(重疊了)

                glPushMatrix();

                    glTranslatef(-0.3,0,0);///(3)掛在正確的地方

                    glRotatef(angle[1],0,0,1);///(2)旋轉

                    glTranslatef(-0.3,0,0);///(1)把關節放到正中心

                    glutSolidTeapot( 0.3 );///左手臂(重疊了)

                    glutSolidTeapot( 0.3 );///左手肘(重疊了)

                glPopMatrix();

        glPopMatrix();

        glPushMatrix();///右半邊

            glTranslatef(+0.3,0,0);///(3)掛在正確的地方

            glRotatef(angle[2],0,0,1);///(2)旋轉

            glTranslatef(+0.3,0,0);///(1)把關節放到正中心

            glutSolidTeapot( 0.3 );///左手臂(重疊了)

                glPushMatrix();

                    glTranslatef(+0.3,0,0);///(3)掛在正確的地方

                    glRotatef(angle[3],0,0,1);///(2)旋轉

                    glTranslatef(+0.3,0,0);///(1)把關節放到正中心

                    glutSolidTeapot( 0.3 );///左手臂(重疊了)

                    glutSolidTeapot( 0.3 );///左手肘(重疊了)

                glPopMatrix();

        glPopMatrix();

    glPopMatrix();

    glutSwapBuffers();

}

int main( int argc, char ** argv )

{

    glutInit( &argc, argv );

    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);

    glutCreateWindow("week15 file");


    glutMotionFunc(motion);

    glutDisplayFunc(display);

    glutKeyboardFunc(keyboard);

    glutMouseFunc(mouse);

    glutTimerFunc(0,timer,0);

    glutMainLoop();

}


3.讀檔案,讓他自己動起來

#include <stdio.h>

#include <GL/glut.h>

float angle[20]={},diff=2;

int angleID=0; ///現在要改第幾個角度

int oldx=0;

FILE*fout = NULL;

FILE*fin = NULL;///檔案指標fin

void timer(int t)

{

    glutTimerFunc(30, timer,t+1);

    if (fin==NULL) fin=fopen("angle.txt","r");

    for(int i=0;i<20;i++) fscanf (fin ,"%f",&angle[i]);///讀資料

    glutPostRedisplay();///播放動畫,重畫畫面

}

void mouse (int button,int state,int x,int y)

{

    oldx=x;///mouse按下去時,記下位置

}

void motion(int x,int y)

{

    angle[angleID]+=x-oldx;

    oldx=x;///更新位置

    glutPostRedisplay();


    if (fout==NULL) fout=fopen("angle.txt","w+");

    for (int i=0;i<20;i++) fprintf (fout,"%.1f",angle[i]);

    fprintf (fout,"\n");

    for (int i=0;i<20;i++) printf ("%.1f",angle[i]);

    printf ("\n");

}

void keyboard(unsigned char key,int x,int y)

{

    if (key == '0') angleID=0;

    if (key == '1') angleID=1;

    if (key == '2') angleID=2;

    if (key == '3') angleID=3;

}

void display()

{

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glPushMatrix();

        glutSolidTeapot( 0.3 );///身體

        glPushMatrix();///左半邊

            glTranslatef(-0.3,0,0);///(3)掛在正確的地方

            glRotatef(angle[0],0,0,1);///(2)旋轉

            glTranslatef(-0.3,0,0);///(1)把關節放到正中心

            glutSolidTeapot( 0.3 );///左手臂(重疊了)

                glPushMatrix();

                    glTranslatef(-0.3,0,0);///(3)掛在正確的地方

                    glRotatef(angle[1],0,0,1);///(2)旋轉

                    glTranslatef(-0.3,0,0);///(1)把關節放到正中心

                    glutSolidTeapot( 0.3 );///左手臂(重疊了)

                    glutSolidTeapot( 0.3 );///左手肘(重疊了)

                glPopMatrix();

        glPopMatrix();

        glPushMatrix();///右半邊

            glTranslatef(+0.3,0,0);///(3)掛在正確的地方

            glRotatef(angle[2],0,0,1);///(2)旋轉

            glTranslatef(+0.3,0,0);///(1)把關節放到正中心

            glutSolidTeapot( 0.3 );///左手臂(重疊了)

                glPushMatrix();

                    glTranslatef(+0.3,0,0);///(3)掛在正確的地方

                    glRotatef(angle[3],0,0,1);///(2)旋轉

                    glTranslatef(+0.3,0,0);///(1)把關節放到正中心

                    glutSolidTeapot( 0.3 );///左手臂(重疊了)

                    glutSolidTeapot( 0.3 );///左手肘(重疊了)

                glPopMatrix();

        glPopMatrix();

    glPopMatrix();

    glutSwapBuffers();

}

int main( int argc, char ** argv )

{

    glutInit( &argc, argv );

    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);

    glutCreateWindow("week15 file");


    glutMotionFunc(motion);

    glutDisplayFunc(display);

    glutKeyboardFunc(keyboard);

    glutMouseFunc(mouse);

    glutTimerFunc(0,timer,0);

    glutMainLoop();

}

用按鍵來讀入以及撥放

///把新專案 week16 的程式刪掉

///再把 Week15_file 的 main.cpp 拿來用

#include <stdio.h>

#include <GL/glut.h>

float angle[20]={}, diff=2;///Step05 本來只有1個角度,現在有很多個,初始為0

int angleID=0; ///Step05 現在要改第幾個角度!!!

int oldX=0;

FILE * fout = NULL;

FILE * fin = NULL;///Step02-2 播放動畫,檔案指標fin

void timer( int t ){

//    glutTimerFunc( 30, timer, t+1 );///Step02-2 播放動畫

//    if( fin==NULL ) fin = fopen( "angle.txt", "r" );///Step02-2

//    for(int i=0; i<20; i++) fscanf( fin, "%f", & angle[i] );///Step02-2

//    glutPostRedisplay();///Step02-2 播放動畫 重畫畫面

}

void mouse(int button, int state, int x, int y){

    oldX = x;///當mouse按下去時,記下位置

}

void motion(int x, int y){///當我motion動

    angle[angleID] += x - oldX;///用x-oldX

    oldX = x;///再更新位置

    glutPostRedisplay();///現在這個比較好, 以前會用 display()重畫


//    if(fout==NULL) fout=fopen("angle.txt", "w+");

//    for(int i=0; i<20; i++) fprintf( fout, "%.1f ", angle[i]);

//    fprintf( fout, "\n");///以上2行,寫到檔案

//    for(int i=0; i<20; i++) printf( "%.1f ", angle[i]);

//    printf( "\n");///以上2行,印到畫面 (讓你知道印了什麼資料)

}

void keyboard( unsigned char key, int x, int y){ ///Step05

    if(key=='0') angleID=0; ///Step05

    if(key=='1') angleID=1; ///Step05

    if(key=='2') angleID=2; ///Step05

    if(key=='3') angleID=3; ///Step05

    if(key=='s'){///save存檔, 把所有的動作存檔後,要關掉

        if(fout==NULL) fout=fopen("angle.txt", "w+");

        for(int i=0; i<20; i++) fprintf( fout, "%.1f ", angle[i]);

        fprintf( fout, "\n");///以上2行,寫到檔案

        for(int i=0; i<20; i++) printf( "%.1f ", angle[i]);

        printf( "\n");///以上2行,印到畫面 (讓你知道印了什麼資料)

    }

    if(key=='r'){///read讀檔, 再開之後,才能讀檔

        if( fin==NULL ) fin = fopen( "angle.txt", "r" );///Step02-2

        for(int i=0; i<20; i++) fscanf( fin, "%f", & angle[i] );///Step02-2

        glutPostRedisplay();///Step02-2 播放動畫 重畫畫面

    }

    if(key=='p'){///play利用timer整個播放, 再開之後,才能讀檔


    }

}

void display()

{

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glPushMatrix();

        glutSolidTeapot( 0.3 );///身體

        glPushMatrix();///左半邊

            glTranslatef(-0.3,0,0);///(3)掛在正確的地方

            glRotatef(angle[0], 0,0,1);///(2)旋轉 ///Step05

            glTranslatef(-0.3,0,0);///(1)把關節旋轉中心放到畫面中心

            glutSolidTeapot( 0.3 );///左手臂(沒有重疊)

            glPushMatrix();

                glTranslatef(-0.3,0,0);///(3)掛在正確的地方

                glRotatef(angle[1], 0,0,1);///(2)旋轉 ///Step05

                glTranslatef(-0.3,0,0);///(1)把關節旋轉中心放到畫面中心

                glutSolidTeapot( 0.3 );///左手肘(重疊了)

            glPopMatrix();

        glPopMatrix();

        glPushMatrix();///右半邊

            glTranslatef(+0.3, 0,0 );

            glRotatef(-angle[2], 0,0,1);

            glTranslatef(+0.3, 0,0);

            glutSolidTeapot( 0.3 );///右手臂

            glPushMatrix();

                glTranslatef(+0.3, 0,0 );

                glRotatef(-angle[3], 0,0,1);

                glTranslatef(+0.3, 0,0);

                glutSolidTeapot( 0.3 );///右手肘

            glPopMatrix();

        glPopMatrix();

    glPopMatrix();

    glutSwapBuffers();

}

int main( int argc, char ** argv )

{

    glutInit( &argc, argv );

    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);

    glutCreateWindow("week15 file");


    glutMouseFunc(mouse);

    glutMotionFunc(motion);

    glutKeyboardFunc(keyboard);///Step05 整合很多關節,會去改angleID

    glutTimerFunc(0, timer, 0);///Step04-2 設第1個timer做動畫

    glutDisplayFunc(display);

    glutMainLoop();

}


讓他可以自動撥放之前的存檔

#include <stdio.h>

#include <GL/glut.h>

float angle[20]={},diff=2;

float angleold[20]={},anglenew[20]={};///新舊角度準備內插

int angleID=0; ///現在要改第幾個角度

int oldx=0;

FILE*fout = NULL;

FILE*fin = NULL;///檔案指標fin

void timer(int t)

{

    glutTimerFunc(30, timer,t+1);

    if (t%10==0)

    {

        for (int i=0;i<20;i++) angleold[i]=anglenew[i];

        ///讀新資料之前,先備份

        if (fin==NULL) fin=fopen("angle.txt","r");

        for(int i=0;i<20;i++) fscanf (fin ,"%f",&anglenew[i]);

        ///讀新資料 anglenew[i]^^^^^

    }

    float alpha = (t%10)/10.0;

    for (int i=0;i<20;i++)

    {

        angle[i]=alpha*anglenew[i]+(1-alpha)*angleold[i];

    }

    glutPostRedisplay();///播放動畫,重畫畫面

}

void mouse (int button,int state,int x,int y)

{

    oldx=x;///mouse按下去時,記下位置

}

void motion(int x,int y)

{

    angle[angleID]+=x-oldx;

    oldx=x;///更新位置

    glutPostRedisplay();


    ///if (fout==NULL) fout=fopen("angle.txt","w+");

    ///for (int i=0;i<20;i++) fprintf (fout,"%.1f",angle[i]);

    ///fprintf (fout,"\n");

    ///for (int i=0;i<20;i++) printf ("%.1f",angle[i]);

    ///printf ("\n");

}

void keyboard(unsigned char key,int x,int y)

{

    if (key == '0') angleID=0;

    if (key == '1') angleID=1;

    if (key == '2') angleID=2;

    if (key == '3') angleID=3;



    if (key == 's')///存檔,把所有動作存檔後,要關掉

    {

        if (fout==NULL) fout=fopen("angle.txt","w+");

        for (int i=0;i<20;i++) fprintf (fout,"%.1f",angle[i]);

        fprintf (fout,"\n");

        for (int i=0;i<20;i++) printf ("%.1f",angle[i]);

        printf ("\n");

    }

    if (key == 'r')///讀檔,在開之後才能讀

    {

        if (fin==NULL) fin=fopen("angle.txt","r");

        for(int i=0;i<20;i++) fscanf (fin ,"%f",&angle[i]);///讀資料

        glutPostRedisplay();///播放動畫,重畫畫面

    }

    if (key == 'p')///播放

    {


    }

}

void display()

{

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glPushMatrix();

        glutSolidTeapot( 0.3 );///身體

        glPushMatrix();///左半邊

            glTranslatef(-0.3,0,0);///(3)掛在正確的地方

            glRotatef(angle[0],0,0,1);///(2)旋轉

            glTranslatef(-0.3,0,0);///(1)把關節放到正中心

            glutSolidTeapot( 0.3 );///左手臂(重疊了)

                glPushMatrix();

                    glTranslatef(-0.3,0,0);///(3)掛在正確的地方

                    glRotatef(angle[1],0,0,1);///(2)旋轉

                    glTranslatef(-0.3,0,0);///(1)把關節放到正中心

                    glutSolidTeapot( 0.3 );///左手臂(重疊了)

                    glutSolidTeapot( 0.3 );///左手肘(重疊了)

                glPopMatrix();

        glPopMatrix();

        glPushMatrix();///右半邊

            glTranslatef(+0.3,0,0);///(3)掛在正確的地方

            glRotatef(angle[2],0,0,1);///(2)旋轉

            glTranslatef(+0.3,0,0);///(1)把關節放到正中心

            glutSolidTeapot( 0.3 );///左手臂(重疊了)

                glPushMatrix();

                    glTranslatef(+0.3,0,0);///(3)掛在正確的地方

                    glRotatef(angle[3],0,0,1);///(2)旋轉

                    glTranslatef(+0.3,0,0);///(1)把關節放到正中心

                    glutSolidTeapot( 0.3 );///左手臂(重疊了)

                    glutSolidTeapot( 0.3 );///左手肘(重疊了)

                glPopMatrix();

        glPopMatrix();

    glPopMatrix();

    glutSwapBuffers();

}

int main( int argc, char ** argv )

{

    glutInit( &argc, argv );

    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);

    glutCreateWindow("week15 file");


    glutMotionFunc(motion);

    glutDisplayFunc(display);

    glutKeyboardFunc(keyboard);

    glutMouseFunc(mouse);

    glutTimerFunc(0,timer,0);

    glutMainLoop();

}

2021年6月2日 星期三

week15電腦圖學

 今天教了用記事本存檔,開啟記事本的文字

1.學了新的程式碼FILE*fout=NULL;     fout=fopen("檔名.txt")


#include <stdio.h>

int main(int argc,char**argv)

{

    FILE * fout =NULL;

    fout = fopen("檔名.text","w+");

     printf(     "Hello World\n");

    fprintf(fout,"Hello World\n");

}

2.先把freeglut bin 的dll檔放到week15的專案目錄,再改專案設定

就可以用現在的檔案開啟

3.讀入甚麼字

#include <stdio.h>
int main(int argc,char**argv)
{
///    FILE * fout =NULL;
///    fout = fopen("ÀɦW.text","w+");
///     printf(     "Hello World\n");
///    fprintf(fout,"Hello World\n");
    FILE * fin = NULL;
    fin = fopen("file.txt","r");
    char line[100];
    fscanf(fin, "%s\n",line);
    printf("A: %s\n",line);
    fscanf(fin, "%s\n",line);
    printf("B: %s\n",line);
}

4.接下來是以茶壺當手臂轉動
 glTranslatef(-0.3,0,0);    3.掛在正確的地方 
 glRotatef(angle,0,0,1);   2.旋轉
 glTranslatef(-0.3,0,0);    1.把關節旋轉中心放到畫面中心

#include <stdio.h>///可割可棄
#include <GL/glut.h>
float angle=0,diff=2;
void timer( int t){
    glutTimerFunc(30,timer,t+1);
    angle += diff;
    if(angle>90)diff=-2;
    if(angle<0)diff=+2;
    glutPostRedisplay();
}
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glPushMatrix();
            glTranslatef(-0.3,0,0);
            glRotatef(angle,0,0,1);
            glTranslatef(-0.3,0,0);
            glutSolidTeapot( 0.3 );///身體
            glPushMatrix();
        glPopMatrix();
    glPopMatrix();
    glutSwapBuffers();
}
int main( int argc, char ** argv )
{
    glutInit( &argc, argv );
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week15 file");

    glutTimerFunc(0, timer, 0);
    glutDisplayFunc(display);
    glutMainLoop();
}

5.再加上一個手臂
#include <stdio.h>///可割可棄
#include <GL/glut.h>
float angle=0,diff=2;
void timer( int t){
    glutTimerFunc(30,timer,t+1);
    angle += diff;
    if(angle>90)diff=-2;
    if(angle<0)diff=+2;
    glutPostRedisplay();
}
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glutSolidTeapot(0.3);
        glPushMatrix();
            glTranslatef(-0.3,0,0);
            glRotatef(angle,0,0,1);
            glTranslatef(-0.3,0,0);
            glutSolidTeapot( 0.3 );///身體
            glPushMatrix();
                glTranslatef(-0.3,0,0);
                glRotatef(angle,0,0,1);
                glTranslatef(-0.3,0,0);
                glutSolidTeapot( 0.3 );///身體
            glPopMatrix();
        glPopMatrix();
    glPopMatrix();
    glutSwapBuffers();
}
int main( int argc, char ** argv )
{
    glutInit( &argc, argv );
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week15 file");

    glutTimerFunc(0, timer, 0);
    glutDisplayFunc(display);
    glutMainLoop();
}

6.加入了angleID可以隨著鍵盤按鍵控制手臂
#include <stdio.h>///可割可棄
#include <GL/glut.h>
float angle[20]={},diff=2;
int angleID=0;
void timer( int t){
    glutTimerFunc(30,timer,t+1);
    angle[angleID] += diff;
    if(angle[angleID]>90)diff=-2;
    if(angle[angleID]<0)diff=+2;
    glutPostRedisplay();
}
void keyboard(unsigned char key,int x,int y){
    if(key=='1') angleID=1;
    if(key=='0') angleID=0;
}
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glutSolidTeapot(0.3);
        glPushMatrix();
            glTranslatef(-0.3,0,0);
            glRotatef(angle[0],0,0,1);
            glTranslatef(-0.3,0,0);
            glutSolidTeapot( 0.3 );///身體
            glPushMatrix();
                glTranslatef(-0.3,0,0);
                glRotatef(angle[1],0,0,1);
                glTranslatef(-0.3,0,0);
                glutSolidTeapot( 0.3 );///身體
            glPopMatrix();
        glPopMatrix();
    glPopMatrix();
    glutSwapBuffers();
}
int main( int argc, char ** argv )
{
    glutInit( &argc, argv );
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week15 file");

    glutKeyboardFunc(keyboard);
    glutTimerFunc(0, timer, 0);
    glutDisplayFunc(display);
    glutMainLoop();
}


2021年5月26日 星期三

week14電腦圖學

 #include <GL/glut.h>

void  display()

{

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glutSolidSphere(0.3,30,30);

    glutSwapBuffers();

}

int main(int argc,char**argv)

{

    glutInit(&argc,argv);

    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);

    glutCreateWindow("week14 timer");


    glutDisplayFunc(display);

    glutMainLoop();

}

***glutSolidSphere( 0.3, 30, 30 );///範例偷這一行來      ///   半徑  經度  緯度


#include <GL/glut.h>
///display()函式, 其實 display 是函式指標
float angle=0;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glRotatef( angle, 0, 0, 1 );
        glutSolidCube( 0.3 );
    glPopMatrix();
    ///glutWireSphere( 0.3, 30, 30); ///網格
    glutSwapBuffers();
}
void timer(int t)
///timer響起時, 做你要做的事
{
    glutTimerFunc( 300, timer, t+1 );
    glClearColor( 1, 0, 0, 0 );///背景紅色
    angle++;
    display();///重製畫面
}
int main(int argc, char**argv)
{
    glutInit( &argc, argv );
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
    glutCreateWindow(" Week14 timer ");


    glutDisplayFunc(display);
    glutTimerFunc( 3000 , timer , 0 );
    ///           等多久, 函式 , int t
        glutMainLoop();
}

****讓手旋轉

#include <GL/glut.h>
///display()函式, 其實 display 是函式指標
float angle=0;
void drawArm1()
{
    glPushMatrix();
        glScalef(1, 0.5, 0.5);///變細長的手臂
        glColor3f(0, 1, 0);///綠色的
        glutSolidCube( 0.2 );///手臂
    glPopMatrix();
}
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glColor3f(1, 1, 1); glutSolidCube( 0.4 );///白色的身體
    glPushMatrix();
        glTranslatef( -0.2, 0.2, 0);///(3)掛上肩膀
        glRotatef( angle, 0, 0, 1 );///(2)轉動
        glTranslatef( -0.1, 0, 0);///(1)把旋轉中心(關節) 移到畫面最中心
        drawArm1();///綠色的手臂
    glPopMatrix();
    glutSwapBuffers();
}
int diff=2;
void timer(int t)
///timer響起時, 做你要做的事 (鬧鐘)
{
    glutTimerFunc( 20, timer, t+1 ); ///起床第一件事, 先設定新鬧鐘
    ///glClearColor( 1, 0, 0, 0 );///清背景色:紅色
    if( angle>90 ) diff=diff-2;
    if( angle<0  ) diff=diff+2;
    angle = angle+diff ;
    display();///重製畫面
}
int main(int argc, char**argv)
{
    glutInit( &argc, argv );
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
    glutCreateWindow(" Week14 timer ");


    glutDisplayFunc(display);
    glutTimerFunc( 3000 , timer , 0 );
    ///           等多久, 函式 , int t
        glutMainLoop();
}



2021年5月12日 星期三

week12電腦圖學

 1.先下載老師給的檔案

2.將檔案存取為cpp檔案

3.開啟COLDBLOCKS的OPENGL

4.將main.cpp刪掉換成鋼蛋的程式碼

5.程式碼需要加兩行define

6.程式碼再把調色盤註解調

7.註解完再加入兩行程式碼讓剛但不會旋轉

8.加入maya把剛彈切割選取面

9.要記的存成obj檔


2021年5月5日 星期三

week11電腦圖學

 1.先去下載3個範例並解壓縮

source.zip ,windows,zip,data,zip

2.我們要建立自己的Transformation

3.先開起CodeBlocks把GLUT設定好


4.把檔案加進去


5.把三個放進去

6.將glm.c改成點cpp
7.將tramsformation放入程式碼

8.把檔案放進去
9.把date.zip裡的檔案,放入執行目錄


10.程式碼

#include "glm.h"

GLMmodel* pmodel = NULL;

void drawmodel(void)

{

      if (!pmodel) 

          {

       pmodel = glmReadOBJ("data/porsche.obj");

       if (!pmodel) exit(0);

       glmUnitize(pmodel);

       glmFacetNormals(pmodel);

       glmVertexNormals(pmodel, 90.0);

          }

    glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL);

}

void display()

{

     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

     drawmodel();

     glutSwapBuffers();

}

int main(int argc, char** argv)

{

     glutInit(&argc,argv);

     glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);

     glutCreateWindow("week11 我的3D模型");

     glutDisplayFunc(display);

     glutMainLoop();

}

11.打光程式碼

const GLfloat light_ambient[ ]  = { 0.0f, 0.0f, 0.0f, 1.0f };

const GLfloat light_diffuse[ ]  = { 1.0f, 1.0f, 1.0f, 1.0f };

const GLfloat light_specular[ ] = { 1.0f, 1.0f, 1.0f, 1.0f };

const GLfloat light_position[ ] = { 2.0f, 5.0f, -5.0f, 0.0f };

 

const GLfloat mat_ambient[ ]    = { 0.7f, 0.7f, 0.7f, 1.0f };

const GLfloat mat_diffuse [ ]    = { 0.8f, 0.8f, 0.8f, 1.0f };

const GLfloat mat_specular[ ]   = { 1.0f, 1.0f, 1.0f, 1.0f };

const GLfloat high_shininess[ ] = { 100.0f };

把上面打光的程式碼丟在int main上面

 glEnable(GL_DEPTH_TEST);//如果少了這行3D深度測試就會破圖

    glEnable(GL_LIGHT0);

    glEnable(GL_NORMALIZE);

    glEnable(GL_COLOR_MATERIAL);

    glEnable(GL_LIGHTING);

 

    glLightfv(GL_LIGHT0, GL_AMBIENT,  light_ambient);

    glLightfv(GL_LIGHT0, GL_DIFFUSE,  light_diffuse);

    glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);

    glLightfv(GL_LIGHT0, GL_POSITION, light_position);

 

    glMaterialfv(GL_FRONT, GL_AMBIENT,   mat_ambient);

    glMaterialfv(GL_FRONT, GL_DIFFUSE,   mat_diffuse);

    glMaterialfv(GL_FRONT, GL_SPECULAR,  mat_specular);

    glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);

上面的要丟在    glutMainLoop();上面

 

因為打光後發現圖片是背面的 我們要把模型轉方向

 

void display()

{

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glPushMatrix();

        glRotatef(180,0,1,0);

        drawmodel();

   glPopMatrix();

    glutSwapBuffers();

}

 




距地表面160 Week11

 #include "glm.h" GLMmodel* pmodel = NULL; void drawmodel(void) {     if (!pmodel) { pmodel = glmReadOBJ("data/porsche.obj...