Размещение камеры для Kinect с использованием Nuitrack - PullRequest
0 голосов
/ 19 апреля 2019

У меня есть координаты пространства экрана от Kinect. Мне нужно получить координаты космического мира от kinect для моей камеры opengl; или мне нужно поместить камеру в то же положение, что и Kinect, чтобы я мог видеть точки, которые я получаю от Kinect. Я думаю, что мне понадобятся координаты мира с.р.т. моя камера opengl для обнаружения столкновений с другими объектами, которые я рисую. Как я могу получить это ScreenspaceToWorld Mapping?

Я использую этот ответ в качестве справочного, но у меня нет положения и ориентации Kinect для вычисления матрицы вида и проекции.

Редактировать :

Kinect FOV

Мне нужно уметь отображать объекты в том же координатном пространстве, что и в Kinect. Для этого я использую матрицу проекции, используя следующие значения:

Рядом с плоскостью : 0,01f
Дальний самолет : 1700.0f
Горизонтальное поле зрения : 60,0f
Вертикальное поле зрения : 45,0f
Положение камеры : (0.0f, 2.0f, 3.0f)
Направление камеры : (0,0f, 2,0f, -3,0f)

Используя эти значения, я не могу увидеть ни одного визуализированного объекта. Вот мой код рендеринга:

GameRenderer::GameRenderer()
{
    tracker = new GestureTracker();
    tracker->init();
    tracker->startGestureDetection();
}

bool GameRenderer::Init(int argc, char* argv[])
{        
    GLfloat points[] = { 0.0f, 0.5f, 0.0f, 0.5f, -0.5f, 0.0f, -0.5f, -0.5f, 0.0f };
    GLfloat point[] = { 0.0f, 0.0f, 0.0f };
    glGenBuffers(1, &m_vbo);
    glBindBuffer(GL_ARRAY_BUFFER, m_vbo);

    glBufferData(GL_ARRAY_BUFFER, sizeof(points), points, GL_DYNAMIC_DRAW);
    // vao
    glGenVertexArrays(1, &m_vao);
    glBindVertexArray(m_vao);
    glEnableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);


    const char *vertex_shader = "#version 410\n"
                                "in vec3 vp;"
                                "uniform mat4 model_matrix;"
                                "uniform mat4 view_matrix;"
                                "uniform mat4 projection_matrix;"
                                "void main () {"
                                "  gl_Position = projection_matrix * view_matrix * model_matrix * vec4(vp, 1.0);"
                                "}";

    const char *fragment_shader = "#version 410\n"
                                  "out vec4 frag_colour;"
                                  "void main () {"
                                  "  frag_colour = vec4(0.0f, 0.5f, 1.0f, 1.0f);"
                                  "}";

    m_vert_shader = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(m_vert_shader, 1, &vertex_shader, NULL);
    glCompileShader(m_vert_shader);
    int params = -1;
    glGetShaderiv( m_vert_shader, GL_COMPILE_STATUS, &params );
    if ( GL_TRUE != params ) {
        ShaderLog(m_vert_shader);
        return 1;
    }
    m_frag_shader = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(m_frag_shader, 1, &fragment_shader, NULL);
    glCompileShader(m_frag_shader);
    params = -1;
    glGetShaderiv( m_frag_shader, GL_COMPILE_STATUS, &params );
    if ( GL_TRUE != params ) {
        ShaderLog(m_frag_shader);
        return 1;
    }
    m_shader_program = glCreateProgram();
    glAttachShader(m_shader_program, m_frag_shader);
    glAttachShader(m_shader_program, m_vert_shader);
    glLinkProgram(m_shader_program);

    this->m_model_matrix = glm::mat4(1.0f);
    m_model_matrix = glm::scale(m_model_matrix, glm::vec3(4.0f));
    // m_model_matrix = glm::rotate(m_model_matrix, glm::radians(10.0f), glm::vec3(0.0f));
    m_model_matrix = glm::translate(m_model_matrix, glm::vec3(0.0f));
    this->m_view_matrix = glm::mat4(1.0f);
    this->m_proj_matrix = glm::mat4(1.0f);

    GLuint model_mat_location = glGetUniformLocation(this->m_shader_program, "model_matrix");
    glUseProgram(this->m_shader_program);
    glUniformMatrix4fv(model_mat_location, 1, GL_FALSE, glm::value_ptr(this->m_model_matrix));
    return 1;
}

void GameRenderer::Draw(Camera& camera)
{
    auto hands = tracker->getHands();

    if(hands.size()) {
        Point3f coordinates = hands[0].getHandPosition();
        glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
        GLfloat hand_coordinate[3] = { coordinates.x, coordinates.y, coordinates.z };
        std::cout << coordinates.x << " " << coordinates.y << " " << coordinates.z << std::endl;
        // glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * 3, hand_coordinate, GL_DYNAMIC_DRAW);
        this->m_model_matrix = glm::mat4(1.0f);
        m_model_matrix = glm::scale(m_model_matrix, glm::vec3(10.0f));
        m_model_matrix = glm::translate(m_model_matrix, glm::vec3(coordinates.x, coordinates.y, coordinates.z));
        glUseProgram(this->m_shader_program);
        GLuint loc = glGetUniformLocation(this->m_shader_program, "model_matrix");
        glUniformMatrix4fv(loc, 1, GL_FALSE, glm::value_ptr(this->m_model_matrix));
        glUseProgram(0);
    }
    this->m_view_matrix = camera.GetViewMatrix();
    this->m_proj_matrix = glm::perspective(glm::radians(camera.GetFieldOfView()),
                                           60.0f/45.0f, camera.GetNearPlane(), camera.GetFarPlane());


    GLuint view_mat_location = glGetUniformLocation(this->m_shader_program, "view_matrix");
    glUseProgram(this->m_shader_program);
    glUniformMatrix4fv(view_mat_location, 1, GL_FALSE, glm::value_ptr(this->m_view_matrix));

    GLuint proj_mat_location = glGetUniformLocation(this->m_shader_program, "projection_matrix");
    glUseProgram(this->m_shader_program);
    glUniformMatrix4fv(proj_mat_location, 1, GL_FALSE, glm::value_ptr(this->m_proj_matrix));

    CheckGLError();
    glUseProgram(m_shader_program);
    glBindVertexArray(m_vao);
    glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
    // glPointSize(50.0f);
    glDrawArrays(GL_TRIANGLES, 0, 3);
    glUseProgram(0);
    CheckGLError();
}

Значения координат из рамки глубины Kinect (это координаты рук, отслеживаемые Kinect):

x y z
-75.1628 136.374 650.176
-73.7582 141.239 665.259
-69.9152 148.691 702.163
-67.1218 151.315 723.226
-64.4887 153.013 745.074
-62.3365 153.783 767.393
-62.3365 153.783 767.393
-60.1887 152.979 789.881
-57.9948 150.762 812.395
-55.8624 146.575 834.187
-56.2673 133.543 873.035

Когда Kinect обнаруживает руки, моя геометрия (треугольник прямо сейчас) перестает рендериться, хотя она рендерится раньше (так как это будет в начале координат).

Что необходимо исправить в моей матрице вида / проекции или в коде, чтобы можно было визуализировать в том же пространстве, что и Kinect?

...