Я делаю игру с некоторыми друзьями. В настоящий момент мы пытаемся заставить элементы управления работать так, как они должны, т. Е. WASD перемещаться по 4 основным направлениям и использовать мышь для поворота представления.Как применить преобразования матрицы просмотра в мировом пространстве, а не локально?
Проблема в том, что мы сталкиваемся с трудностями с матрицами, в частности матрицей вида. Я читал больше учебников, чем за последние несколько недель, и я понимаю основные принципы и способы сделать некоторые простые вещи, но мне все еще не хватает этого фундаментального понимания того, как все это происходит вместе.
Прямо сейчас наша главная проблема заключается в том, чтобы преобразование камеры действовало так, как можно было бы ожидать. Используя обучающие программы, которые я видел, все преобразования камеры происходят по локальной оси, что приводит к некоторому странному поведению, например, после небольшого перемещения, я могу легко закончить боком или даже вверх-вниз.
Эти две функций, которые я использую для вращения матрицы вида, как виден во всех учебниках я уже смотрел на:
def xrotate(M,theta):
t = math.pi*theta/180
cosT = math.cos(t)
sinT = math.sin(t)
R = numpy.array(
[[ 1.0, 0.0, 0.0, 0.0 ],
[ 0.0, cosT,-sinT, 0.0 ],
[ 0.0, sinT, cosT, 0.0 ],
[ 0.0, 0.0, 0.0, 1.0 ]], dtype=np.float32)
M[...] = np.dot(M,R)
def yrotate(M,theta):
t = math.pi*theta/180
cosT = math.cos(t)
sinT = math.sin(t)
R = numpy.array(
[[ cosT, 0.0, sinT, 0.0 ],
[ 0.0, 1.0, 0.0, 0.0 ],
[-sinT, 0.0, cosT, 0.0 ],
[ 0.0, 0.0, 0.0, 1.0 ]], dtype=np.float32)
M[...] = np.dot(M,R)
Как бы идти о применении матричных преобразований в глобальном пространстве?
О, а также если вы знаете какие-либо действительно хорошие матчи, которые не просто говорят, что «математика здесь сложна, поэтому мы не будем в нее входить, просто знайте, что это работает», я бы с удовольствием принял взгляд.
Если я это сделаю, то представление не может двигаться, потому что вращение не складывается, оно просто сбрасывает его в начало координат, просматривая отрицательную ось z всякий раз, когда камера перемещается. –
вам нужно обновить поле и заголовок, добавив 'move.x * delta' и' move.y * delta' (зажав шаг, если необходимо) –
Что вы подразумеваете под move.x и move.y? –