void PointSolver2::solve (cv::Mat &inputImage, Point3 &startPos, Quaternion &startOrientation) { assert (inputImage.type() == CV_8UC1); position0 = startPos; orientation0 = startOrientation; image = inputImage; prepareImage (); #define ITERATION 5 for (int np=0; np<ITERATION; np++) { currentViewMatrix = createViewMatrix (position0, orientation0); projectLines (); findNearestLinePerPoint (); prepareMatrices (); solveForCorrection (); } // currentViewMatrix = createViewMatrix (position0, orientation0); debugDraw ("/tmp/draw.png", &position0, &orientation0); return; }
double PointSolver2::calcCurrentError () { // for (int lid=0; lid<model.size(); lid++) { Matrix4 currentViewMatrix = createViewMatrix (position0, orientation0); for (auto &line: model) { } }
void setupViewMatrix() { // switch to Model-View matrix glMatrixMode(GL_MODELVIEW); // save identity matrix glPushMatrix(); createViewMatrix(); }
void refreshViewMatrix() { // switch to Model-View matrix glMatrixMode(GL_MODELVIEW); // pop off the last view matrix from the stack and expose identity matrix glPopMatrix(); // push identity matrix down the stack, and leave a copy of it on top glPushMatrix(); createViewMatrix(); }
void PointSolver2::debugDraw (const char *imgname, Point3 *pos, Quaternion *orin) { cv::Mat image; // Matrix4 currentViewMatrix = createViewMatrix (position0, orientation0); Matrix4 cViewMatrix; if (pos==NULL) cViewMatrix = currentViewMatrix; else cViewMatrix = createViewMatrix (*pos, *orin); PointSolver2::projectModel (image, model, this->projectionMatrix, cViewMatrix); cv::imwrite (imgname, image); }
void PointSolver2::projectModel (cv::Mat &output, vector<ModelLine> &model, PointSolver2::Projector &projector, Point3 &cameraPosition, Point3 ¢erOfView, Vector3 &_up) { Matrix4 viewMatrix = createViewMatrix (cameraPosition, centerOfView, _up); return PointSolver2::projectModel (output, model, projector, viewMatrix); }
void PointSolver2::projectModel(cv::Mat &output, vector<ModelLine> &model, PointSolver2::Projector &projector, Point3 &cameraPosition, Quaternion &cameraOrientation) { Matrix4 viewMatrix = createViewMatrix (cameraPosition, cameraOrientation); return PointSolver2::projectModel (output, model, projector, viewMatrix); }
void OpenGLRenderer::render(GdvCanvas& canvas) { checkForErrors(); if (isBlack) { glClearColor(0.0, 0.0, 0.0, 1.0); } else { glClearColor(1.0, 1.0, 1.0, 1.0); } // Rechnet auf die Projektionsmatrix die Kameramatrix und die Transformation drauf zum Rotieren QMatrix4x4 mvpMatrix = createProjectionMatrix() * createViewMatrix(); // Mesh-Programm aktivieren glUseProgram(program_IDs[useMeshShader]); // Werte der Uniforms ändern glUniformMatrix4fv(mvpMatrix_ID, 1, false, mvpMatrix.data()); glUniform1i(oiCheckIntersection_ID, isObjectIntersection); glUniform3f(oiSource_ID, (quelleX - 200)/100.0, (quelleY - 200)/100.0, 0); glUniform3f(oiObject_ID, (objectX - 200)/100.0, (objectY - 200)/100.0, 0); checkForErrors(); if (isTransparency) { glUniform1f(discardRate_ID, (float) discardRate/100.0); // Fragment-Verwerfrate glBindVertexArray(0); // FBOs leeren glBindFramebuffer(GL_FRAMEBUFFER, fbo2); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glBindFramebuffer(GL_FRAMEBUFFER, fbo1); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glBindFramebuffer(GL_FRAMEBUFFER, fbo3); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); int doubleSteps = 2 * steps; for (int i = 0; i < doubleSteps; i++) { //Wechseln der FBOs/Texturen GLuint newFBO, usedFBOTexture; if (i % 2 == 1){ newFBO = fbo2; usedFBOTexture = colorTexture3; } else { newFBO = fbo3; usedFBOTexture = colorTexture2; } glUseProgram(program_IDs[useMeshShader]); float r; if (isFlimmern) r = (float) (std::rand() / (float) RAND_MAX); else r = i+1; glUniform1f(rand_ID, r); // FBO aktivieren glBindFramebuffer(GL_FRAMEBUFFER, fbo1); // Ausgabepuffer (Bildschirm/FBO) löschen glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glUniform1i(meshTexture_ID, 0); glActiveTexture(GL_TEXTURE0 + 0); glBindTexture(GL_TEXTURE_2D, texture_ID); // Zeichnen glBindVertexArray(VAO_mesh); glDrawArrays(GL_TRIANGLES, 0, vertexCount_mesh); glBindVertexArray(0); // Addieren glBindFramebuffer(GL_FRAMEBUFFER, newFBO); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glUseProgram(program_IDs[useAddShader]); // setze Shadervariablen glUniform1i(pingPongStep_ID, i + 1); // jetzt beide Texturen ansprechen glUniform1i(newFBO_ID, 0); // 0 -> erste Textureinheit glUniform1i(oldFBO_ID, 1); // 1 -> zweite Textureinheit glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, colorTexture1); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, usedFBOTexture); // Zeichnen glBindVertexArray(VAO_fbo); glDrawArrays(GL_TRIANGLES, 0, vertexCount_fbo); glBindVertexArray(0); checkForErrors(); } } else { checkForErrors(); // ohne Transparenz // in FBO rendern, damit ggfs. noch PostScreen-Effekte angewendet werden können glBindFramebuffer(GL_FRAMEBUFFER, fbo2); // Ausgabepuffer (Bildschirm/FBO) löschen glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glUseProgram(program_IDs[useMeshShader]); // Textur binden glUniform1i(meshTexture_ID, 0); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, texture_ID); // keine Fragments discarden glUniform1f(discardRate_ID, 0.0f); // Zeichnen glBindVertexArray(VAO_mesh); glDrawArrays(GL_TRIANGLES, 0, vertexCount_mesh); glBindVertexArray(0); checkForErrors(); } // PostScreen-Effekte hinzufügen if (isStarWars) { glBindFramebuffer(GL_FRAMEBUFFER, fbo1); // in FBO rendern } else { glBindFramebuffer(GL_FRAMEBUFFER, 0); // in Bildschirm rendern } glUseProgram(program_IDs[useFinalShader]); // Programm aktivieren // bools für finalShader setzen glUniform1i(sobel_ID, isSobel); glUniform1i(blue_ID, isBlue); glUniform1i(black_ID, isBlack); glUniform1f(height_ID, viewHeight); glUniform1f(width_ID, viewWidth); // Jetzt kann das FBO als Textur verwendet werden (Color−Attachment) glActiveTexture(GL_TEXTURE0 + 0); glBindTexture(GL_TEXTURE_2D, colorTexture2); if (isBlack) { glClearColor(0.0, 0.0, 0.0, 1.0); } else { glClearColor(1.0, 1.0, 1.0, 1.0); } // Ausgabepuffer (Bildschirm/FBO) löschen glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Zeichnen glBindVertexArray(VAO_fbo); glDrawArrays(GL_TRIANGLES, 0, vertexCount_fbo); glBindVertexArray(0); if (isStarWars) { glBindFramebuffer(GL_FRAMEBUFFER, 0); glUseProgram(program_IDs[useStarWarsShader]); glBindTexture(GL_TEXTURE_2D, colorTexture1); glUniform1f(swIntensity_ID, starwarsIntensity/100.0); glUniform1i(swThickness_ID, starwarsThickness); glUniform1i(swFrequency_ID, starwarsFrequency); glUniform1i(swViewWidth_ID, viewWidth); glUniform1i(swViewHeight_ID, viewHeight); float r = (float) (std::rand() / (float) RAND_MAX); if (!isStarWarsFlimmern) r = 0.5f; glUniform1f(swRandom_ID, truncf(r * 100.0) / 100.0); struct timeval tp; gettimeofday(&tp, NULL); long int ms = tp.tv_sec * 1000 + tp.tv_usec / 1000; glUniform1f(swTime_ID, ms); // Ausgabepuffer (Bildschirm/FBO) löschen glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Zeichnen glBindVertexArray(VAO_fbo); glDrawArrays(GL_TRIANGLES, 0, vertexCount_fbo); glBindVertexArray(0); } // Textur und Programm deaktivieren glBindTexture(GL_TEXTURE_2D, 0); glUseProgram(0); checkForErrors(); }
/** * @brief SelectTypeDialog::accept If user click Ok button, then test do what user want. * This method can create new dialog window, or create needed variable, if no information is needed. */ void SelectTypeDialog::accept() { QString selectedType = ui->comboBox->currentText(); if(selectedType == generateProjection) { GenerateProjectionMatrix dialog; dialog.exec(); if(dialog.result() == GenerateProjectionMatrix::Accepted) { setResult(true); type = PROJECTION; setVisible(false); } else { setResult(false); setVisible(false); } } else if(selectedType == generateView) { QMessageBox box; box.setText(tr("Do you want to create view matrix?")); box.setInformativeText(tr("Uniform variables '%1','%2','%3','%4' will override older variables with the same name.") .arg(viewName, rotXName, rotYName, zoomZName)); box.setIcon(QMessageBox::Question); box.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel); int ret = box.exec(); if(ret == QMessageBox::Ok) { type = VIEW; createViewMatrix(); setResult(true); setVisible(false); } else { setResult(false); setVisible(false); } } else if(selectedType.startsWith("Rotation") && selectedType.endsWith("buttons")) { SetNameWithButtonsDialog dialog; dialog.exec(); if(dialog.result() == SetNameWithButtonsDialog::Accepted) { //QString name = dialog.getVariableName(); //int buttonMinus = dialog.getButtonMinus(); //int buttonPlus = dialog.getButtonPlus(); //TODO complete this } } }