Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Перевод в мировые координаты

Перевод в мировые координаты

gibkinПользовательwww15 мая 201816:16#0
Здравствуйте, проблема такая: у меня есть координаты мыши: mousePos , есть матрица view - view, есть матрица перспективной проекции: pMatrix
Я перевожу координаты в мировые: нахожу обратную матрицу проекции и обратную матрицу view и умножаю на координаты мыши. Координаты начала z=4, координаты конца z=-100.
В первом случае у меня получились такие координаты: mouseDir1 =  (-0.1985  0.02887  4), а во втором такие: mouseDir2 =  (-0.1985  0.02887  -100). Почему координаты x,y одинаковые?
private Vector3f getCoord(MouseInput mouseInput,float z){
        int wdwWitdh = 640;
        int wdwHeight =640;

        Vector2d mousePos = mouseInput.getCurrentPos();
        float x = (float)(2 * mousePos.x) / (float)wdwWitdh - 1.0f;
        float y = 1.0f - (float)(2 * mousePos.y) / (float)wdwHeight;

        Matrix4f invProjectionMatrix = new Matrix4f();
        invProjectionMatrix.set(pMatrix);
        invProjectionMatrix.invert();
        Vector4f tmpVec = new Vector4f();
        tmpVec.set(x, y, z, 0);
        tmpVec.mul(invProjectionMatrix);
        tmpVec.z = z;
        tmpVec.w = 0.0f;

        Matrix4f viewMatrix = new Matrix4f().set(view);
        Matrix4f invViewMatrix = new Matrix4f();
        invViewMatrix.set(viewMatrix);
        invViewMatrix.invert();
        tmpVec.mul(invViewMatrix);
        Vector3f mouseDir1 = new Vector3f();
        mouseDir1.set(tmpVec.x, tmpVec.y, tmpVec.z);

        ///ТЕСТОВАЯ ПРОВЕРКА Z=-100;
        //конеч координаты луча
        Vector4f tmpVec1 = new Vector4f();
        tmpVec1.set(x, y, -100, 1.0f);
        tmpVec1.mul(invProjectionMatrix);
        tmpVec1.z =-100f;
        tmpVec1.w = 0.0f;
        tmpVec1.mul(invViewMatrix);
        Vector3f mouseDir2 = new Vector3f();
        mouseDir2.set(tmpVec1.x, tmpVec1.y, tmpVec1.z);
        System.out.println();
        return mouseDir1;
    }

Правка: 15 мая 2018 18:51

Great V.Постоялецwww15 мая 201816:25#1
gibkin
w
gibkinПользовательwww15 мая 201816:27#2
Great V.
?
Great V.Постоялецwww15 мая 201816:48#3
Great V.
При перспективной проекции надо делить на w.
Погугли.
gibkinПользовательwww15 мая 201816:55#4
Great V.
оно уже поделено. не нужно делить. Это lwjgl
не в этом дело

Правка: 15 мая 2018 16:56

gibkinПользовательwww15 мая 201819:01#5
AsaqПользовательwww6 июня 201814:27#6
z-коодината так же должна быть представлена в NDC при умножении на обратную проекционную матрицу.
Для OpenGL c правой СК для камеры и левой для NDC. Курсор проецируется на плоскость параллельную экрану на расстоянии R от камеры.
Формулы для z_ndc выводится -> http://www.songho.ca/opengl/gl_projectionmatrix.html
using namespace glm;

mat4 projection;
mat4 view;
float near, far;  // near и far камеры
float ze = -R;  // z-координата курсора в СК камеры

// координаты курсора в NDC
float x_ndc = 2.0f * cursorPos.x / screen_width - 1.0f;
float y_ndc = 1.0f - 2.0f * cursorPos.y / screen_height;
// для перспективной проекции
float z_ndc = (-ze * (far + near) / (far - near) - 2.0f * far * near / (far - near)) / (-ze);
// для ортогональной проекции
float z_ndc = (-2.0f * ze - (far + near)) / (far - near);
// если нужно направление то ze = -far и следовательно z_ndc = 1.0f

vec4 cur_ndc = {x_ndc, y_ndc, z_ndc, 1.0f};

// мировые координаты курсора
vec4 cur_ws = inverse(projection * view) * cur_ndc;
cur_ws /= cur_ws.w;

/ Форум / Программирование игр / Графика

2001—2018 © GameDev.ru — Разработка игр