Рендеринг 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, и еще больше циклов ЦП для его рендеринга