Как нацелить камеру на вид сбоку

Тема в разделе "WASM.OpenGL", создана пользователем gehedzh, 13 сен 2010.

  1. gehedzh

    gehedzh New Member

    Публикаций:
    0
    Регистрация:
    8 сен 2010
    Сообщения:
    6
    Задача нацелить камеру так чтобы смотреть на объект сбоку (см. рис. в приложении). Как это сделать? Вот мой код для вида сверху.
    Код (Text):
    1. #include <glaux.h>
    2. #include <GL/glut.h>
    3. #include <gl.h>
    4. #include <glu.h>
    5. #include <math.h>
    6. #include <windows.h>
    7. #include <ctime>
    8. #include <stdlib.h>
    9.  
    10. #pragma comment (lib, "glaux.lib")
    11. #pragma comment (lib, "opengl32.lib")
    12. #pragma comment (lib, "glu32.lib")
    13. #pragma comment (lib, "glut32.lib")
    14.  
    15. #define radius 0.5
    16.  
    17. double x, y;
    18.  
    19. void DrawBall()
    20. {
    21.     glPushMatrix();
    22.         glTranslated(x,y,0);
    23.         glColor3d(1,0,0);
    24.         glutSolidSphere(radius, 100, 100);
    25.     glPopMatrix();
    26. }
    27.  
    28. void display(void)
    29. {
    30.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    31.     DrawBall();
    32.     glutSwapBuffers();
    33.     glFlush();
    34. }
    35.  
    36. void resize(int width,int height)
    37. {
    38.    glViewport(0,0,width,height);
    39.    glMatrixMode( GL_PROJECTION );
    40.    glLoadIdentity();
    41.    glOrtho(-5,5, -5,5, 2,12);  
    42.    gluLookAt( 0,0,5, 0,0,0, 0,1,0 );
    43.    glMatrixMode( GL_MODELVIEW );
    44. }
    45.  
    46. int main(int argc, char* argv[])
    47. {
    48.     glutInitWindowPosition(50, 10);
    49.     glutInitWindowSize(400, 400);
    50.     glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);
    51.     glutCreateWindow("Testbed");
    52.     glutDisplayFunc(display);
    53.     glutReshapeFunc(resize);
    54.  
    55.     glEnable(GL_ALPHA_TEST);
    56.     glEnable(GL_DEPTH_TEST);
    57.     glEnable(GL_COLOR_MATERIAL);
    58.     glEnable(GL_BLEND);
    59.     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    60.  
    61.     glutMainLoop();
    62.     return 0;
    63. }
     
  2. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    прочитайте про gluLookAt
    три группы параметров. если я не ошибаюсь
    Код (Text):
    1. gluLookAt(pos.x, pos.y, pos.z, aim.x, aim.y, aim.z, top.x, top.y, top.z)
    2. где pos=позиция камеры в пространстве
    3.     aim=направление обзора камеры (в вашем случае можно указать координаты сферы и если я не ошибаюсь, то она располагается по 0.0, 0.0, 0.0)
    4.     top=направление вектора указывающего на верх сцены (в вашем случае можно просто пользоваться статическим вектором и направить ось y вверх или рассчитать векторное произведение вектора aim исходящего из позиции pos и какого-нибудь еще. например вектора движения объекта на который указывает aim)
    Да и в интернете полно всего на эту тему

    UPD:и кстати у вас получился вид сзади т.к. в OpenGL ось z смотрит вглубь экрана, хотя при правильной манипуляции камерой и правильной корректировкой этой особенности можно на нее внимания не обращать

    соответственно
    gluLookAt( 5.0,0.0,0.0, 0.0,0.0,0.0, 0.0,1.0,0.0); //вид справа
    gluLookAt( 0.0,5.0,0.0, 0.0,0.0,0.0, 0.0,1.0,0.0); //вид сверху
    gluLookAt( 0.0,0.0,5.0, 0.0,0.0,0.0, 0.0,1.0,0.0); //вид сзади
    gluLookAt( -5.0,0.0,0.0, 0.0,0.0,0.0, 0.0,1.0,0.0); //вид слева
    gluLookAt( 0.0,-5.0,0.0, 0.0,0.0,0.0, 0.0,1.0,0.0); //вид снизу
    gluLookAt( 0.0,0.0,-5.0, 0.0,0.0,0.0, 0.0,1.0,0.0); //вид спереди

    и на всех видах сфера должна получиться шариком, хотя это зависит от настройки пространства OpenGL