OpenGL: рисование объектов (фиксированный размер, безразлично для увеличения и относительного положения) на карте - PullRequest
2 голосов
/ 22 ноября 2010

Я работаю над приложением Java OpenGL, описанным ниже.

Приложение показывает большую 2D текстуру карты мира. Некоторая информация должна быть представлена ​​в виде заголовков на карте (например, заголовок рядом с Испанией, который показывает ее население). Подписи - это объекты GL, состоящие из полигонов и текста. Пользователь должен иметь возможность перемещаться по карте (влево, вправо, вверх и вниз), а также увеличивать (+) и уменьшать (-). Когда пользователь выполняет эти операции, карта должна перемещаться или изменять ее размер, а подписи должны перемещаться вместе с картой, но при этом они должны быть одинакового размера.

Я делаю вид 2D с помощью glOrtho, движение с помощью glTranslate и масштабирование с помощью glScale. Сначала при масштабировании заголовки изменялись вместе с картой, поэтому заголовки становились слишком большими или слишком маленькими. Чтобы это исправить, я выставил рекламные щиты надписями [1]. С рекламным щитом заголовки не меняются, но не сохраняют свое относительное положение на карте при увеличении и уменьшении (мне нужно, чтобы заголовок Испании оставался всегда рядом с Испанией).

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

Есть ли способ сделать то, что мне нужно сделать?

[1] http://www.lighthouse3d.com/opengl/billboarding/index.php3?billCheat

Ответы [ 3 ]

0 голосов
/ 23 февраля 2012

Я искал что-то похожее на ваш вопрос, мне нужно было нарисовать пунктирную окружность, которая могла бы оставаться неподвижной на экране независимо от поворота / просмотра / масштабирования

После некоторых попыток мне удалось заставить его работать, возможно, это не могло быть лучшим с точки зрения производительности, но если вы не рендерили ничего тяжелого для современных графических процессоров, это не должно быть проблемой:

dispay()..

//  set modelview Matrix
    gl.glMatrixMode(GL2.GL_MODELVIEW);
        gl.glLoadIdentity();
        glu.gluLookAt(0, 0, 2, 0, 0, 0, 0, -1, 0);

    gl.glMatrixMode(GL2.GL_PROJECTION);
        gl.glLoadIdentity();
        gl.glOrtho(-1.2, 1.2, -1.1, 1.1, 0, 100);
        renderDashedCircle(gl);
        if(activatePerspectiveView) {
            gl.glLoadIdentity();
            aspect = gLAutoDrawable.getWidth()/gLAutoDrawable.getHeight();
            glu.gluPerspective(60, aspect, 1, 100);

Критический рендер находится в "renderDashedCircle (gl);"

Не волнует орто / перспектива, это то, что принадлежит моей программе (в основном она может переключаться между ними)

0 голосов
/ 11 апреля 2013

У меня была похожая проблема

Закончилось ответом на мой собственный вопрос;)
Мой подход использует геометрический шейдер (таким образом, opengl 3 - минимум). Создает квад из точки; Квадрат отображается в перспективной проекции, а не в орто. Это позволяет легко тестировать глубину (на самом деле я даже не делаю ЛЮБОЙ расчет глубины - все они автоматические). Позже я немного изменил шейдер, чтобы квадр оставался постоянным независимо от масштаба. Я хочу, чтобы вы сначала проверили, возможно ли это решение для вас, а затем я обновлю свой ответ и опубликую код шейдера и объясню его.

0 голосов
/ 23 ноября 2010

Я думаю, точечные спрайты будут вам здесь полезны. Точечный спрайт - это текстурированная точка, которую вы можете визуализировать в трехмерном пространстве непосредственно с вашей картой. Текстура точки просто визуализируется как «плоская», а не деформированная, как вы нарисовали ее на четырехугольнике. Вы даже можете определить функцию масштабирования, чтобы «рекламный щит» изменялся в зависимости от расстояния.

...