Сейчас я вращаю объект, давайте назовем его «mainBody», но к mainBody прикреплены несколько вложений, и когда я поворачиваю mainBody, они должны также вращаться, но сейчас они этого не делают. Я не использую родительскую / дочернюю систему. Основная часть имеет массив вложений и рисует их в функции рисования mainBody.
GlPopMatrix () из основного тела выполняется после отрисовки предметов экипировки.
Я знаю, что раньше мне удавалось делать это с помощью pushMatrix (); и popMatrix (); Но сейчас это не похоже на работу.
Я использую c ++, opengl и glm.
Вот код, который показывает вам, что у меня есть сейчас:
{
setupStartModelMatrix(); //<---- Has glPushMatrix();
setupModelviewMatrix(); //<--- has all the gml stuff
drawMainBody();
}
if(mNumberOfEquipementOwned != 0)
{
for(int i = 0; i < mNumberOfEquipementOwned; i++)
{
//obj is retrieved with a function
obj->render();
}
}
setupEndModelMatrix(); // <--- Has glPopMatrix();
}
И код GLM
void GameObject::setupModelviewMatrix()
{
glm::mat4 Projection = glm::perspective(45.0f, 4.0f / 3.0f, 0.1f, 100.f);
glm::mat4 Model = glm::scale( glm::mat4(1.0f), glm::vec3(1.0f));
glm::mat4 ViewTranslate = glm::translate( glm::mat4(1.0f), glm::vec3(mPosition.x, mPosition.y, mPosition.z));
glm::mat4 ViewRotateX = glm::rotate( ViewTranslate, mRotation.x, glm::vec3(1.0f, 0.0f, 0.0f));
glm::mat4 ViewRotateY = glm::rotate( ViewRotateX, mRotation.y, glm::vec3(0.0f, 1.0f, 0.0f));
glm::mat4 View = glm::rotate( ViewRotateY, mRotation.z, glm::vec3(0.0f, 0.0f, 1.0f));
glm::mat4 MVP = View * Model;
glUniformMatrix4fv( 0, 1, GL_FALSE, glm::value_ptr(MVP));
glLoadMatrixf(glm::value_ptr(MVP));
}
И код оборудования ничьей
void Gun::render()
{
glPushMatrix();
setupModelviewMatrix();
mMesh->render();
glPopMatrix();
}
Я думаю, что вы звоните glPushMatrix()
, вращая, рисуя ваше основное тело, вызывая glPopMatrix()
затем рисование вложений. Если это правда, переместите glPopMatrix()
позвоните после оформления вложения.
Из-за Тима я заметил, что моя матрица не прошла через другие. Когда я наконец понял, что он говорит, это легко исправить, поэтому 100% реквизита достается ему.
Теперь код для тех, кому это может понадобиться.
{
glm::mat4 startingModel(1.0);
setupStartModelMatrix();
startingModel = continuedModelvieuwMatrix(startingModel);
drawMainBody();
}
if(mNumberOfEquipementOwned != 0)
{
for(int i = 0; i < mNumberOfEquipementOwned; i++)
{
//obj is retrieved with a function
obj->render(startingModel);
}
}
setupEndModelMatrix(); // <--- Has glPopMatrix();
}
И код GLM
glm::mat4 GameObject::continuedModelvieuwMatrix(glm::mat4 startingModel)
{
glm::mat4 Model = glm::scale( glm::mat4(1.0f), glm::vec3(1.0f));
glm::mat4 ViewTranslate = glm::translate( startingModel, glm::vec3(mPosition.x, mPosition.y, mPosition.z));
glm::mat4 ViewRotateX = glm::rotate( ViewTranslate, mRotation.x, glm::vec3(1.0f, 0.0f, 0.0f));
glm::mat4 ViewRotateY = glm::rotate( ViewRotateX, mRotation.y, glm::vec3(0.0f, 1.0f, 0.0f));
glm::mat4 View = glm::rotate( ViewRotateY, mRotation.z, glm::vec3(0.0f, 0.0f, 1.0f));
glm::mat4 MVP = View * Model;
glUniformMatrix4fv( 0, 1, GL_FALSE, glm::value_ptr(MVP));
glLoadMatrixf(glm::value_ptr(MVP));
return MVP;
}
void GameObject::setupStartModelMatrix()
{
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
И код оборудования ничьей
void Gun::render(glm::mat4 startingModel)
{
glm::math4 tempModel;
tempModel = continuedModelvieuwMatrix(startingModel);
mMesh->render();
}
И это об этом.
Я не уверен на 100%, работает ли этот код, так как мне пришлось по-другому его исправлять из-за конструкции моего объекта, но это должно, по крайней мере, дать хороший старт любому, кто столкнулся с такой же проблемой.
Также для этой работы не требуется glPopMatrix () или glPushMatrix ().