Не проецируя положение 2d экрана в трехмерное пространство - PullRequest
2 голосов
/ 08 января 2012

Я использую библиотеку glm maths для решения следующей задачи: преобразование 2-мерной позиции экрана в трехмерное мировое пространство.

В попытке отследить проблему я упростил код до следующего:

    float screenW = 800.0f;
    float screenH = 600.0f;
    glm::vec4 viewport = glm::vec4(0.0f, 0.0f, screenW, screenH);
    glm::mat4 tmpView(1.0f);
    glm::mat4 tmpProj = glm::perspective( 90.0f, screenW/screenH, 0.1f, 100000.0f);
    glm::vec3 screenPos = glm::vec3(0.0f, 0.0f, 1.0f);
    glm::vec3 worldPos = glm::unProject(screenPos, tmpView, tmpProj, viewport);

Теперь с glm :: unProject в этом случае я бы ожидал, что worldPos будет (0, 0, 1).Однако это происходит как (127100.12, -95325.094, -95325.094).

Не понимаю ли я, что должен делать glm :: unProject?Я проследил через функцию, и она, кажется, работает нормально.

1 Ответ

3 голосов
/ 09 января 2012

Компонент Z в screenPos соответствует значениям в буфере глубины.Таким образом, 0.0f - это ближняя плоскость обрезки, а 1.0f - дальняя плоскость обрезки.

Если вы хотите найти позицию мира, находящуюся на расстоянии одной единицы от экрана, вы можете изменить масштаб вектора:

worldPos = worldPos / (worldPos.z * -1.f);

Также обратите внимание, что screenPos из 0,0 обозначает левый нижний угол экрана, тогда как в worldPos 0,0 это центр экрана.Таким образом, 0,0,1 должно дать вам -1,3333, -1, -1 и 400,300,1 должно дать вам 0,0, -1.

...