Вот как так сделать?..

Тема в разделе "WASM.OpenGL", создана пользователем 7mm, 24 ноя 2010.

  1. 7mm

    7mm New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2009
    Сообщения:
    442
    Всем привет.

    Есть некоторое приложение, работающее с графикой посредством OpenGL. Мне нужно немножко изменить логику работы, а именно: передвинуть положение камеры и добавить повороты по осям. Я раскопал функцию, которая, как мне кажется выполняет необходимые мне действия - выполняет сдвиг и повороты по осям. Вот логика её работы:

    Код (Text):
    1. // 1. Создание проекции
    2. GlMatrixMode(GL_PROJECTION);
    3. glPushMatrix();
    4. glLoadIdentity();
    5. SetViewPort(...);
    6. PerspectiveView(fovy, aspect, zFar, zNear); << -------- ВОТ ТУТ МОЙ ХУК
    7.  
    8. // 2. Создание отображения
    9. GlMatrixMode(GL_MODELVIEW);
    10. glPushMatrix();
    11. glLoadIdentity();
    12.  
    13. // Вращение по осям...
    14. glRotatef(RotateVector[0], 1, 0, 0);
    15. glRotatef(RotateVector[1], 0, 1, 0);
    16. glRotatef(RotateVector[2], 0, 0, 1);
    17.  
    18. // Перенос
    19. glTranslatef(TranslateVector[0], TranslateVector[1], TranslateVector[2]);
    20.  
    21. // ... что-то ещё (glDisable, glEnable etc)
    Итак, функцию PerspectiveView() я перехватил, она отрабатывает. Задача заключается в том, чтобы находясь в этом перехвате как-то добавить своё вращение и свой перенос.

    Обращаюсь к знатокам OpenGL, как это вообще сделать? Я честно пытался повторить код секции 2 со своими параметрами, но нужного результата так и не получил, видимо потому, что после моего кода неминуемо следует GlMatrixMode(GL_MODELVIEW) / glPushMatrix() / glLoadIdentity() из начала 2-го блока.

    Вообще, начинаю задумываться - а возможно ли такое в принципе? Пока единственным решением вижу в хуке править в стековом фрейме адрес возврата, чтобы проскакивать несколько следующих инструкций.. Но это как-то не кошерно...

    С OpenGL не очень знаком, поэтому прошу помощи :)
     
  2. 7mm

    7mm New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2009
    Сообщения:
    442
    Ну на самом деле всё оказалось слишком просто - достаточно было в перехвате вызывать необходимые функции glRotatef и glTranslatef. Всем спасибо за внимание :)