Искажения при вращении в Ortho в OpenGL

Тема в разделе "WASM.OpenGL", создана пользователем Xerx, 4 авг 2006.

  1. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    При вращении прямоугольника (НЕ КВАДРАТА!) из-за aspect ratio наложенная текстура искажается. Подскажите как избавиться от этого эффекта?
    Нельзя менять Viewport и подгонять параметры Ortho, именно изменить aspect ratio или размеры прямоугольника.
    Буду рад любому совету!

    В аттаче PNG-картинка с этим искажением (2.5Кб): круг ДОЛЖЕН остаться кругом. С ней сразу понятно.
     
  2. NaZGuL

    NaZGuL New Member

    Публикаций:
    0
    Регистрация:
    28 апр 2004
    Сообщения:
    41
    Адрес:
    Russia
    Я может чего не понимаю, но помоему ошибка в том, что ты вращаешь прямоугольник не в плоскости экрана. Т.е. тебе нужно выбрать правильную ось вращения.
    PS: Если ты используешь настройки проекции по умолчанию, то нужно вращать, так glRotatef,[theta],0.0,0.0,1.0
     
  3. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    вопрос не понятен. Ты хочешь посмотреть на круг под углом, и увидеть круг?
     
  4. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    NaZGuL> В плоскости: "glRotatef(FAngle, 0, 0, 1);"r90

    r90> Именно. Как в планиметрии.

    Проблема вот в чем:
    Допустим есть квадратный объект, скажем 20x20. При некотором разрешении он занимает X*Y пикселей экрана (не факт, что X равен Y). При повороте объекта на угол (скажем 90 градусов), объект будет занимать Y*X пикселей. И, если X не равен Y, то тут и получается это самое искажение. Из-за того, что я не могу менять разрешение и размер области вывода OpenGL, нужно как-то по-другому. Сейчас я просто пересчитываю размеры в зависимости от угла поворота и AspectRatio. Но хочется найти более элегантный способ :)

    Все еще жду советов...
     
  5. SWR

    SWR New Member

    Публикаций:
    0
    Регистрация:
    11 май 2006
    Сообщения:
    226
    Адрес:
    Russia
    насколько я знаю в OpenGL можно менять масштаб каждой оси.
    void glScale#(x,y,z);
     
  6. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    SWR> Примерно это я и делаю. Нехорошо это в моем случае... :dntknw:
     
  7. Bohdan200

    Bohdan200 New Member

    Публикаций:
    0
    Регистрация:
    13 сен 2005
    Сообщения:
    134
    Адрес:
    Lviv
    А как же glViewport()
     
  8. NaZGuL

    NaZGuL New Member

    Публикаций:
    0
    Регистрация:
    28 апр 2004
    Сообщения:
    41
    Адрес:
    Russia
    Xerx А если настроить проэкцию через glFrustum или glOrth?
     
  9. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    Bohdan200> Мне нельзя изменять общий размер области вывода
    NaZGuL> Тогда квадрат будет некрадратным (вроде как) :dntknw:
     
  10. Bohdan200

    Bohdan200 New Member

    Публикаций:
    0
    Регистрация:
    13 сен 2005
    Сообщения:
    134
    Адрес:
    Lviv
    Давай поподробнее. Вокруг какой оси вращаем?
     
  11. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    Вокруг Z (в плоскости экрана).
    Для примера положи на стол лист и поверни в плоскости стола :) Из-за aspect ratio OpenGL исказит пропорции и текстура будет внешне другой :dntknw:((
     
  12. vito

    vito New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2004
    Сообщения:
    177
    А переспективную проекцию нельзя использовать?
    Или только ортогональную?
     
  13. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    vito> Почти все рисуется в одной плоскости. Так что если хочется, то почему бы и нет?
     
  14. NaZGuL

    NaZGuL New Member

    Публикаций:
    0
    Регистрация:
    28 апр 2004
    Сообщения:
    41
    Адрес:
    Russia
    Xerx
    Вот с такими параметрами все будет Ок!
    Окно размер: 640x480
    ...
    glFrustum(-1.0,1.0,-0.75,0.75,0.1,100.0);
    ....
    Смысл уловил? Нужно просто установить вместо (-0.75,0.75) свои числа. Получить их можно вот так Window_Y_Size/Window_X_Size.

    PS: 480/640 = 0.75, 600/800 = 0.75, 768/1024 = 0.75
    Это для тех, кому лень цифры считать!
    И еще. Для glOrtho тоже должно прокатить.
     
  15. vito

    vito New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2004
    Сообщения:
    177
    Xerx

    При ортографической проекции, практически создаются двухмерные изображения в плоскости z=0. То есть перспектива не учитывается. И при изменении координаты z размеры объектов и углы между ними не изменяются. В отличие от перспективной.

    Вот стандартный пример инициализации.
    На входе размеры окна.

    Код (Text):
    1. GLvoid ReSizeGLScene(GLsizei width, GLsizei height)    
    2. {
    3.     if (height==0)                                     
    4.     {
    5.         height=1;                                      
    6.     }
    7.  
    8.     glViewport(0,0,width,height);                      
    9.     glMatrixMode(GL_PROJECTION);                       
    10.     glLoadIdentity();                                  
    11.     gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
    12.     glMatrixMode(GL_MODELVIEW);                        
    13.     glLoadIdentity();                                  
    14. }