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

	}
}
Пример #3
0
	void setupViewMatrix()
	{
		// switch to Model-View matrix
		glMatrixMode(GL_MODELVIEW);
		// save identity matrix
		glPushMatrix();

		createViewMatrix();
	}
Пример #4
0
	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 &centerOfView, 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);
}
Пример #8
0
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();
}
Пример #9
0
/**
 * @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
        }
    }
}