Lesson 7

Zaměřte se na vhodnou možnost použití dalších návrhových vzorů.

Identifikace těles

Kliknutím do obrazovky určit které těleso jsem vybral:

  • Metody založené na výpočtu průsečíku s tělesy
  • Stencilbuffer
//přidání ID do stencil bufferu
glEnable(GL_STENCIL_TEST);
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
for (všechny kreslené objekty){
   glStencilFunc(GL_ALWAYS, objekt->getID(), 0xFF);
   drawArray(...);
}
//načtení ID a pozice ve světových souřadnicích
GLbyte color[4];
GLfloat depth;
GLuint index;

GLint x = (GLint)cursor.x;
GLint y = (GLint)cursor.y;

int newy = (int)Application::getInstance()->getScene()->getCamera()->getResolution().y – y;

glReadPixels(x, newy, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, color);
glReadPixels(x, newy, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &depth);
glReadPixels(x, newy, 1, 1, GL_STENCIL_INDEX, GL_UNSIGNED_INT, &index);

printf(“Clicked on pixel %d, %d, color %02hhx%02hhx%02hhx%02hhx, depth
%f, stencil index %u\n”, x, y, color[0], color[1], color[2], color[3], depth, index);

//Application::getInstance()->getScene()->getRenderer()->setSelect(index-1);

glm::vec3 screenX = glm::vec3(x, newy, depth);
glm::mat4 view;
glm::mat4 projection; 
glm::vec4 viewPort = glm::vec4(0, 0, getResolution().x, getResolution().y);
glm::vec3 pos = glm::unProject(screenX, view, projection, viewPort);

printf(“unProject [%f,%f,%f]\n”, pos.x, pos.y, pos.z);

 

Funkce knihovny GLM unProject() umožňuje pohodlně převézt bod zpět do lokálního nebo globálního souřadného systému. Vypočte inverzní matice a převede bod (získaný z obrazovky a zetová souřadnice ze z-bufferu) zpět.

glm::vec3 objcoord = glm::unProject(wincoord, view, projection, viewport);