顯示具有 week13 標籤的文章。 顯示所有文章
顯示具有 week13 標籤的文章。 顯示所有文章

2021年6月10日 星期四

嘎嘎烏拉-(電腦圖學)Week13電腦圖學筆記

 這是第一次的遠距上課,有些不習慣,但應該很快就可以適應拉!!

這次上課的課程是沿用第八周的打光程式碼:

#include <opencv/highgui.h>
#include <opencv/cv.h>
#include <GL/glut.h>
GLuint id1, id2;
int myTexture(char * filename)
{
    IplImage * img = cvLoadImage(filename);
    cvCvtColor(img,img, CV_BGR2RGB);
    glEnable(GL_TEXTURE_2D);
    GLuint id;
    glGenTextures(1, &id);
    glBindTexture(GL_TEXTURE_2D, id);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img->width, img->height, 0, GL_RGB, GL_UNSIGNED_BYTE, img->imageData);
    return id;
}
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glBindTexture(GL_TEXTURE_2D, id1);
    glutSolidTeapot(0.3);

    glBindTexture(GL_TEXTURE_2D, id2);
    glBegin(GL_POLYGON);
        glTexCoord2f( 0, 0 ); glVertex2f( -1, -1 );
        glTexCoord2f( 0, 1 ); glVertex2f( -1, +1 );
        glTexCoord2f( 1, 1 ); glVertex2f( +1, +1 );
        glTexCoord2f( 1, 0 ); glVertex2f( +1, -1 );
    glEnd();
    glutSwapBuffers();
}
int main(int argc, char** argv)
{
    glutInit( &argc, argv );
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
    glutCreateWindow(" Week13 ");
    glutDisplayFunc(display);

    id1 = myTexture("Diffuse.jpg");
    id2 = myTexture("bg.jpg");
    glEnable(GL_DEPTH_TEST);
    glutMainLoop();
}
使用Notepad++改cbp檔:
#include <opencv/highgui.h> ///使用 OpenCV 2.1 比較簡單, 只要用 High GUI 即可
#include <opencv/cv.h>
#include <GL/glut.h>
#include "glm.h"
GLMmodel* pmodel = NULL;
GLuint id1, id2; ///TODO:增加2個 貼圖ID
void
drawmodel(void)
{
    if (!pmodel) {
    pmodel = glmReadOBJ("Gundam.obj");
    if (!pmodel) exit(0);
    glmUnitize(pmodel);
    glmFacetNormals(pmodel);
    glmVertexNormals(pmodel, 90.0);
    }
    glmDraw(pmodel, GLM_SMOOTH | GLM_TEXTURE);
}
int myTexture(char * filename)
{
    IplImage * img = cvLoadImage(filename); ///OpenCV讀圖
    cvCvtColor(img,img, CV_BGR2RGB); ///OpenCV轉色彩 (需要cv.h)
    glEnable(GL_TEXTURE_2D); ///1. 開啟貼圖功能
    GLuint id; ///準備一個 unsigned int 整數, 叫 貼圖ID
    glGenTextures(1, &id); /// 產生Generate 貼圖ID
    glBindTexture(GL_TEXTURE_2D, id); ///綁定bind 貼圖ID
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); /// 貼圖參數, 超過包裝的範圖T, 就重覆貼圖
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); /// 貼圖參數, 超過包裝的範圖S, 就重覆貼圖
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); /// 貼圖參數, 放大時的內插, 用最近點
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); /// 貼圖參數, 縮小時的內插, 用最近點
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img->width, img->height, 0, GL_RGB, GL_UNSIGNED_BYTE, img->imageData);
    return id;
}
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glBindTexture(GL_TEXTURE_2D, id1);
    drawmodel();///glutSolidTeapot(0.3);
    glBindTexture(GL_TEXTURE_2D, id2);
    glBegin(GL_POLYGON);
        glTexCoord2f( 0, 0 ); glVertex2f( -1, -1 );
        glTexCoord2f( 0, 1 ); glVertex2f( -1, +1 );
        glTexCoord2f( 1, 1 ); glVertex2f( +1, +1 );
        glTexCoord2f( 1, 0 ); glVertex2f( +1, -1 );
    glEnd();
    glutSwapBuffers();
}
int main(int argc, char** argv)
{
    glutInit( &argc, argv );
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
    glutCreateWindow(" Week13 ");
    glutDisplayFunc(display);
    id1 = myTexture("diffuse.jpg");
    id2 = myTexture("bg.jpg");
    glEnable(GL_DEPTH_TEST);
    glutMainLoop();
}


