PMG

Форумы по созданию игр
Текущее время: 19 апр 2024 23:12

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
 Заголовок сообщения: Отсечение ... как его обуздать?
СообщениеДобавлено: 13 июл 2011 13:17 
Не в сети
Новичок

Зарегистрирован: 13 июл 2011 13:05
Сообщения: 8
Я извиняюсь что может спрашиваю такую элементарщину для многих но никак немогу обуздать это злосное отсечение... начал пробывать делать врощающийся куб...

окно у меня 500*500

если пишу вот такое :
glOrtho(-200, 200, -200, 200, -200, 200);

то я вижу свой куб, только вот кадапытаюсь "оббежать" его посредствам смещения его и поворота он упирается в грань отсечения и пропадает... и неудается залезть в него внутрь, при определеном приближении тоже исчезает хотя у меня чотко написано задняя грань отсечения по оси Z тоесть от меня -200...

так и непонял что и в каких случаях юзать но попробывал использовать
glFrustum(-200.0, 200.0, -200.0, 200.0, 200.0, 200.0);
так мой бедный куб вобще не появляется.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Отсечение ... как его обуздать?
СообщениеДобавлено: 13 июл 2011 15:25 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
Что значит "обежать"?

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Отсечение ... как его обуздать?
СообщениеДобавлено: 13 июл 2011 15:52 
Не в сети
Новичок

Зарегистрирован: 13 июл 2011 13:05
Сообщения: 8
оББежать означает обойти бегом вокруг. Пока ждал ответа продвинулся на милиметр в этом деле... с горем пополам методом тыка мне удалось увидеть свой куб... но в каком виде??? как будто в глазок на него смотриш, вытягивается, переливается.. ужас какото..


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Отсечение ... как его обуздать?
СообщениеДобавлено: 15 июл 2011 12:07 
Не в сети
Новичок

Зарегистрирован: 13 июл 2011 13:05
Сообщения: 8
Немного разобрался, фреджитсу нельзя ставить большие значения. Но появилась другая проблема, Если нарисовать куб и переместится в его середину, то при оборотах видно небольшое искажение, как с этим боротся?

glFrustum(-1, 1, -1, 1, 1, 10);


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Отсечение ... как его обуздать?
СообщениеДобавлено: 15 июл 2011 14:59 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
Как-то плохо понимаю в чем у тебя проблема. Выложи плиз код с проектом, можно что увижу...

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Отсечение ... как его обуздать?
СообщениеДобавлено: 15 июл 2011 18:14 
Не в сети
Новичок

Зарегистрирован: 13 июл 2011 13:05
Сообщения: 8
вот файл проэкта кубас кирпичной текстурой.... зажимаем мышку и двигаем.. видите как искажено када смотриш в угол? как будто в глазок дверной)))

