2014-12-30 2 views
3

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

Моя модель - класс, и у меня также есть класс сцены, в котором загружены модели, и здесь собраны все графические материалы. Если у меня есть модель матрицы в качестве частной переменной в модели, так:

class Model 
{ 
public: 
    Model(); 
    ~Model(); 

    // other functions here 

    setPosition(vec3 pos); 
    setRotation(vec3 axis, float angle); 
    setScale(vec3 factor); 

    // getters 

    render(GLuint shaderProgram); 
    update(GLuint shaderProgram); 

private: 
    mat4 pModelMatrix; 
    vector<Mesh> pMeshes; 
}; 

Разумно для модельной матрицы, чтобы быть в классе модели; или должна быть только одна модельная матрица, которая находится в классе сцены, которая затем передается равномерным в вершинный шейдер. Моя единственная забота о последнем заключается в том, что если я это сделаю, то все модели будут иметь одинаковые преобразования. Итак, если я просто хочу переместить одну модель (которая имела бы игрок [да, это то, что есть или есть-дебаты!]), Тогда было бы разумно применять преобразования только к этой одной модели и, следовательно, к модельная матрица. Но тогда, что тогда сказал бы вершинный шейдер? Я все еще довольно новичок в OpenGL, и немного сложно понять весь бизнес, как OpenGL имеет дело с преобразованиями с несколькими рендеринговыми моделями; Я знаю, что они служат такой цели, как то, что было описано ранее, но трудно ли реализовать много матриц моделей многих моделей, которые передаются только одной единой матрице.

Что делает функция update(), принимает pModelMatrix и использует материал glUniform(), чтобы передать матрицу в вершинный шейдер, который затем умножается на все остальные матрицы и т. Д. Причина, по которой я помещаю glUniform() в функцию update(), заключается в том, что во время моей программы я хочу, чтобы позиция, которую моя модель записывала с помощью setPosition (..), затем, наконец, обновляла модель по мере необходимости, пока программа работает ,

Вектор pMeshes, длинный рассказ короткий, просто удерживает все сетки модели вместе, а другой класс загружает сетку сеткой.

ответ

3

Модель/мировое преобразование специфично для каждой сетки/модели в вашей сцене. Как вы уже упоминали, преобразовать каждую модель самостоятельно, имея матрицу для каждого из них.

Что касается вершинного шейдера, вы можете иметь матрицу проекционного вида в однородной и матричной модели в однородной форме и преобразовать вершины сетки в пространство клипа. Затем для следующей модели просто измените модельную матрицу на эту матрицу и повторите ее.

+0

Thanks; и если бы я хотел получить позицию, поворот и масштаб модели. Должен ли я создать вектор из соответствующих элементов модельной матрицы; например диагональ матрицы для масштаба. Или я должен просто вернуть модельную матрицу и позволить пользователю понять себя? – Poriferous

+0

Зависит от ваших потребностей, я думаю. У вас могут быть такие методы, как «RotateModel», «ScaleModel» и «TranslateModel», которые берут вектор, создают матрицу из вектора и умножают ее на матрицу текущей хранимой модели. Вы также можете сохранить только три вектора для позиции, масштаба и вращения и создать модельную матрицу в методе 'GetModelMatrix'. – Schnigges

+0

Спасибо вам, два; теперь я начинаю понимать! – Poriferous