Как получить координаты экрана из 3D-точки? OPENGL - PullRequest
11 голосов
/ 25 сентября 2010

Я видел много экранных координат для мировых координатных постов, но не видел обратного. Существует ли простой способ получения координат экрана из 3d-точки, под любым углом, с которого я ее вижу? Я использую C ++ и opengl

Ответы [ 3 ]

21 голосов
/ 25 сентября 2010

ответ erjot неполный.

Есть еще две вещи, которые необходимо учитывать.

  1. с homogeneous = P . M . world, вектор homogeneous является 4-мерным вектором в однородном пространстве. В частности, чтобы вернуть его в куб [-1: 1] ^ 3, вам нужно разделить его первые 3 координаты на homogeneous.w. cube.x = homogeneous.x / homogeneous.w (что некоторые люди называют проекционным делением).
  2. Затем вам необходимо преобразовать куб [-1: 1] ^ 3 в координаты окна, применив к нему преобразование Viewport. window.x = viewport.x + viewport.width * (cube.x+1)/2

В случае, если вы заботитесь о конечном Z, преобразование не проходит через область просмотра, а вместо этого использует DepthRange.

6 голосов
/ 25 сентября 2010

Экранные координаты для вершины - это просто результат умножения такой вершины на ее проекцию и матрицу вида модели:

screen_coordinates = projection_matrix * modelview_matrix * world_coordinates

Вы можете сделать это вручную (особенно если выВы используете некоторую библиотеку математики для выполнения операций над матрицами) или используйте gluProject, например:

std::array<GLfloat, 16> projection;
std::array<GLfloat, 16> modelview;
std::array<GLfloat, 3>  screen_coords;

glGetFloatv(GL_PROJECTION_MATRIX, projection.data());
glGetFloatv(GL_MODELVIEW_MATRIX, modelview.data());

gluProject(world_coords[0], world_coords[1], world_coords[2],
    modelview.data(), projection.data(),
    screen_coords.data(), screen_coords.data() + 1, screen_coords.data() + 2);
2 голосов
/ 20 декабря 2013

Еще одна вещь.Помните, что gluProject дает координаты, где начало системы координат начинается в левом нижнем углу.Координаты экрана начинаются в левом верхнем углу.Для получения правильных значений экранных координат значение y необходимо вычесть из высоты устройства OpenGL.

Например, в Qt GLWidget нарисовать текст в (0,1,2) мировых координатах:

gluProject (0,1,2, modelMatrix, projMatrix, sc.x,sc.y, sc.z);renderText (sc.x, высота () - sc.y "(0,1,2)");

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...