RayCasting не учитывает повороты камеры - PullRequest
0 голосов
/ 01 марта 2019

Я работаю с LWJGL и openGL и пытаюсь реализовать RayCasting для преобразования позиции курсора в трехмерную точку.

Я пробовал много способов (встроенных и полностью ручных), но результат всегдато же самое: GIF задачи

Стена в GIF имеет плоскость ax = 0, y = 0, z = 1, и я использую двоичный поиск, чтобы найти пересечение и переместить кубв положение курсора.

Вот некоторый соответствующий код:

private static Vector3f mouseRay = new Vector3f();

protected static GLFWCursorPosCallback cursorPosCallback = new GLFWCursorPosCallback() {
        @Override
        public void invoke(long window, double xpos, double ypos) {
            cursorPosX = xpos;
            cursorPosY = ypos;

            Vector3f origin = new Vector3f();
            int[] viewport = new int[4];
            viewport[2] = Game.window.getWidth();
            viewport[3] = Game.window.getHeight();

            MasterRenderer.getProjectionMatrix()
                    .unprojectRay((float) xpos, (float) (Game.window.getHeight() - ypos), viewport, origin, mouseRay);

            mouseRay.normalize();
//wallIntersection = binarySearch(Game.activeCamera.getPosition(), 0, 0, RAYCASTING_RAY_RANGE, mouseRay);

            float distance = Intersectionf.intersectRayPlane(Game.camera.getPosition(), mouseRay, new Vector3f(0,0,0), new Vector3f(0,0,1), 1e-5f);
            wallIntersection = getPointOnRay(Game.camera.getPosition(), mouseRay, distance);

public static Vector3f getPointOnRay(Vector3f origin, Vector3f ray, float distance) {
        Vector3f camPos = origin;
        Vector3f start = new Vector3f(camPos.x, camPos.y, camPos.z);
        Vector3f scaledRay = new Vector3f(ray.x * distance, ray.y * distance, ray.z * distance);
        return start.add(scaledRay);
    }

Обновление луча выполняется в режиме обратного вызова мыши.Я попробовал это и за пределами обратного вызова, но обратный вызов звучит более эффективно.

И матрица проецирования от средства визуализации

 private void createProjectionMatrix() {
        float aspectRatio = (float) Game.window.getWidth() / (float) Game.window.getHeight();
        float y_scale = (float) ((1f / Math.tan(Math.toRadians(FOV / 2f))) * aspectRatio);
        float x_scale = y_scale / aspectRatio;
        float frustum_length = FAR_PLANE - NEAR_PLANE;

        projectionMatrix = new Matrix4f();
        projectionMatrix._m00(x_scale);
        projectionMatrix._m11(y_scale);
        projectionMatrix._m22( -((FAR_PLANE + NEAR_PLANE) / frustum_length) );
        projectionMatrix._m23( -1 );
        projectionMatrix._m32( -((2 * NEAR_PLANE * FAR_PLANE) / frustum_length) );
        projectionMatrix._m33( 0 );
    }

Мне кажется, что мне нужно повернуть с помощью viewMatrix:

Matrix4f matrix = new Matrix4f()
                .rotateX((float) Math.toRadians(camera.getPitch()))
                .rotateY((float) Math.toRadians(camera.getYaw()))
                .rotateZ((float) Math.toRadians(camera.getRoll()))
                .translate(new Vector3f(-camera.getPosition().x, -camera.getPosition().y, -camera.getPosition().z));

Но я просто не могу заставить его работать.Буду очень признателен за любую помощь!

...