2021年6月7日 星期一

電腦圖學 week13

 

到moodle下載OpenCV-2.1.0-win32-vs2008.exe
下載的時候要選第2個 Add OpenCV to PATH(執行的目錄之一)
位置用預設的 C:\OpenCV2.1
安裝完再重開codeblocks



        在codeblocks的setting點選Compiler

      Search directories 

        Compiler   C:\OpenCV2.1\include

        Linker  C:\OpenCV2.1\lib


在Linker setting 加入3個檔案
cv210   cxcore210   highgui210
鋼彈圖片加入桌面/freeglut/bin
https://hackmd.io/@jsyeh/opengl有 貼圖範例程式


把 freeglut\bin 的 freeglut.dll copy到專案目錄 week13.01
       把 Diffuse.jpg 及 bg.jpg 移到專案目錄 week13.01

到week13.01裡面貼上
 week13.01\week13.01.cbp 專案檔打開
       兩個working_dir 要改成 "."  再存檔
從source.zip選取glm.c ,glm.h,transformation.c複製到week13.01

gundam還沒切開.zip裡Gundam.mtl , Gundam.obj , Diffuse.jpg複製到week13.01


glm.c改成glm.cpp
 開 transformation.c 複製裡面的程式
 1.  #include "glm.h"
 2.     GLMmodel * pmodel = NULL;
 
3. 再 copy drawmodel() 的函式, 改glmReadOBJ("
Gundam.obj") 及 改右邊 glmDraw(... GLM_TEXTURE) , 並在 display()裡叫 drawmodel()



圖檔Diffuse.jpg看起來需要上下反過來, 可用小畫家幫忙,存檔後再執行即可


先整體旋轉 glPushMatrix(); glRotatef(角度, 0,1,0); 畫圖; glPopMatrix();




2021年5月26日 星期三

chjyuʕ •ᴥ•ʔ week14 Timer

 1.Timer

  • step1

程式碼:

#include <GL/glut.h>

void display()

{

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glutSolidSphere(0.3, 30, 30);///實心圓

                            ///半徑         ///橫切

    ///glutWireSphere(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();

}

執行結果:










  • step2

程式碼:

#include <GL/glut.h>

void display()

{

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    ///glutSolidSphere(0.3, 30, 30);

    glutWireSphere(0.3, 30, 30);

    glutSwapBuffers();

}

void timer(int t){

    glClearColor( 1, 0, 0, 0);

    display();

}

int main( int argc, char**argv)

{

    glutInit( &argc, argv );

    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );

    glutCreateWindow(" Week14 timer ");

    glutDisplayFunc(display);

    glutTimerFunc(3000, timer, 0);

    glutMainLoop();

}

執行結果:

解釋timer函式:









  • step3

程式碼:

#include <GL/glut.h>

float angle=0;

void display()

{

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glPushMatrix();

        glRotatef(angle, 0,0,1);

        glutSolidCube(0.3);

    glPopMatrix();

    glutSwapBuffers();

}

(1)void timer(int t){

    glutTimerFunc(30, 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);

    glutMainLoop();

}

執行結果:


step4 左右旋轉
程式碼:
int diff=2;
(1)void timer(int t){
    glutTimerFunc(30, timer, t+1);
    glClearColor(1, 0, 0, 0);
    if(angle>90) diff=-2;
    if(angle<0) diff=+2;
    angle += diff;
    display();
}
執行結果:

step5 TRT
程式碼:
#include <GL/glut.h>
float angle=0;
void drawArml(){
    glPushMatrix();
        glScalef(1, 0.5, 0.5);
        glColor3f(1, 0, 0);
        glutSolidCube(0.2);
    glPopMatrix();
}
void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glColor3f(1,1,1);
        glutSolidCube(0.4);
        glPushMatrix();
            glTranslatef(-0.2, 0.2, 0);
            glRotatef(angle,0,0,1 );
            glTranslatef(-0.1,0,0);
            drawArml();
        glPopMatrix();
    glPopMatrix();
    glutSwapBuffers();
}
int diff=2;
void timer(int t)
{
    glutTimerFunc(30, timer, t+1);///起床,先設定新鬧鐘
    ///glClearColor(1, 0, 0, 0);
     if(angle>90) diff=-2;
    if(angle<0) diff=+2;
    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);
    glutMainLoop();
}
執行結果:













2021年5月24日 星期一

