В общем, вы должны использовать Matrix4f.unproject
, так как @httpdigest продемонстрировал в своем ответе.
Поэтому я хочу сосредоточиться на фоне:
Почему координаты x, y одинаковы?
Координаты одинаковы, потому что координаты x
и y
источника одинаковы, и вы не делите перспективное деление послеумножение на матрицу обратной проекции.Операция mul
не выполняет деления перспективы, она преобразует Vector4f
на Matrix4f
, и в результате получается также тип Vector4f
.
Далее, исходные координаты, которые вы умножаете наМатрица обратной проекции должна быть нормализована координатами устройства, где x
, y
и z
находятся в диапазоне [-1.0, 1.0].z=-1.0
- минимальная глубина (ближняя плоскость), а z=1.0
- максимальная глубина (дальняя плоскость).
Примечание: проекция линии визирования (луча обзора) на область просмотра, конечно, является точкой.
Когда вы выполняете умножение на (обратную) матрицу проекции, то результатом будет не декартовых координат , а однородных координат .Вам необходимо выполнить Перспективное деление для преобразования из однородных координат в декартовы:
// transform x and y mouse coordinate to normalized device space
Vector2d mousePos = mouseInput.getCurrentPos();
float x = (float)(2 * mousePos.x) / (float)wdwWitdh - 1.0f;
float y = 1.0f - (float)(2 * mousePos.y) / (float)wdwHeight;
....
// normalized device coordinate to view space coordinate (near plane)
Vector4f tmpVec = new Vector4f();
tmpVec.set(x, y, -1.0f, 1.0f);
tmpVec.mul(invProjectionMatrix);
// perspective divide
tmpVec.x = tmpVec.x / tmpVec.w;
tmpVec.y = tmpVec.y / tmpVec.w;
tmpVec.z = tmpVec.z / tmpVec.w;
tmpVec.w = 1.0;
// normalized device coordinate to view space coordinate (far plane)
Vector4f tmpVec1 = new Vector4f();
tmpVec1.set(x, y, 1.0f, 1.0f);
tmpVec1.mul(invProjectionMatrix);
// perspective divide
tmpVec1.x = tmpVec1.x / tmpVec1.w;
tmpVec1.y = tmpVec1.y / tmpVec1.w;
tmpVec1.z = tmpVec1.z / tmpVec1.w;
tmpVec1.w = 1.0;
Матрица проекции описывает отображение от 3D точек сцены к 2D точкам области просмотра.Матрица проекции преобразуется из пространства просмотра в пространство клипа.Координаты в пространстве клипа преобразуются в нормализованные координаты устройства (NDC) в диапазоне (-1, -1, -1) в (1, 1, 1) путем деления на w
компонент координат клипа.
В перспективной проекции матрица проекции описывает отображение из трехмерных точек мира, как они видны с камеры-обскуры, в двумерные точки области просмотра.Координаты пространства глаза в усечении камеры (усеченная пирамида) отображаются в куб (нормализованные координаты устройства).
Из-за этого координаты x
и y
в окне просмотра зависят от глубины (координата пространства z
).