Category Archives: Homework

HW3

그래픽스 프로그래밍 실습 #3


– 3D Modeling, Texture mapping, Alpha blending


(321190)


강사: 박경신


2014522


 


제출 방법: 2014613() 12시까지


(e-learning 강의실에 실행파일과 소스코드와 리포트를 전부 학번이름_숙제3.zip”으로 묶어서 제출하도록 합니다. 또한, 소스코트 폴더에 .cpp만 담지 말고 비주얼 스튜디오에서 만든 프로젝트 폴더를 담기 바랍니다.)


참고자료: moglclass.zip
http://dis.dankook.ac.kr/lectures/cg14/moglclass14.zip
http://dis.dankook.ac.kr/lectures/cg14/OpenAL11CoreSDK.zip
(반드시 OpenAL 설치 요망 http://dis.dankook.ac.kr/lectures/cg14/entry/OpenAL-Getting-Started)
 


NOTE: 실습 2의 모든 기능을 그대로 놓은 상태에서 추가 작업을 한다.


 


1. 본인이 제작한 Hierarchical Transformation 구조를 가진 /나무에 텍스쳐와 알파 블렌딩을 넣어준다. (30)


물체에 OpenGL texture mapping을 추가한다. 이때 적어도 2개 이상의 texture image을 사용한다.


 


2. 전체 장면을 꾸며주기 위하여, 주변에 2개 이상의 3차원 모델을 추가로 그려준다. 3차원 모델은 OpenGLalpha blendingtexture mapping을 적용하여 semi-transparent하게 만든다. 예를 들어, (sphere)에 알파 블랜딩을 적용한 나무잎 텍스쳐를 매핑시켜서 나무를 그리면 보다 입체적인 모습의 표현이 가능하다. (15)


본인이 3DMAXMAYA(텍스쳐가 있는) 제작한 모델을 넣어줄 수도 있다. (, 본인이 직접 제작하지 않고 가져왔을 시 그 출처를 밝힐 것)


 


3. 전체 장면에 움직이는 객체 (예를 들어, 꿀벌, 나비)를 추가한다. (15)


-‘1’ KEY를 눌렀을 때, 1인칭 시점(camera viewpoint)으로 변하고 전후좌우(UP/DOWN/LEFT/RIGHT)로 움직일 수 있다. 카메라의 기본 위치는 꽃밭의 정중앙에서 바깥쪽을 바라보는 방향을 향한다.


-‘2’ KEY를 눌렀을 때, 시점이 본인이 제작한 움직이는 객(꿀벌, 나비)의 시점으로 변환한다.


 


4. 사운드 클래스 (OpenAL 라이브러리)를 사용하여 배경음악과 이벤트 사운드 추가한다. (10)


 


5. 창의성, 소스코드 주석처리, 리포트 (40)

OpenAL Getting Started

OpenAL http://www.openal.org/

1. Download OpenAL 1.1 SDK & Installer for Windows and install them


  • OpenAL 1.1 SDK for Windows

  • OpenAL 1.1 Installer for Windows 

    2. Set environment variables



    • Go to Control panel -> System icon -> Advanced tab -> Environment variables
    • Create a new variable called “OAL_ROOT” and set the value “C:\Program Files\OpenAL 1.1 SDK” for Visual Studio .Net 2010

    3. In Visual Studio .Net 2010



    • Configuration Properties -> C/C++ -> General -> Additional Include Directories “$(OAL_ROOT)\include” 추가
    • Configuration Properties -> Linker -> General -> Additional Library Directories “$(OAL_ROOT)\libs\Win32” 추가
    • Configuration Properties -> Linker -> Input -> Additional Dependencies “OpenAL32.lib” 추가
  • HW2

    그래픽스 프로그래밍(321190) 실습 #2


    – 3D graphics & hierarchical transformation & shading


    (321190)


    강사: 박경신


    2014424


    제출 방법: 2014년 5월 16일(금) 밤12시까지


    (e-learning 강의실에 실행파일과 소스코드와 리포트를 전부 “학번이름_숙제2.zip”으로 묶어서 제출하도록 합니다. 또한, 소스코트 폴더에 .cpp만 담지 말고 비주얼 스튜디오에서 만든 프로젝트 폴더를 담기 바랍니다.) 9412924419.cpp1630232889.zip


    참고자료: SimpleCar, SimpleSolar, SimpleMobile 등등


    NOTE: 숙제 1의 기능을 활용해서 3차원 화를 한다.


    0. Display window 크기는 1000 x 1000로 한다.


    1. Hierarchical transformation 구조를 가진 ‘꽃/나무‘ 3종 이상을 만든다. (30점)
    -Geometry 예제 (circle, cube, cylinder, sphere, square)와 Transformation 예제 (car, orbit, planet, robot, simple solar system)를 참고하여 본인만의 ‘꽃/나무 (내부 구성은 창의적으로)’를 구성하여 만든다.
    -‘꽃/나무’에 사과, 배, 복숭아, 벚꽃 등등이 달려있다. (보고서에 스케치 첨부할 것)
    -‘꽃/나무’ 물체는 적어도 3 단계 이상의 계층적 구조를 가진다. (움직임에 적용)


    2. ‘Space bar’-key를 누르면 ‘꽃/나무’가 피어/자라난다. (20점)
    -‘space bar’-key는 ‘꽃/나무’을 피어/자라나게 하는 button이다. 이 키를 다시 누르면 처음부터 다시 자라난다.
    -움직이는 모드에서는 ‘꽃/나무’가 바람에 흔들리듯이 천천히 좌우로 움직이거나 회전을 한다. – 힌트: Idle() 함수를 사용할 것.
    -가능하다면, 2단계 이상의 계층적 구조의 (즉, 부분적으로 다른) 움직임을 ‘꽃/나무’ 물체에 적용하도록 한다.


    3. 메인 프로그램에서, 전체적인 장면에 조명과 재질을 사용하여 3차원 장면의 사실감을 더한다. (10점)


    4. 창의성, 소스코드 주석처리, 리포트 (40점)


    Lab5

    CatmullRom Animation 도형을 그려본다.
    (n-key를 누를 시, “사”-도형이 아지랑이 피어오르듯이 올라간다)

    9955640780.cpp9560298062.cpp

    Sa::Sa(glm::vec3 p_) : GeometryPositionColor()
    {
     p = p_;
     for (int i=0; i<4; i++) pipe[i] = Parallelpiped();

     std::vector<KeyFrame> keyframes;
     keyframes.push_back(KeyFrame(glm::vec3(0, 0, 0), 0)); // Posotion & Time
     keyframes.push_back(KeyFrame(glm::vec3(1, 1, 0), 2000));
    // Posotion & Time
     keyframes.push_back(KeyFrame(glm::vec3(-1, 2, 0),
    4000
    ));
    // Posotion & Time
     keyframes.push_back(KeyFrame(glm::vec3(2, 3, 0), 6000)); // Posotion & Time
     curve = new CatmullRomCurveAnimation(keyframes, false);
    // loop을 원하면 true

     init();
    }

    void Sa::init() // “사”
    {
     glm::vec3 p0 = p;
     pipe[0].set(p0, glm::vec3(0.3f, 0.0f, 0.0f), glm::vec3(0.0f, 0.0f, 0.3f), glm::vec3(0.7f, 1.0f, 0.0f));
     glm::vec3 p1 = p + glm::vec3(1.4f, 0.0f, 0.0f);
     pipe[1].set(p1, glm::vec3(0.3f, 0.0f, 0.0f),
    glm::vec3(0.0f, 0.0f, 0.3f), glm::vec3(-0.7f, 1.0f, 0.0f));
     glm::vec3 p2 = p + glm::vec3(2.0f, 0.0f, 0.0f);
     pipe[2].set(p2, glm::vec3(0.3f, 0.0f, 0.0f), glm::vec3(0.0f, 0.0f, 0.3f), glm::vec3(0.0f, 1.0f,
    0.0f));
     glm::vec3 p3 = p + glm::vec3(2.3f, 0.35f, 0.0f);
     pipe[3].set(p3, glm::vec3(0.5f, 0.0f, 0.0f), glm::vec3(0.0f, 0.0f, 0.3f), glm::vec3(0.0f, 0.3f, 0.0f));
    }

    void Sa::draw(bool wireframe)
    {
     for (int i=0; i<4; i++) pipe[i].draw();
    }

    // GeometryPositionColor 의 update을 override
    bool Sa::update(float elapsedTime)
    {
     if (active)
     {
      if (curve)
      {
       curve->updatePosition(elapsedTime);
       p = curve->getPosition();

       // if time is greater than duration, then set time to duration and set active to false
       if (!curve->getLoop() && elapsedTime >=  curve->getDuration())
       {
        done = true;
        active = false;
       }
      }
      init();
     }
     return true;
    }

    Sa class


    class Parallelpiped : public
    GeometryPositionColor
    {
    public:
     Parallelpiped(glm::vec3 p_=glm::vec3(0, 0, 0), glm::vec3 u=glm::vec3(1, 0, 0), glm::vec3 v=glm::vec3(0, 0, 1), glm::vec3 w=glm::vec3(0, 1, 0));
     void set(glm::vec3 p_, glm::vec3 u_, glm::vec3 v_, glm::vec3 w_);
     void init();
     void draw(bool wireframe=false);


    private:
     //glm::vec3 p; // BL position
     glm::vec3 u;
     glm::vec3 v;
     glm::vec3 w;
    };



    class Sa : public GeometryPositionColor
    {
    public:
     Sa(glm::vec3 p=glm::vec3(0, 0, 0));
     void init();
     void draw(bool wireframe=false);



    private:
     //glm::vec3 p; // BL position
     Parallelpiped pipe[4];
    };




    Parallelpiped::Parallelpiped(glm::vec3 p_, glm::vec3 u_, glm::vec3 v_,
    glm::vec3 w_) : GeometryPositionColor()
    {
     set(p_, u_, v_, w_);
    }

    void Parallelpiped::set(glm::vec3 p_, glm::vec3 u_, glm::vec3 v_, glm::vec3 w_)
    {
     p = p_;
     u = u_;
     v = v_;
     w = w_;
     init();
    }



    void Parallelpiped::init()
    {
     glm::vec3 pu = p + u;
     glm::vec3 pv = p + v;
     glm::vec3 pw = p + w;
     glm::vec3 puv = p + u + v;
     glm::vec3 pvw = p + v + w;
     glm::vec3 puw = p + u + w;
     glm::vec3 puvw = p + u + v + w;



     glm::vec3 frontNormal = glm::cross(u, w);
     glm::vec3 backNormal = glm::cross(w, u);
     glm::vec3 rightNormal = glm::cross(v, w);
     glm::vec3 leftNormal = glm::cross(w, v);
     glm::vec3 topNormal = glm::cross(u, v);
     glm::vec3 bottomNormal = glm::cross(v, u);



     // Front face
     vbo.addData(&p[0],
    sizeof(glm::vec3));
     vbo.addData(&color[0], sizeof(glm::vec3)); //
    vertex color
     vbo.addData(&pu[0],
    sizeof(glm::vec3));
     vbo.addData(&color[0], sizeof(glm::vec3)); //
    vertex color
     vbo.addData(&puw[0],
    sizeof(glm::vec3));
     vbo.addData(&color[0], sizeof(glm::vec3)); //
    vertex color
     vbo.addData(&p[0],
    sizeof(glm::vec3));
     vbo.addData(&color[0], sizeof(glm::vec3)); //
    vertex color
     vbo.addData(&puw[0],
    sizeof(glm::vec3));
     vbo.addData(&color[0], sizeof(glm::vec3)); //
    vertex color
     vbo.addData(&pw[0],
    sizeof(glm::vec3));
     vbo.addData(&color[0], sizeof(glm::vec3)); //
    vertex color



     // Back face
     vbo.addData(&puv[0],
    sizeof(glm::vec3));
     vbo.addData(&color[0], sizeof(glm::vec3)); //
    vertex color
     vbo.addData(&pv[0],
    sizeof(glm::vec3));
     vbo.addData(&color[0], sizeof(glm::vec3)); //
    vertex color
     vbo.addData(&pvw[0],
    sizeof(glm::vec3));
     vbo.addData(&color[0], sizeof(glm::vec3)); //
    vertex color
     vbo.addData(&puv[0],
    sizeof(glm::vec3));
     vbo.addData(&color[0], sizeof(glm::vec3)); //
    vertex color
     vbo.addData(&pvw[0],
    sizeof(glm::vec3));
     vbo.addData(&color[0], sizeof(glm::vec3)); //
    vertex color
     vbo.addData(&puvw[0],
    sizeof(glm::vec3));
     vbo.addData(&color[0], sizeof(glm::vec3)); //
    vertex color



     // Left face
     vbo.addData(&pv[0],
    sizeof(glm::vec3));
     vbo.addData(&color[0], sizeof(glm::vec3)); //
    vertex color
     vbo.addData(&p[0],
    sizeof(glm::vec3));
     vbo.addData(&color[0], sizeof(glm::vec3)); //
    vertex color
     vbo.addData(&pw[0],
    sizeof(glm::vec3));
     vbo.addData(&color[0], sizeof(glm::vec3)); //
    vertex color
     vbo.addData(&pv[0],
    sizeof(glm::vec3));
     vbo.addData(&color[0], sizeof(glm::vec3)); //
    vertex color
     vbo.addData(&pw[0],
    sizeof(glm::vec3));
     vbo.addData(&color[0], sizeof(glm::vec3)); //
    vertex color
     vbo.addData(&pvw[0],
    sizeof(glm::vec3));
     vbo.addData(&color[0], sizeof(glm::vec3)); //
    vertex color



     // Right face
     vbo.addData(&pu[0],
    sizeof(glm::vec3));
     vbo.addData(&color[0], sizeof(glm::vec3)); //
    vertex color
     vbo.addData(&puv[0],
    sizeof(glm::vec3));
     vbo.addData(&color[0], sizeof(glm::vec3)); //
    vertex color
     vbo.addData(&puvw[0],
    sizeof(glm::vec3));
     vbo.addData(&color[0], sizeof(glm::vec3)); //
    vertex color
     vbo.addData(&pu[0],
    sizeof(glm::vec3));
     vbo.addData(&color[0], sizeof(glm::vec3)); //
    vertex color
     vbo.addData(&puvw[0],
    sizeof(glm::vec3));
     vbo.addData(&color[0], sizeof(glm::vec3)); //
    vertex color
     vbo.addData(&puw[0],
    sizeof(glm::vec3));
     vbo.addData(&color[0], sizeof(glm::vec3)); //
    vertex color



     // Top face
     vbo.addData(&pw[0],
    sizeof(glm::vec3));
     vbo.addData(&color[0], sizeof(glm::vec3)); //
    vertex color
     vbo.addData(&puw[0],
    sizeof(glm::vec3));
     vbo.addData(&color[0], sizeof(glm::vec3)); //
    vertex color
     vbo.addData(&puvw[0],
    sizeof(glm::vec3));
     vbo.addData(&color[0], sizeof(glm::vec3)); //
    vertex color
     vbo.addData(&pw[0],
    sizeof(glm::vec3));
     vbo.addData(&color[0], sizeof(glm::vec3)); //
    vertex color
     vbo.addData(&puvw[0],
    sizeof(glm::vec3));
     vbo.addData(&color[0], sizeof(glm::vec3)); //
    vertex color
     vbo.addData(&pvw[0],
    sizeof(glm::vec3));
     vbo.addData(&color[0], sizeof(glm::vec3)); //
    vertex color



     // Bottom face
     vbo.addData(&pv[0],
    sizeof(glm::vec3));
     vbo.addData(&color[0], sizeof(glm::vec3)); //
    vertex color
     vbo.addData(&puv[0],
    sizeof(glm::vec3));
     vbo.addData(&color[0], sizeof(glm::vec3)); //
    vertex color
     vbo.addData(&pu[0],
    sizeof(glm::vec3));
     vbo.addData(&color[0], sizeof(glm::vec3)); //
    vertex color
     vbo.addData(&pv[0],
    sizeof(glm::vec3));
     vbo.addData(&color[0], sizeof(glm::vec3)); //
    vertex color
     vbo.addData(&pu[0],
    sizeof(glm::vec3));
     vbo.addData(&color[0], sizeof(glm::vec3)); //
    vertex color
     vbo.addData(&p[0],
    sizeof(glm::vec3));
     vbo.addData(&color[0], sizeof(glm::vec3)); //
    vertex color



     numVertices = 36;



     // VAO &
    VBOs
     vbo.createVBO();
     vbo.bindVBO();
     vbo.uploadDataToGPU(GL_STATIC_DRAW);



     glGenVertexArrays(1, &vao);
     glBindVertexArray(vao);



     int iDataStride = 2 * sizeof(glm::vec3); // vertex &
    color
     int iDataOffset =
    0;
     glEnableVertexAttribArray(0);
     glVertexAttribPointer(0, 3,
    GL_FLOAT, GL_FALSE, iDataStride, (void*)iDataOffset);
     iDataOffset +=
    sizeof(glm::vec3);
     glEnableVertexAttribArray(1);
     glVertexAttribPointer(1,
    3, GL_FLOAT, GL_FALSE, iDataStride, (void*)iDataOffset);



     isLoaded = true;
    }



    void Parallelpiped::draw(bool wireframe)
    {
     if (!isLoaded)
    return;
     glBindVertexArray(vao);
     glDrawArrays(GL_TRIANGLES, 0,
    numVertices);
    }



    Sa::Sa(glm::vec3 p_) : GeometryPositionColor()
    {
     p = p_;
     for (int i = 0; i < 4; i++)
      pipe[i] = Parallelpiped();
     init();

    }



    void Sa::init() // “사”
    {
     glm::vec3 p0 = p;
     pipe[0].set(p0, glm::vec3(0.3f, 0.0f, 0.0f), glm::vec3(0.0f, 0.0f, 0.3f), glm::vec3(0.7f, 1.0f, 0.0f));
     glm::vec3 p1 = p + glm::vec3(1.4f, 0.0f, 0.0f);
     pipe[1].set(p1, glm::vec3(0.3f, 0.0f, 0.0f), glm::vec3(0.0f, 0.0f, 0.3f), glm::vec3(-0.7f, 1.0f, 0.0f));
     glm::vec3 p2 = p + glm::vec3(2.0f, 0.0f, 0.0f);
     pipe[2].set(p2, glm::vec3(0.3f, 0.0f, 0.0f), glm::vec3(0.0f, 0.0f, 0.3f), glm::vec3(0.0f, 1.0f,
    0.0f));
     glm::vec3 p3 = p + glm::vec3(2.3f, 0.35f, 0.0f);
     pipe[3].set(p3, glm::vec3(0.5f, 0.0f, 0.0f), glm::vec3(0.0f, 0.0f, 0.3f), glm::vec3(0.0f, 0.3f, 0.0f));
    }



    void Sa::draw(bool wireframe)
    {
     for (int i = 0; i < 4; i++)
      pipe[i].draw();
    }

    main update animation

    // each geometry update
     geoList[g_geometrymode]->update(elapsedTime);
     if (geoList[g_geometrymode]->IsAnimationDone())
     {
      g_geometrymode++;
      if (g_geometrymode == 8)
      {
         g_geometrymode = 0;
         for (int i = 0; i < 8; i++) 
       geoList[i]->reset();
      }
      geoList[g_geometrymode]->activate();
      startTime = glutGet(GLUT_ELAPSED_TIME);
      printf(“geoList[%d] animation is activate\n”, g_geometrymode);
     }

    Lab3

    3/28까지 Lab3 – 본인의 도형 1개 그려오기 (Triangle 에서 시작한다. 적어도 10개 이상 정점을 사용할 것).
    본인이 그린 도형에 키보드와 마우스를 이용하여 색깔과 움직임을 넣어본다.
     키보드 ‘q’ 또는 ‘Q’ 버튼을 누르면, 프로그램이 종료한다.
     키보드 SPACEBAR 버튼을 누르면, 도형이 바뀌도록 한다.
     본인이 구상해온 꽃, 별, 나무, 등등의 도형을 그린다.
     키보드 ‘r’ ‘g’ ‘b’ 키를 누르면 RGB 색깔을 바꿔본다.
     마우스를 드래그할 때, 도형이 마우스를 따라다니도록 한다.

    HW1

    그래픽스 프로그래밍(321190) 실습 #1


    – 2D graphics & interaction


    (321190)


    강사: 박경신


    2014321


     


    제출 방법: 2014411() 12시까지


    (e-learning 강의실에 실행파일과 소스코드와 리포트를 전부 “CG14_학번이름_숙제1.zip”으로 묶어서 제출하도록 합니다. 또한, 소스코트 폴더에 .cpp만 담지 말고 비주얼 스튜디오에서 만든 프로젝트 폴더에서 생성한 모든 것을 첨부 바랍니다.)


     


    참고자료: lab2
    사용자 삽입 이미지


    사용자 삽입 이미지사용자 삽입 이미지
    0. Display window
    크기는 600 x 600perspective(45, 1, 1, 100)를 사용한다.


     


    1. 기본 도형 (Geometry) 클래스를 만든다. (10)


    -Quad, Circle, Triangle, Hexagon, Octagon, 등등 (네모, , 삼각, 육각, 팔각형 모양의 카페트) 클래스들 중 본인이 새로운 도형 3개 이상 작성


    -Geometry 클래스는 각 도형 클래스들에 대한 추상 클래스


    -Geometry에서 상속받은 Quad, Circle, Triangle, Hexagon, Octagon, etc


    클래스는 네모, , 삼각, 육각, 팔각형 모양을 그리는 클래스이다.


     


    2. 본인의 이름으로 꽃밭로고를 만든다. (40)


    로고는 반드시 하나씩 자라나는 개체이어야 한다.


    -GL_TRIANGLE_FAN, GL_TRIANGLE_STRIP, GL_LINE_STRIP 등 여러 개의


    다른 기하학적 기본요소들을 반드시 사용해본다.


    다양한 기하 속성 (attributes, color, line width, etc)을 이용하여, 로고 주변에 여러 가지 재미있는 디자인을 추가한다.


    수학적인 공식 또는 기본색이나 모양을 변형하여 날아다니는 잠자리, 나비, 풍선, 각종 캐릭터등을 만든다.


     


    3. 메인 프로그램을 작성한다. (10)


    -keyboard


    -spacebar-key를 누르면, 움직이는 로고를 다시 처음부터 볼 수 있다.


    -q-key 또는 ESC-key를 누르면, 프로그램을 종료한다.


     


    4. 창의성, 소스코드 주석처리, 리포트 (40)