Какой самый лучший glMatrixMode () для использования GLM? - PullRequest
0 голосов
/ 22 марта 2011

Мой следующий вопрос (или проблема) заключается в том, что когда я загружаю модель с помощью glm, я могу видеть части модели, например: если бы две горы находились одна перед другой, я мог видеть сквозьближе гора

я бы показал картинку, но это было бы непонятно, так как текстура не работает.

вот эта проблема здесь:

enter image description here

СТАРЫЙ СТАРШИЙ: vvvvvvvvvvvvvvvvvvvvvvvvvvvvv

все, что меня интересует: каков наилучший матричный режим для использования glm?

я привык к GL_PROJECTION, но это дает мне слишком многопроблемы при загрузке моей модели

и с GL_MODELVIEW я не могу переместить камеру назад

мне также интересно: если я использую GL_MODELVIEW, то как я могу переместить "камеру" в сцене?Есть ли способ, возможно, настроить один, так как в конечном итоге ИМА должен?

РЕДАКТИРОВАТЬ: хорошо вот код, чтобы дать вам, ребята, какое-то видение:

Ответы [ 2 ]

1 голос
/ 22 марта 2011

Нет ни одного определенного матричного режима, в котором вы также переключаете OpenGL.Я объяснил это уже в этом посте OpenGL: что такое MatrixMode? , который я просто скопирую здесь:


OpenGL использует несколько матриц для преобразования геометрии и связанных данных.Этими матрицами являются:

  • Modelview - помещает геометрию объекта в глобальное пространство, не проецируется space
  • Proection - проецирует глобальные координаты в пространство клипа;Вы можете думать об этом как о типе линзы
  • Текстура - корректирует координаты текстуры раньше;в основном используется для реализации текстурной проекции (т.е. проецирует текстуру, как если бы она была слайдом в проекторе)
  • Цвет - регулирует цвета вершин.Крайне тронутый вообще

Все эти матрицы используются постоянно.Поскольку они следуют одним и тем же правилам, OpenGL имеет только один набор функций манипулирования матрицей: glPushMatrix, glPopMatrix, glLoadIdentity, glLoadMatrix, glMultMatrix, glTranslate, glRotate, glScale, glOrtho, glFrustum.

операции с glMatrixMode для этих матрицдействовать наСкажем, вы хотели написать какую-нибудь оболочку для пространства имен C ++, это могло бы выглядеть так:

namespace OpenGL {
  // A single template class for easy OpenGL matrix mode association
  template<GLenum mat> class Matrix
  {
  public:
    void LoadIdentity() const 
        { glMatrixMode(mat); glLoadIdentity(); }

    void Translate(GLfloat x, GLfloat y, GLfloat z) const
        { glMatrixMode(mat); glTranslatef(x,y,z); }
    void Translate(GLdouble x, GLdouble y, GLdouble z) const
        { glMatrixMode(mat); glTranslated(x,y,z); }

    void Rotate(GLfloat angle, GLfloat x, GLfloat y, GLfloat z) const
        { glMatrixMode(mat); glRotatef(angle, x, y, z); }
    void Rotate(GLdouble angle, GLdouble x, GLdouble y, GLdouble z) const
        { glMatrixMode(mat); glRotated(angle, x, y, z); }

    // And all the other matrix manipulation functions
    // using overloading to select proper OpenGL variant depending on
    // function parameters, and all the other C++ whiz.
    // ...
  };

  // 
  const Matrix<GL_MODELVIEW>  Modelview;
  const Matrix<GL_PROJECTION> Projection;
  const Matrix<GL_TEXTURE>    Texture;
  const Matrix<GL_COLOR>      Color;
}

Позже в программе на C ++ вы могли бы написать

void draw_something()
{
    OpenGL::Projection::LoadIdentity();
    OpenGL::Projection::Frustum(...);

    OpenGL::Modelview::LoadIdentity();
    OpenGL::Modelview::Translate(...);

    // drawing commands
}

К сожалению, C ++ не может шаблонироватьпространства имен, или применить using (или with) к экземплярам (другие языки имеют это), в противном случае я бы написал что-то вроде (недействительный C ++)

void draw_something_else()
{
    using namespace OpenGL;

    with(Projection) {    // glMatrixMode(GL_PROJECTION);
        LoadIdentity();   // glLoadIdentity();
        Frustum(...);     // glFrustum(...);
    }

    with(Modelview) {     // glMatrixMode(GL_MODELVIEW);
        LoadIdentity();   // glLoadIdentity();
        Translate(...);   // glTranslatef(...);
    }

}

Я думаю, что это последний фрагмент (псевдо-) код проясняет это: glMatrixMode является своего рода with оператором OpenGL.


Все матрицы используются во время рендеринга!

0 голосов
/ 22 марта 2011

Вы перемещаете камеру с помощью glTranslate ().

...