У меня есть проект 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}.