2023年3月8日 星期三

rita - week04 - 旋轉rotation

 第四週

    第一堂課

         先去到https://jsyeh.org/3dcg10/ 下載data,windows壓縮檔
         並且將解壓縮後的data資料夾放置windows資料夾內



         打開transformation.exe即會成以下畫面

        紅色框框是y軸旋轉軸
如果是(1.00,0.00,0.00)x軸是旋轉軸
如果是(0.00,0.00,1.00)x軸是旋轉軸
           
        依照國中自然課所學右手開掌定則 來思考以下的動作
        右手座標系統,手掌從x掃到y時,會生出拇指z軸朝向自己的鼻子
        轉動時,拇指當旋轉軸再掃出你要的角度  

            
            更改x,y軸都成1.00


            更改度數為50度 將會往右下方旋轉

        

        第二堂課

                開啟codeblocks /去到桌面葉老師上課用軟體/解壓縮freeglut/ 將freeglut資料夾拉到桌面
                lib內複製改名/

                第一個程式(旋轉的白色茶壺)

                   複製上週茶壺的程式剪貼過來並且修修改改
                    #include <GL/glut.h>
                    float angle=0;///step02-1宣告global 全域變數(不在函式裡頭)angle
                    void display()
                    {
                            glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);///清背景,殘影
                            glPushMatrix();///備份矩陣
                            glRotated( angle, 0, 1, 0);///旋轉angle角度
                            glutSolidTeapot( 0.3 );
                            glPopMatrix();///還原矩陣
                            glutSwapBuffers();
                            angle++;///把角度++
                      }
                    int main(int argc, char *argv[])
                    {
                            glutInit(&argc, argv);
                            glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
                            glutCreateWindow("week04");

                            glutDisplayFunc(display);
                            glutIdleFunc(display);///有空idle時,就重畫畫面
                            glutMainLoop();
                      }



         第二個程式(旋轉的黃色茶壺)

                    #include <GL/glut.h>
                     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 };
                    void myLight()
                    {
                            glEnable(GL_DEPTH_TEST);
                            glDepthFunc(GL_LESS);

                            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);
                        }

                        float angle=0;
                        void display()
                        {
                                glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);///清背景
                                glPushMatrix();///備份矩陣
                                glRotated( angle, 0, 1, 0);///旋轉angle角度
                                glutSolidTeapot( 0.3 );
                                glPopMatrix();///還原矩陣
                                glutSwapBuffers();
                                angle++;///把角度++
                        }
                        int main(int argc, char *argv[])
                        {
                                glutInit(&argc, argv);
                                glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
                                glutCreateWindow("week04");

                                glutDisplayFunc(display);
                                glutIdleFunc(display);///有空idle時,就重畫畫面

                                myLight();
                                glutMainLoop();
                          }
            



                更改上個程式 加兩行字!
                更改背景顏色以及茶壺的顏色更改為黃色





            第三堂課

                    打開windows/transform.exe/按右鍵 交換移動旋轉這兩行
                    自轉▼


                    公轉▼
 

             第三個程式(旋轉黃,紅茶壺)

                ///week04-3_rotate_translate
                #include <GL/glut.h>
                float angle=0;///step02-1宣告global 全域變數(不在函式裡頭)angle
                void display()
                {
                        glEnable(GL_DEPTH_TEST);
                        glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);///清背景,殘影
                        glPushMatrix();///備份矩陣
                                glTranslatef(0.6,0,0);
                                glRotated( angle, 0, 1, 0);///旋轉angle角度
                                glColor3f(1,1,0);
                                glutSolidTeapot( 0.3 );
                        glPopMatrix();///step02-1還原矩陣
                        glPushMatrix();///step02-1備份矩陣
                                glRotated( angle, 0, 1, 0);///旋轉angle角度
                                glTranslatef(0.6,0,0);
                                glColor3f(1,0,0);
                                glutSolidTeapot( 0.3 );
                        glPopMatrix();///還原矩陣
                        glutSwapBuffers();
                        angle++;///把角度++
                    }
                int main(int argc, char *argv[])
                {
                        glutInit(&argc, argv);
                        glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
                        glutCreateWindow("week04");

                        glutDisplayFunc(display);
                        glutIdleFunc(display);///有空idle時,就重畫畫面
                        glutMainLoop();
                    }




        

沒有留言:

張貼留言