opengl "zoom": отсечение объекта и яркость - PullRequest
2 голосов
/ 07 декабря 2010

У меня есть простое приложение opengl, которое отображает произвольные 3D-модели. Я хотел бы реализовать масштабирование. то, что у меня сейчас, использует glScale и работает в некоторой степени. Тем не менее, у меня есть две проблемы.

  1. любой вид масштабирования (+) быстро достигает точки, где края объекта находятся в ближней плоскости отсечения. Прямо сейчас, мой zNear - что-то вроде 0.1, поэтому имеет смысл, что увеличение масштаба объекта вызовет отсечение. мне интересно, есть ли другие подходы для достижения лучшего эффекта.

  2. при увеличении объект становится тусклее. уменьшить масштаб и становится ярче. У меня есть положение света около 0, 0, 100. У меня очень простое освещение с позицией 0,0100 и используется только рассеянное освещение

    gl.glEnable(GL10.GL_LIGHTING);
    gl.glEnable(GL10.GL_LIGHT0);
    gl.glEnable(GL10.GL_COLOR_MATERIAL);
    
    
    float[] lights;
    
    
    lights = new float[] { 0f, 0f, 0f, 1f };
    gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_AMBIENT, lights, 0);
    lights = new float[] { 1f, 1f, 1f, 1f };
    gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_DIFFUSE, lights, 0);
    lights = new float[] { 0f, 0f, 0f, 1f };
    gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_SPECULAR, lights, 0);
    
    
    float matAmbient[] = { 0f, 0f, 0f, 1f };
    float matDiffuse[] = { 1f, 1f, 1f, 1f };
    float matSpecular[] = { 0f, 0f, 0f, 1f };
    gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_AMBIENT, matAmbient, 0);
    gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_DIFFUSE, matDiffuse, 0);
    gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SPECULAR, matSpecular, 0);
    
    
    float lightPosition[] = { mesh.mid.vertex[X], mesh.mid.vertex[Y], 100f,
            1f };
    gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_POSITION, lightPosition, 0);
    

У меня нет настроек ослабления, которые, по моему мнению, должны быть включены, чтобы на свет влияло расстояние. независимо от того, я не изменяю расстояние объекта, просто масштабирую его. уверен, что положение лица меняется, но не значительно. в любом случае, я подумал, что увеличение масштаба изображения сделает его ярче, а не тусклее.

это происходит при использовании opengl-es 1.0 на платформе Android, если это уместно.

любая помощь приветствуется.

Ответы [ 2 ]

1 голос
/ 07 декабря 2010

частичный ответ на вопрос # 2 заключается в том, что я не масштабировал свои нормали. другими словами, ранее нормализованные нормальные значения имеют большую (относительную) величину, когда объект масштабируется меньше, в результате чего грани отражают больше света ... и наоборот.

Вы можете установить параметр,

glEnable(GL_NORMALIZE)

и это решает проблему за счет некоторых дополнительных вычислений. полная история здесь, http://www.opengl.org/resources/features/KilgardTechniques/oglpitfall/

(см. № 16).

1 голос
/ 07 декабря 2010

Масштабирование изменит способ освещения вашего объекта, так как нормаль также масштабируется (что, как вы указали в своем собственном ответе, может быть вызвано вызовом glEnable(GL_NORMALIZE)). Обратите внимание, что в зависимости от того, когда они указаны, сами источники света могут не иметь эквивалентного преобразования: http://www.opengl.org/resources/faq/technical/lights.htm

Положение источника света преобразуется текущей матрицей ModelView в тот момент, когда положение указывается с помощью вызова glLight * ().

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

Если вы в буквальном смысле хотите увеличить изображение так, как это делает зум-объектив на камере, вы можете изменить параметр поля зрения, передаваемый на gluPerspective. Это будет означать, что вы получаете эффект плоской или преувеличенной перспективы, как и в случае с реальной камерой.

Что обычно требуется в типичных приложениях, это изменить положение камеры относительно объекта. Самый простой способ сделать это с помощью gluLookAt.

Остерегайтесь разницы между матрицами проекции и просмотра модели; изменение перспективы должно быть сделано для проекции, в то время как расположение камеры должно влиять на вид модели. См http://www.sjbaker.org/steve/omniv/projection_abuse.html

nb ... Я только что понял, что используемые вами OpenGL могут не поддерживать эти точные функции; Вы должны быть в состоянии найти, как достичь тех же результатов довольно легко.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...