Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Программирование игр, графики и искусственного интеллекта > непонятки с позиционированием в OpenGL ES


Автор: Kabu 5.9.2009, 17:12
Перерыл весь инет, а решения проблемы так и не нашел. Если кто знает в чем проблема, просветите.
В общем проблема следующая: взял http://iphonedevelopment.blogspot.com/2008/12/glulookat.html реализацию gluLookAt() для OpenGL ES и решил проверить чего она может
Логика программы следующая:
1. Инициализирую OpenGL ES
2. Определяю матрицу проекции, затем делаю текущей матрицу модели:
Код

  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  gluPerspective(90,1,1,100);
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();

3. Далее код прорисовки кадра выглядит следующим образом (рисую простой треугольник и над ним позиционирую камеру, перед прорисовкой каждого кадра изменяю угол поворота камеры, направляя взгляд вдоль оси Y).
Код

void Render()
{
  static int Order = 1; 
  static float rotation = -5;
                                      /* Vertex 1    Vertex 2    Vertex 3*/                           
  GLshort vertexArray[9] =  {-25,-25,0,   25,-25,0,     0,25,0 };
  GLubyte colorArray[12] = {200,0,0,0,   0,200,0,0,    0,0,200,0};
  
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  
  glLoadIdentity();  
 
  //Определяю угол поворота
  rotation+=(5*Order);
  // Если угол поворота больше 80, то со следующего врейма буду его уменьшать.
  if (abs(rotation)>80) Order*=-1;
//
GLfloat StartY = 0;
GLfloat StartZ = 20;
 // Позиционирую камеру
  gluLookAt( 0,StartY ,StartZ ,    
                  0,StartY +StartZ *(GLfloat)sin(rotation*3.14f/180),StartZ -StartZ *(GLfloat)cos(rotation*3.14f/180),
                  0,1,0);
 
  glEnableClientState(GL_VERTEX_ARRAY);
  glVertexPointer(3, GL_SHORT, 0, vertexArray);
 
  glEnableClientState(GL_COLOR_ARRAY);
  glColorPointer(4,GL_UNSIGNED_BYTE, 0, colorArray);
 
  glDrawArrays(GL_TRIANGLES, 0, 3);
  glDisableClientState(GL_VERTEX_ARRAY);
  glDisableClientState(GL_COLOR_ARRAY);
        
  eglSwapBuffers(glesDisplay, glesSurface);
}

Если угол поворота достигает примерно 40 градусов при StartY=0, StartZ = 20, то изображение как-бы переворачивается. Попробовал поизменять StartY и StartZ и оказалось, что когда вне области видимости камеры(т.е. под камерой) лежит чуть меньше половины треугольника, то происходит зеркальное отображение картинки.
Допустим если StartY=-20, а StartZ=20, то глюк происходит если поворот осуществлен примерно на 80 градусов.
На картинках First - это когда StartY = -20, а Second - когда StartY = 0.
Библиотека GLES http://sourceforge.net/projects/ogl-es/files/
Пишу на eMbedded Visual C++4.0. Точно такая же проблема возникала, когда писал на C#, собсно после этого и решил попробовать на сях. Эта проблема остается, если не использовать функцию gluLookAt, а позиционировать объект поворотами и перемещением. Если поворачивать вектор UP и держать его всегда перпендикулярно оси взгляда, то это тоже не помогает, я его даже держал вдоль оси Z - без толку. На реальных девайсах под управлением WinCE, WindowsMobile 5.0 и WindowsMobile 6.0 проблема остается.
Скорее всего я чегото недопонимаю, помогите кто чем может.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)