проэкт написан на Qt 4.7 поэтому если вы юзаете чтото другое там есть просто .h и .сpp файлы


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Отсечение ... как его обуздать?
СообщениеДобавлено: 18 июл 2011 09:51 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
Хорошо посмотрю.

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Отсечение ... как его обуздать?
СообщениеДобавлено: 20 июл 2011 09:01 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
Ну во-первых, функции glOrtho и glFrustum дюже разные. Первая параллельное проецирование, а вторая перспективное. Нагляднее это посмотреть у Эйнджела (http://pmg.org.ru/ebooks/angel.djvu) стр 224-6.
Во-вторых, если ты смещаешь glTranslatef(xTrans, yTrans, zTrans), тебе надо посмотреть не вылезают ли xTrans, yTrans, zTrans за пирамиду видимости glFrustum(-1.0, 1.0, -1.0, 1.0, 1.0, 15.0).
Я не использовал glFrustum. Вот код моего класса работы с камерой:
Код:
class ACCamera_3D {
// --------------- Camera 3D

  virtual void apply_projection () = 0;
  virtual void apply_viewport () = 0;
  virtual void apply_viewer () = 0;

};


#ifdef _WIN32

class CCamera_OGL : public ACCamera_3D {
// --------------- Camera OGL

public:

  CCamera_OGL ()
  {
    type_view = 0;
    eye.cpy( 0.0f, 0.0f, 1.0f);
    center.cpy( 0.0f, 0.0f, 0.0f);
    up.cpy(0.0f, 1.0f, 0.0f);

    type_projection = 1;
    fovy = 52.0f;
    aspect = 1.0f;
    zNear = 1.0f;
    zFar = 1000.0f;
  }


  void look_at_view ( SVector3f * eye_, SVector3f * center_, SVector3f * up_ )
  {
    type_view = 0;
    eye.cpy(eye_);
    center.cpy(center_);
    up.cpy(up_);
  }

  void  pilot_view ( SVector3f * plane_, float roll_, float pitch_, float heading_ )
  {
    type_view = 1;
    plane.cpy(plane_);
    roll = roll_;
    pitch = pitch_;
    heading = heading_;
  }

  void orbit_view ( float distance_, float twist_, float elevation_, float azimuth_ )
  {
    type_view = 2;
    distance = distance_;
    twist = twist_;
    elevation = elevation_;
    azimuth = azimuth_;
  }

  void ortho_projection (  float left_, float right_, float bottom_, float top_, float zNear_, float zFar_ )
  {
    type_projection = 0;
    left = left_;
    right = right_;
    bottom = bottom_;
    top = top_;
    zNear = zNear_;
    zFar = zFar_;
  }

  void perspective_projection ( float fovy_, float zNear_, float zFar_ )
  {
    type_projection = 1;
    fovy = fovy_;
    aspect = float(win.w) / float(win.h);
    zNear_p = zNear_;
    zFar_p = zFar_;
  }

  void assign_viewport ( bool yes_scissor_, uint_t x, uint_t y, uint_t w, uint_t h )
  {
    if ( h == 0 ) h = 1;
    if ( w == 0 ) w = 1;
    win.cpy( x, y, w, h);
    yes_scissor = yes_scissor_;

    if ( type_projection==0 ) {
      left = (float)x;
      right = (float)(x+w-1);
      bottom = (float)y;
      top = (float)(y+h-1);
    }

  }

  virtual void apply_projection ();
  virtual void apply_viewport ();
  virtual void apply_viewer ();

  virtual void apply ();

  int get_type_view () { return type_view; }
  int get_type_projection () { return type_projection; }

protected:

  int type_view, type_projection;

  SVector3f eye, center, up;

  SVector3f plane;
  float roll, pitch, heading;

  float distance, twist, elevation, azimuth;

  float left, right, bottom, top, zNear, zFar;

  float fovy, aspect, zNear_p, zFar_p;

  SVector4ui win;
  bool yes_scissor;

};

void CCamera_OGL:: apply_viewer ()
{
  switch ( type_view ) {
  case 0:
    gluLookAt(eye.x,eye.y,eye.z, center.x,center.y,center.z, up.x,up.y,up.z );
    break;
  case 1:
    glRotatef (roll, 0.0f, 0.0f, 1.0f);
    glRotatef (pitch, 0.0f, 1.0f, 0.0f);
    glRotatef (heading, 1.0f, 0.0f, 0.0f);
    glTranslatef (-plane.x, plane.y, plane.z );
    break;
  case 2:
    glTranslatef (0.0f, 0.0f, -distance );
    glRotatef (-twist, 0.0f, 0.0f, 1.0f);
    glRotatef (-elevation, 0.0f, 1.0f, 0.0f);
    glRotatef (azimuth, 1.0f, 0.0f, 0.0f);
    break;
  }
}

void CCamera_OGL:: apply_projection ()
{
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  switch ( type_projection ) {
  case 0:
    glOrtho(left, right, bottom, top, zNear, zFar);
    break;
  case 1:
    gluPerspective(fovy, aspect, zNear_p, zFar_p);
    break;
  }
  glMatrixMode(GL_MODELVIEW);
}


void CCamera_OGL:: apply_viewport ()
{
  if ( yes_scissor ) {
    glEnable(GL_SCISSOR_TEST);
    glScissor((GLint)win.x, (GLint)win.y, (GLsizei)win.w, (GLsizei)win.h );
  }
  else
    glDisable(GL_SCISSOR_TEST);
  glViewport( (GLint)win.x, (GLint)win.y, (GLsizei)win.w, (GLsizei)win.h);
}


void CCamera_OGL:: apply ()
{
  apply_viewport();
  apply_projection();
  glMatrixMode(GL_MODELVIEW);   
  glLoadIdentity();
  apply_viewer();
}



_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 34


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB