Lab3

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

Triangle Geometry

사용자 삽입 이미지
void Triangle::init()
{
 glm::vec3 t1 = p + v1;
 glm::vec3 t2 = p + v2;
 glm::vec3 t3 = p + v3;

 // face 1
 vbo.addData(&t1[0], sizeof(glm::vec3)); // vertex position
 vbo.addData(&color[0], sizeof(glm::vec3)); // vertex color
 vbo.addData(&t2[0], sizeof(glm::vec3));
 vbo.addData(&color[0], sizeof(glm::vec3));
 vbo.addData(&t3[0], sizeof(glm::vec3));
 vbo.addData(&color[0], sizeof(glm::vec3));

 numVertices = 3;

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

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

 int iDataStride = 2 * sizeof(glm::vec3); // vertex & color only
 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;
}

Parallelpiped

사용자 삽입 이미지
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;

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

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


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


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


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


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


numVertices = 36;


// create VBO
vbo.createVBO();
vbo.bindVBO();
vbo.uploadDataToGPU(GL_STATIC_DRAW);


// create a VAO
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);


isLoaded = true;
}