Посмотрел статью, переписал под LWJGL. Что-то работает не корректно.
Матрица проекции
Код
////////////////////////////////////
camera.SetProjection(90, 0.1f, 8);
/////////////////////////////
public void SetProjection(float angle, float nearPlace, float farPlace)
{
float aspectRatio = (float)Display.getWidth() / (float)Display.getHeight();
float y_scale = (float)(1f / Math.tan(Math.toRadians(angle / 2f))) * aspectRatio;
float x_scale = y_scale / aspectRatio;
float frustum_length = farPlace - nearPlace;
Projection.m00 = x_scale;
Projection.m11 = y_scale;
Projection.m22 = -((farPlace + nearPlace) / frustum_length);
Projection.m23 = -1;
Projection.m32 = -((2 * nearPlace * farPlace) / frustum_length);
Projection.m33 = 0;
}
Матрица вида
Код
camera.rx = 90;
camera.y = 8;
camera.SetView();
////////////////////////////////////////
public void SetView()
{
View.setIdentity();
Matrix4f.rotate((float)Math.toRadians(rx), new Vector3f(1,0,0), View, View);
Matrix4f.rotate((float)Math.toRadians(ry), new Vector3f(0,1,0), View, View);
Matrix4f.rotate((float)Math.toRadians(rz), new Vector3f(0,0,1), View, View);
Matrix4f.translate(new Vector3f(-x,-y,z), View, View);
}
Код
public static Vector4f UnProject(Camera cam, Point2f pos)
{
Matrix4f VPinvert = new Matrix4f();
Vector4f Res = new Vector4f();
float winZ = 1;
float x = Main.Zoom;
Res.x =(2.0f*((float)(pos.x-0)/(Display.getWidth()-0)))-1.0f;
Res.y =1.0f-(2.0f*((float)(pos.y-0)/(Display.getHeight()-0)));
// Res.z = (float)(2.0 * winZ -1.0);
Res.z = 1;
Res.w = (float) 1.0;
Matrix4f.mul(cam.View, cam.Projection, VPinvert);
Matrix4f.invert(VPinvert, VPinvert);
Res.x = (Res.x * VPinvert.m00) + (Res.y * VPinvert.m10) + (Res.z * VPinvert.m20) + (Res.w * VPinvert.m30);
Res.y = (Res.x * VPinvert.m01) + (Res.y * VPinvert.m11) + (Res.z * VPinvert.m21) + (Res.w * VPinvert.m31);
Res.z = (Res.x * VPinvert.m02) + (Res.y * VPinvert.m12) + (Res.z * VPinvert.m22) + (Res.w * VPinvert.m32);
Res.w = (Res.x * VPinvert.m03) + (Res.y * VPinvert.m13) + (Res.z * VPinvert.m23) + (Res.w * VPinvert.m33);
Res.x /= Res.w;
Res.y /= Res.w;
Res.z /= Res.w;
return Res;
}
Нажима на точку с координатами (1,1), получаю значения (0.004219624;0.16776733;-0.033905927;29.493368)
В чём проблема ?