鋼彈模型

 -安裝opencv、GLUT

-把老師的bg.jpg、Diffuse.jpg下載並放在glut的bin裡面

-設定好codeblocks的compiler

利用老師網頁裡的範例 把diffuse的圖檔打開

-把剛剛放在glut/bin裡的jpg跟dll檔放到專案目錄裡 

-利用notepad++把檔案位置改成"."

-glm.c改檔名(cpp)>是

-gundam還沒切開.zip Diffuse.jpg,Gundam.obj,Gundam.mtl複製到專案目錄

-codeblocks重開,打開cbp檔,再add file(glm.cpp)

-右鍵transformation.c ,notepad++

-複製程式碼 

-編輯Diffuse.jpg (垂直翻轉)
-利用float angle喬角度
程式碼:

#include <opencv/highgui.h>
#include <opencv/cv.h>
#include <GL/glut.h>
#include "glm.h"
GLMmodel * pmodel = NULL;
GLMmodel * arm1 = NULL;
GLMmodel * arm2 = NULL;
GLMmodel * hand = NULL;

void
drawmodel(void)
{
    if (!pmodel) {
pmodel = glmReadOBJ("Gundam.obj");
if (!pmodel) exit(0);
glmUnitize(pmodel);
glmFacetNormals(pmodel);
glmVertexNormals(pmodel, 90.0);
    }

    glmDraw(pmodel, GLM_SMOOTH | GLM_TEXTURE);
}

GLuint id1, id2;
int myTexture(char * filename)
{
    IplImage * img = cvLoadImage(filename);
    cvCvtColor(img,img, CV_BGR2RGB);
    glEnable(GL_TEXTURE_2D);
    GLuint id;
    glGenTextures(1, &id);
    glBindTexture(GL_TEXTURE_2D, id);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img->width, img->height, 0, GL_RGB, GL_UNSIGNED_BYTE, img->imageData);
    return id;
}
float angle=180;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glBindTexture(GL_TEXTURE_2D, id1);
    glPushMatrix();
        glRotatef(angle,0,1,0);
        drawmodel();
    glPopMatrix();
    glBindTexture(GL_TEXTURE_2D, id2);
    glBegin(GL_POLYGON);
        glTexCoord2f( 0, 0 ); glVertex2f( -1, -1 );
        glTexCoord2f( 0, 1 ); glVertex2f( -1, +1 );
        glTexCoord2f( 1, 1 ); glVertex2f( +1, +1 );
        glTexCoord2f( 1, 0 ); glVertex2f( +1, -1 );
    glEnd();
    glutSwapBuffers();
}
int main(int argc, char** argv)
{
    glutInit( &argc, argv );
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
    glutCreateWindow(" Week08 ");
    glutDisplayFunc(display);

    id1 = myTexture("Diffuse.jpg");
    id2 = myTexture("bg.jpg");
    glEnable(GL_DEPTH_TEST);
    glutMainLoop();
}







2021年5月19日 星期三

防疫Day3

  •  

=======================================================================

  • 今天上課先複習了貼圖程式

  • 程式碼 :
#include <opencv/highgui.h> ///使用 OpenCV 2.1 比較簡單, 只要用 High GUI 即可
#include <opencv/cv.h>
#include <GL/glut.h>
GLuint id1, id2; ///TODO:增加2個 貼圖ID
int myTexture(char * filename)
{
    IplImage * img = cvLoadImage(filename); ///OpenCV讀圖
    cvCvtColor(img,img, CV_BGR2RGB); ///OpenCV轉色彩 (需要cv.h)
    glEnable(GL_TEXTURE_2D); ///1. 開啟貼圖功能
    GLuint id; ///準備一個 unsigned int 整數, 叫 貼圖ID
    glGenTextures(1, &id); /// 產生Generate 貼圖ID
    glBindTexture(GL_TEXTURE_2D, id); ///綁定bind 貼圖ID
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); /// 貼圖參數, 超過包裝的範圖T, 就重覆貼圖
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); /// 貼圖參數, 超過包裝的範圖S, 就重覆貼圖
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); /// 貼圖參數, 放大時的內插, 用最近點
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); /// 貼圖參數, 縮小時的內插, 用最近點
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img->width, img->height, 0, GL_RGB, GL_UNSIGNED_BYTE, img->imageData);
    return id;
}
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glBindTexture(GL_TEXTURE_2D, id1);
    glutSolidTeapot(0.3);

    glBindTexture(GL_TEXTURE_2D, id2);
    glBegin(GL_POLYGON);
       glTexCoord2f(0,1); glVertex2f(-1,-1);
        glTexCoord2f(1,1); glVertex2f(+1,-1);
        glTexCoord2f(1,0); glVertex2f(+1,+1);
        glTexCoord2f(0,0); glVertex2f(-1,+1);

    glEnd();
    glutSwapBuffers();
}
int main(int argc, char** argv)
{
    glutInit( &argc, argv );
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
    glutCreateWindow(" Week08 ");
    glutDisplayFunc(display);

    id1 = myTexture("diffuse.jpg");
    id2 = myTexture("bg.jpg");
    glEnable(GL_DEPTH_TEST);
    glutMainLoop();
}


  •  Notepad++把 week13_robot\week13_robot.cbp 專案檔打開
  •  兩個working_dir 要改成 "."  




  •  檔案 source.zip    (glm.h glm.cpp(改), transformation.c)
  •  gundam還沒切開.zip 裡的 Gundam.obj    Gundam.mtl      Diffuse.jpg 

  • 都移動到專案資料夾裡

