Вращение объекта и его «детей»

Сейчас я вращаю объект, давайте назовем его «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();
}

0

Решение

Я думаю, что вы звоните glPushMatrix(), вращая, рисуя ваше основное тело, вызывая glPopMatrix()затем рисование вложений. Если это правда, переместите glPopMatrix() позвоните после оформления вложения.

2

Другие решения

Из-за Тима я заметил, что моя матрица не прошла через другие. Когда я наконец понял, что он говорит, это легко исправить, поэтому 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 ().

1

По вопросам рекламы [email protected]