Я работаю над космическим шутером, где вы можете вращать свой корабль вокруг осей x, y и z и таким образом стрелять в любом направлении. Чтобы повернуть корабль (я использую openGL в c ++), я поворачиваю на 0-360 градусов вокруг оси x, y или z. Камера всегда будет смотреть в одном и том же направлении (вниз вдоль оси z, как «по умолчанию»). Вы просто смотрите на вращающийся корабль.
Пример: glRotatef (-90,0f, 1,0f, 0,0f, 0,0f);
Приведенный выше пример повернёт корабль на -90 градусов вокруг оси x. Если бы корабль вращался вверх вдоль положительной оси y, как в обычном космическом шутере до вращения, то после поворота корабль указывал бы вдоль отрицательной оси z.
То, что я изо всех сил пытаюсь выяснить, — это как в любое время вычислить «направление» корабля и превратить его в vector3d (x, y, z внутри класса с именем vector3d).
Я вычисляю положение (еще один vector3d, просто x, y и z) любого движущегося объекта, добавляя текущую позицию (xyz) к скорости, которую я также сохраняю в vector3d, и умножаю ее на время дельты (время с последнего кадра / обновления). ). Когда я стреляю снарядом с космического корабля, я хочу иметь вектор направления корабля, чтобы использовать его в качестве основы для скорости стреляющего снаряда, чтобы я мог рассчитать положение снаряда так же, как я вычисляю положение других объектов, просто добавляя текущую позицию снаряда к скорости, умноженной на deltatime.
Поскольку у меня есть направление корабля в форме вращения вокруг x, y и z, я полагаю, что должно быть возможно каким-то образом превратить это в vector3d, который представляет то же направление в векторном формате (если это имеет смысл).
Возьмите вектор интересующего вас направления, например, Z ось исходного не повернутого корабля. Это вектор как (0,0,1)
, Теперь примените к нему матрицу вращения, как вы найдете в glRotate
документация. Вы можете спокойно игнорировать последнюю строку и столбец этой матрицы, поскольку вы вращаетесь только вокруг источника. Результатом умножения матрицы на вектор будет изображение вектора под заданной матрицей вращения.
Других решений пока нет …