ADD 程式
(用Notepad++開)

程式碼: 
  • #include "glm.h"
  • GLMmodel* pmodel = NULL; void drawmodel(void) { if (!pmodel) { pmodel = glmReadOBJ("Gundam.obj"); if (!pmodel) exit(0); glmUnitize(pmodel); glmFacetNormals(pmodel); glmVertexNormals(pmodel, 90.0); } glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL); }





  • 複製 drawmodel() 的函式, 改glmReadOBJ("檔名") 及 改 glmDraw(... GLM_TEXTURE)

  •   display()裡叫 drawmodel()

  • 用小畫家上下顛倒翻轉






築損 Week13

 第1部份

打開codeblocks 

安裝freeglut

安裝opencv

到codeblocks setting/compiler 設定

compiler C:/OpenCV2.1/include

linker C;/OpenCV2.1/lib

linker setting cv210 cxcore210 highgui210

到https://hackmd.io/@jsyeh/opengl複製主程式

貼到codeblocks新增的專案中

到Teams 下載bg.jpg Diffuse.jpg

將puipui.jpg改成Diffuse.jpg

將freeglut/bin中的freeglut.dll bg.jpg Diffuse.jpg複製貼到專案目錄裡

把Week13.cbp用notepad++打開把執行目錄改成"."

codeblocks 會reload 選擇yes

執行結果一樣

moodle下載source.zip

把souce.zip中 glm.c, glm.h, transformation.c 複製貼到專案目錄裡

moodle 下載gumdam還沒切開 

把gumdam還沒切開中 Gundam.mtl, Gundam.mtl, Diffuse.jpg 複製貼到專案目錄裡

將gim.cpp匯入專案

transformation.c用notepad++打開

複製

#include "glm.h"

GLMmodel* pmodel = NULL;

void drawmodel(void)

{

    if (!pmodel) {

pmodel = glmReadOBJ("Gundam.obj");

if (!pmodel) exit(0);

glmUnitize(pmodel);

glmFacetNormals(pmodel);

glmVertexNormals(pmodel, 90.0);

    }


    glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL);

}

貼到main.cpp中

把GLM_MATERIAL蓋成GLM_TEXTURE

把茶壺註解掉

換成drawmodel();

執行後圖案會上下顛倒

回到專案目錄中把Diffuse.jpg用小畫家上下翻轉存檔

再執行就會是背對的Gundam

加上旋轉的程式碼

angle設定成180

glPushMatrix();

        glRotatef(angle,0,1,0);

        drawmodel();///glutSolidTeapot(0.3);S

glPopMatrix();

Gundam就會轉成正面

執行結果
















-----------------------------------------------------------------------------------------------------------------------------

第0部份


執行結果


-----------------------------------------------------------------------------------------------------------------------------

【】week13 複習3D【】

遠距

先將東西安裝好 

開啟GLUT專案

先讓貼圖成功


記得將puipui改成Diffuse
將目錄(cbp檔)從"/bin"改成"."
改完後在專案資料夾裡
準備好source(glm.h、glm.c改成glm.cpp、transformation.c)、gundam還沒切開(Gundam.obj、Gundam.mtl、Diffuse.jpg)

將glm.cpp加入,把transformation.c裡的程式放進main.cpp


在diaplay裡呼叫drawmodel(Diffuse.jpg圖要調一下)
旋轉一下


自動旋轉、新增指標

距地表面160 Week11

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