2014-02-03 4 views
1

Я рендеринг 2D-плоской поверхности в кафельную OpenGL (Android), Я настройка окна просмотра с помощью следующего:OpenGL - Рендер одинакового размера, независимо от размера экрана/соотношения

float ratio = (float) width/height; 
gl.glMatrixMode(GL10.GL_PROJECTION); 
gl.glLoadIdentity(); 
gl.glFrustumf(-ratio, ratio, -1, 1, 1, MIN_ZOOM + 1.0f); 

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

Это мое понимание того, что усеченный является правильным, поскольку экстентов должны быть -ratio - отношение и 1 - 1.

Является ли это правильно? Если да, следует ли использовать масштаб или преобразование, чтобы сделать плитки и другие элементы рендерингом с одинаковым физическим размером независимо от ориентации?

ответ

1

Просто, например, скажем, ваш экран 1200 х 800. В ландшафтном режиме вы будете иметь:

ratio = 1.5 
frustrum (left, right, bottom, top) = -1.5, 1.5, -1, 1 

Так что ваш усеченного 3 единицы в ширину, 2 единицы высокой. В портрете:

ratio = 0.667 
frustrum (left, right, bottom, top) = -0.667, 0.667, -1, 1 

... сейчас 1,333 единицы в ширину и 2 единицы в высоту. Таким образом, хотя frustrum имеет одинаковое соотношение между самой короткой стороной и самой длинной стороной, он меньше по масштабу в портрете, поэтому рендеринг становится все ближе и больше. То, что вы хотите для портрета:

frustrum = -1, 1, -1.5, 1.5 

... так что, как и для пейзажа, короткий размер экрана будет 2 единицы и самый длинный 3. Проверьте, если отношение больше 1 (для определения ориентации) и устанавливают фруст соответственно:

if (ratio >= 1.0f) 
    gl.glFrustumf(-ratio, ratio, -1, 1, 1, MIN_ZOOM + 1.0f); //Landscape 
else 
    gl.glFrustumf(-1, 1, -1/ratio, 1/ratio, 1, MIN_ZOOM + 1.0f); //Portrait 
+0

Отлично! Спасибо! Это закончилось днем ​​огромных разочарований! – JWood

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