Оказывается, я написал несколько статей в этой области некоторое время назад.Этот ( Интерактивные методы визуализации для четырех измерений ) наиболее близко относится к вашей конкретной проблеме, но другие документы, которые ссылаются на эту проблему, также могут помочьВ этом конкретном приложении я вращал объект, наблюдаемый в 4D, а не зритель, но математика эквивалентна.
Относительно этого конкретного вопроса:
Таким образом, вопрос таков:как двигаться вперед (используя матричное преобразование 4x4), находясь на поверхности четырехмерной гиперсферы?
Если вы перемещаетесь по поверхности гиперсферы, вы не переводите в ш .На самом деле вам нужно двигаться в сферической геометрии вокруг большого круга единичного радиуса.Это означает, что, если вы можете построить соответствующие оси для вашей системы отсчета, вы можете сферически интерполировать между тем, где вы находитесь и куда вы идете.
Например, одна конструкция, которая можетбыть использованным для такого шага, можно было бы использовать единичный вектор, который указывает прямо вперед (ваша точка обзора, aka p_1
в уравнении Википедии), векторную точку вне макушки головы (p_0
) ивектор, указывающий из правого уха (чтобы создать правую систему координат).
Если вы затем отслеживаете свою скорость по сфере по угловой скорости, а не по линейной, вы можете просто ввести значение для t
(прошедшее время) в Википедии, чтобы найти ваше новое угловое положение.
Обратите внимание, что это уравнение не ограничивает число компонентов в вершине p
.Сферическая интерполяция работает в любой геометрии.
РЕДАКТИРОВАТЬ (отвечая на вопросы в комментариях):
Slerp, кажется, не так, потому что я делаюне хочу интерполировать вращение между 2 векторами с течением времени.Вместо этого на каждом временном шаге я хочу перемещать каждую вершину в противоположном направлении, в котором зритель движется в этот момент.Таким образом, я нахожусь в позиции (0, 0, 0, 1) и хочу быть в (sqrt (2) / 2, sqrt (2) / 2, 0, 0) в следующем кадре.
Думайте об этом так: ваша позиция на сфере (любого измерения) - это вектор, который перемещает вас из центра на поверхность.Если вы двигаетесь с определенной угловой скоростью, это ставит вас в положение p0 и время t0, p1 в момент времени t1 и т. Д. Slerp - это удобный способ расчета этих позиций в определенное время.
Аналогично,Ваша линия визирования - это вектор под прямым углом к вектору смещения.Линия визирования v0 в момент времени t0, v1 в момент времени t1 и так далее.Slerp снова полезен для вычисления этого вектора.
Как построить соответствующую матрицу преобразования, чтобы каждая вершина умножалась на ее обратную?
Использованиеэти два вектора, ортогонализация дает вам третий, и теперь у вас есть новая система отсчета.Существует одиночный кватернион, который определяет поворот от вашей исходной системы отсчета до этой новой.Это то, что вы ищете.
ОДНАКО , прежде чем вы сможете визуализировать свой мир на двухмерном экране, вам сначала нужно отрендерить его с 4D до 3D.OpenGL (что неудивительно) не поддерживает это напрямую.
Чтобы понять почему, посмотрите на матрицу перспективной проекции .Предполагается, что вы визуализируете однородные точки в трехмерном пространстве: x, y, z находятся в первых трех компонентах, а w (коэффициент масштабирования) - в четвертом.w = 0 указывает на вектор, тогда как w = все остальное указывает на точку.w = что-либо, кроме 1, является ненормализованной точкой.
Таким образом, нет способа визуализировать точку в 4D-начале (0, 0, 0, 0).
Как видно из конструкции матрицы, сделать матрицу проекции 4D в 3D несложно. Примените это сначала к вашей геометрии, установленной независимо от матричного конвейера OpenGL. Тогда вы можете использовать стандартные матрицы OpenGL для 3D на экран.