Рендеринг 3D-модели с одинаковым размером независимо от положения камеры

У меня есть конкретная модель, которая действует как средства управления в средстве просмотра. Пользователь может щелкнуть по его различным частям, чтобы выполнить преобразования в другой модели в средстве просмотра (например, элементы управления / дескрипторы в приложениях, таких как Unity или Blender).

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

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

2 ответа

С фиксированным конвейером самый простой способ сделать это - просто не применять никаких преобразований при рендеринге элементов управления:

glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();

glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();

// draw controls

glPopMatrix();

glMatrixMode(GL_MODELVIEW);
glPopMatrix();

glPushMatrix()/glPopMatrix() Вызовы будут убедиться, что предыдущие матрицы будут восстановлены в конце этого фрагмента кода.

Без преобразования вообще диапазон координат, сопоставленных с окном, будет [-1.0 .. 1.0] в обоих направлениях координат. Если вам нужно что-то еще, вы можете применить необходимые преобразования, прежде чем начать рисовать элементы управления.

Простой ответ - "используйте программируемый конвейер", потому что это не так сложно написать

if(normalObject) {
    gl_Position = projection * view * model * vertex;
} else {
    gl_Position = specialMVPMatrix * vertex;
}

Принимая во внимание, что вы потратите гораздо больше кода, пытаясь заставить его работать в Fixed-Function-Pipeline, и еще больше циклов ЦП для его рендеринга

Другие вопросы по тегам