2014-11-22 3 views
0

Я читаю и загружаю файлы .obj, я хочу иметь 4 разных порта представления с разными перспективами, моя основная проблема заключается в том, чтобы сохранить исходный аспектный рацион объекта и предотвратить его от изменения с изменением размера окна или преобразований, таких как вращение.OPENGL - Поддерживать исходное соотношение сторон объекта

Это то, что я пытаюсь получить: enter image description here

Это то, что я получаю (в полноэкранном режиме): enter image description here

Часть моего кода дисплея:

GL2 gl = drawable.getGL().getGL3bc(); 
     gl.glEnable(GL_DEPTH_TEST); 
     gl.glDepthFunc(GL_LEQUAL); 
     gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
     gl.glOrtho(xMin - (0.1 * (xMax - xMin)), xMax 
       + (0.1 * (xMax - xMin)), yMin - (0.1 * (yMax - yMin)), yMax 
       + (0.1 * (yMax - yMin)), zMin - (0.1 * (zMax - zMin)), zMax 
       + (0.1 * (zMax - zMin))); 
     gl.glMatrixMode(GL_PROJECTION); 
     gl.glViewport(0, 0, width/2, height/2); 
     gl.glLoadIdentity(); 
     gl.glPushMatrix(); 
     gl.glRotatef(-90f, 1f, 0f, 0f); 
     draw(gl); 
     gl.glPopMatrix(); 
     gl.glViewport(width/2, height/2, width/2, height/2); 
     gl.glLoadIdentity(); 
     gl.glPushMatrix(); 
     gl.glRotated(-90, 0, 1, 0); 
     draw(gl); 
     gl.glPopMatrix(); 
     gl.glViewport(0, height/2, width/2, height/2); 
     gl.glLoadIdentity(); 
     gl.glPushMatrix(); 
     draw(gl); 
     gl.glPopMatrix(); 

xMax, yMin - максимальное и минимальное значения оси x в точках, заданных в файле .obj. Высота и ширина - это текущие размеры окна.

+0

Этот код зависит от переменных, которые вы не указали. Это звучит как простая ошибка в параметрах ортогонального представления относительно одной из осей. –

+0

xMax, yMin - максимальное и минимальное значения оси x в точках, заданных в файле .obj. Высота и ширина - это текущие размеры окна. – MMrj

ответ

1

xMax, yMin - максимальное и минимальное значения оси x в точках, заданных в файле .obj. высота и ширина - текущие размеры окна.

Ну, это, скорее всего, ваша проблема. Установив ортогональный вид, который опирается на минимальные и максимальные значения каждой координаты, вы фактически будете искажать объект, потому что такая область не имеет того же соотношения сторон, что и окно. Чтобы сделать его более ясным, если вы должны положить всю модель внутри коробки и сфотографировать ее, приложение будет растягивать ее так, чтобы координаты Y и X (при условии, что Y в качестве оси вверх) составляют часть всего видовой экран. Это будет означать увеличение ширины «картины» или сжатие высоты.

Таким образом, вы должны настроить эти параметры для устранения искажений. Поскольку модель высока (больше по Y, чем X), я предлагаю применить этот трюк, прежде чем устанавливать ортогональный вид:

xMin = xMin * width/height; 
xMax = xMax * width/height; 
+0

Что относительно yMin и yMax, zMin и zMax? – MMrj

+0

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

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