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