Opengl преобразует относительные координаты тела в мировые координаты - PullRequest
1 голос
/ 01 мая 2011

У меня есть проект opengl c ++, над которым я работаю, в котором я рисую игрока и мяч в правой руке. Сначала я хочу, чтобы мяч следовал за движением руки игрока, устанавливая положение мяча. Через некоторое время мне нужно заставить шар двигаться, используя уравнения кинематики. Я получаю матрицу правого преобразования игрока, используя (я делаю это в тот момент, когда рисую игрока):

glGetFloatv(GL_MODELVIEW_MATRIX, ball->transformMatrix);

и затем, когда я рисую мяч, я пытаюсь сделать:

glLoadMatrixf(ball->transformMatrix);
glTranslated(0, 0, 0);
glCallList(lists[BALL]);

это отлично работает и мяч на месте.

Проблема в том, когда мне нужно переместить мяч

x += velocityX*dt;
y += velocityY*dt + gravity*dt*dt;
z += velocityZ*dt;

velocityY += gravity*dt;

Движение относится не к трансформации игрока, а к глобальному. Я пробовал много способов решить эту проблему, но ни один не работает.

Так как же я могу правильно рассчитать x, y, z шара, чтобы я мог перевести мяч после того, как он покинул руку игрока?

Edit:

Мне удалось получить координаты шара, умножив ball-> transformMatrix на вектор {0, 0, 0, 1}, сохраняя результат в векторе мира после этого вызова (в момент, когда я рисую шар):

glGetFloatv(GL_MODELVIEW_MATRIX, currentTransformMatrix);

затем инвертируя currentTransformMatrix и умножая обратное на мировой вектор. Результатом являются правильные координаты шара {x, y, z}.

1 Ответ

2 голосов
/ 01 мая 2011

Вам необходимо вернуться в положение руки игрока;инвертировать трансформацию из руки в мир.Поскольку OpenGL не является математической библиотекой, вам нужно либо самостоятельно реализовать матричную математику, либо использовать стороннюю линейную математическую библиотеку.

РЕДАКТИРОВАТЬ из-за комментариев:

ЧтоВы преобразуете скорость и ускорение в локальную систему координат шара.Как скорость, так и гравитация являются просто «директивными» векторами, поэтому преобразование не зависит от положения шара в мире (хорошо, гравитация может измениться, но здесь это не проблема).Таким образом, вам нужно обратное преобразование из мира в пространство шара, которое не зависит от позиции.Это та же самая проблема, что и преобразование нормалей (наоборот) =>, поэтому вам нужно взять транспонированную инверсию инвертированной матрицы (подробно объяснено здесь http://www.lighthouse3d.com/tutorials/glsl-tutorial/the-normal-matrix/).Однако у вас уже есть обратное этому обратному;это сама матрица ball-> world.Так что вам просто нужно переставить матрицу вида модели, умножить векторы скорости и гравитации на нее и применить их в локальном пространстве шара.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...