2014-11-05 1 views
0

Я делаю игру с некоторыми друзьями. В настоящий момент мы пытаемся заставить элементы управления работать так, как они должны, т. Е. 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) 

Как бы идти о применении матричных преобразований в глобальном пространстве?

О, а также если вы знаете какие-либо действительно хорошие матчи, которые не просто говорят, что «математика здесь сложна, поэтому мы не будем в нее входить, просто знайте, что это работает», я бы с удовольствием принял взгляд.

ответ

0

Это все о порядке работы:

  • Vmodel, это то, что вы получаете от сетки

  • Vworld, это то, что вы получаете, когда вы делаете MatModel*Vmodel; это положение вершины в мире

  • Vcamera, это то, что вы получаете, когда делаете MatView*Vworld = MatView*MatModel*Vmodel; это положение относительно камеры перед проекции применяется

  • Vscreen, это в конечном итоге положение на экране после того, как вы применить матрицу проекции: MatProj*Vcamera=MatProj*MatView*Vworld = MatProj*MatView*MatModel*Vmodel;

Вместе MatProj*MatView*MatModel матрица MVP вы слышишь так много.

Чтобы переместить камеру влево, вы должны умножить матрицу просмотра на матрицу перемещения, которая переходит в положительное направление X или в вектор преобразования в правый вектор камеры.

Для стандартной камеры заголовка в стиле FPS (вверх всегда к небу) вы воссоздаете всю матрицу при изменении заголовка или тона.

MatView = xrotate(pitch)*yrotate(heading)*translate(-cameraPos); 
+0

Если я это сделаю, то представление не может двигаться, потому что вращение не складывается, оно просто сбрасывает его в начало координат, просматривая отрицательную ось z всякий раз, когда камера перемещается. –

+0

вам нужно обновить поле и заголовок, добавив 'move.x * delta' и' move.y * delta' (зажав шаг, если необходимо) –

+0

Что вы подразумеваете под move.x и move.y? –