Как я могу нарисовать проекционную линию от камеры до 3D-области? - PullRequest
0 голосов
/ 28 февраля 2020

Мне нужна строка, которая будет частью пользовательского интерфейса, но она всегда указывает на конкретное c место в трехмерном пространстве.

Для этого я пытаюсь:

            double camY, camX;
            camX = cameraX * -1;
            if(camX > 90)
                camX = 180 - camX;
            if(camX < -90)
                camX = -180 - camX;

            camY = cameraY;
            double camY2 = camY;
            if(camY > 90)
                camY2 = 180 - camY;
            if(camY < -90)
                camY2 = -180 - camY;

            double x1;
            double y1;
            double x2 = x * (90.0 - Math.abs(camY)) / 90.0,
            y2 = (y * (90.0 - Math.abs(camY)) / 90.0);
            if(vertical) {
                x1 = x2 + (y * (camY2 / 90.0) * ((90 - camX) / 90));
                y1 = (y2 * ((90 - camX) / 90)) - (x * (camY2 / 90.0));
            }else{
                x1 =  x2 + (y * (camY2 / 90.0));
                y1 = y2 - (x * (camY2 / 90.0));
                y1 = y1 * (camX / 90.0);
            }
            GL11.glVertex2d(x1, y1);
            GL11.glVertex2d(toX, toY);
            GL11.glVertex2d(toX, toY);
            GL11.glVertex2d(max, toY);

Где x и y - координата точки в трехмерном пространстве. cameraX и cameraY - угол поворота камеры. toX`` and toY``` точка назначения на плоскости камеры (пользовательский интерфейс).

Весь этот код выполняется перед камерой (

        GL11.glOrtho(-max, max, -1, 1, 10, -10);
        glRotatef(cameraX, 1f, 0f, 0);
        glRotatef(cameraY, 0f, 1f, 0); 

) и перед GL11.glMatrixMode(GL11.GL_MODELVIEW);. Поэтому он игнорирует координату Z.

Изначально у меня были только последние 4 строки кода, но затем, когда камера поворачивалась, вся линия перемещалась за ней. Поэтому я добавил остальные вычисления.

Это частично решает мою проблему.

Исходная позиция:

enter image description here

Поворот камеры по оси y:

enter image description here

Небольшие отклонения линий уже видны.

Поворот камеры по осям x и y :

enter image description here

Как видно на скриншотах, красная линия все еще смещается при вращении камеры. Как я могу сделать так, чтобы он всегда был в нужной точке в пространстве? (В центре красный кружок на скриншотах)

1 Ответ

1 голос
/ 29 февраля 2020

Вы должны:

  1. Спроецировать 3D точку, которую вы хотите, чтобы линия заканчивалась на экране вручную. Для этого

    • Получите матрицы вида модели и проекции с glGetFloatv, GL_MODELVIEW_MATRIX и GL_PROJECTION_MATRIX.
    • Умножьте свою трехмерную точку на матрицы, выполните деление перспективы и преобразуйте в ваши координаты области просмотра.
  2. Нарисуйте 2-мерную линию от местоположения пользовательского интерфейса, в котором вы хотите, чтобы оно началось, до проецируемого 2-мерного местоположения, которое вы хотите, чтобы оно закончило.

...