Соединение двух моделей в opengl
У меня есть две модели, каждая из которых хранится в отдельном VBO. Что я хочу сделать, это связать их так, чтобы вращение одного вращало другое, в то же время оставляя другое подключенным к первой модели. Теперь я использую три матрицы моделей: одну основную для всего объекта и одну для каждой из моделей, чтобы их можно было переводить по отношению к основной матрице. Однако, когда я делаю это, две модели отключаются, если я поворачиваю их. Как бы я связал две модели, чтобы они оставались связанными во время ротации или перевода?
2 ответа
Обычно вы делаете это так:
glLoadMatrix( mainMatrix );
glPushMatrix();
glMultMatrix( firstModelMatrix );
drawFirstModel();
glPopMatrix();
glMultMatrix( secondModelMatrix );
drawSecondModel();
Конечно, если вы измените firstModelMatrix
или же secondModelMatrix
две модели могут быть отключены. Но чем, это то, что вы намерены. Если вы хотите, чтобы они оставались на связи, измените только mainMatrix
,
Однако обратите внимание, что эти матричные операции не рекомендуются. Тем не менее, вы должны быть в состоянии получить трюк из кода.
РЕДАКТИРОВАТЬ: Учитывая, что у вас есть голова и тело. Вы хотите вращать голову. Все дело в том, как вычисляется ваша матрица головы, особенно важно, в каком порядке вы применяете перевод и вращение. Я думаю, сейчас у вас есть что-то вроде этого:
HeadMatrix = Rotation * Translation
Но то, что вам нужно, это для того, чтобы держать голову на теле:
HeadMatrix = Translation * Rotation
У вас нет двух моделей. Все, что у вас есть, - это два буфера байтов, которые становятся геометрией только в сочетании с вызовом glDrawArrays или glDrawElements, который обращается к данным в буферах и интерпретирует их как треугольники.
OpenGL не знает, что такое "модель". OpenGL не поддерживает сцену или отношения между моделями. Это просто рисование точек, линий или треугольников в кадровом буфере, по одному за раз, без какого-либо воспоминания о том, какие другие точки, линии или треугольники были нарисованы ранее.
Если вы хотите сцену, вы должны поддерживать это самостоятельно.