2015-08-21 4 views
1

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

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

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

+0

Я не совсем уверен, в чем проблема. Предполагаю, вы знаете разницу между перспективой и орфографической проекцией? Похоже, все, что вам нужно, это последнее. –

ответ

-1

Простой ответ «использовать программируемый конвейер», потому что это не так трудно писать

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

В то время как вы будете тратить гораздо больше кода пытается получить эту работу в Fixed-Function-Pipeline и еще много процессорных циклов.

+0

Я не понимаю, почему это связано с фиксированной функцией и программируемым конвейером. В обоих случаях для рендеринга используется только другая матрица, что делает условие в вашем шейдере совершенно бессмысленным. Вместо изменения 'normalObject', матрицу можно было бы изменить напрямую. – derhass

+0

Существует миллион способов программирования. Мой код был всего лишь примером. Важная часть заключается в том, что если они придерживаются FFP, становится все труднее настраивать способы визуализации элементов управления. – Xirema

+0

Ну, я не спорю с шейдерами (и я не тот, кто это сделал). Но в этом конкретном случае я не вижу существенной разницы для шейдеров и фиксированного конвейера. Это примерно то, что матрица используется для рендеринга. – derhass

0

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

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

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

// draw controls 

glPopMatrix(); 

glMatrixMode(GL_MODELVIEW); 
glPopMatrix(); 

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

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

Смежные вопросы