2016-12-30 7 views
1

Я потратил годы, пытаясь разработать способ создания векторного вектора любого импортированного объекта, чтобы я мог закончить элементы управления игроков, а также добавить афишу. Это для университетского проекта, где мне был предоставлен класс GameObject для загрузки в объекты с использованием класса MeshLoader и OBJLoader. В настоящее время я использую A .GetWorld(); который возвращает мне XMFLOAT4X4, который должен дать мне данные объекта в мире. Затем я конвертирую его в XMMATRIX с помощью XMLoadFloat4X4, а затем захватываю каждую строку данных из этой матрицы в свой собственный XMVECTOR. Я проверил их и верю, что они находятся в правильном порядке, но у меня все еще проблема с тем, что мой персонаж никогда не двигается, когда я нажимаю клавишу «вперед». Я задавался вопросом, если я делаю что-то совершенно неправильное или я просто что-то пропустил.Движущаяся и импортированная модель вдоль вперед Vector - DirectX11 C++

else if (GetAsyncKeyState(VK_UP)) 
{ 
    XMFLOAT4X4 currrentWorld = _zaz.GetWorld(); 
    XMMATRIX currentWorldM = XMLoadFloat4x4(&currrentWorld); 

    XMVECTOR scale = currentWorldM.r[1]; 
    XMVECTOR rotation = currentWorldM.r[2]; 
    XMVECTOR translation = currentWorldM.r[3]; 
    XMVECTOR forward = currentWorldM.r[4]; 

    forward = XMVector3Normalize(forward); 

    translation = XMVectorAdd(translation, forward); 

    newWorld = XMMATRIX(scale, rotation, translation, forward); 

    _zaz.SetWorld(&newWorld); 
    _zaz.UpdateWorld(); 
} 

Другая проблема заключается в том, что «_zaz.UpdateWorld(); кажется, работает только внутри моего метода обновления, несмотря на то, что все элементы управления клавиатурой проверяются при обновлении.

void GameObject::UpdateWorld() 
{ 
    XMMATRIX scale = XMLoadFloat4x4(&_scale); 
    XMMATRIX rotate = XMLoadFloat4x4(&_rotate); 
    XMMATRIX translate = XMLoadFloat4x4(&_translate); 

    XMStoreFloat4x4(&_world, scale * rotate * translate); 
} 

void GameObject::SetWorld(XMMATRIX* world) 
{ 
    XMStoreFloat4x4(&_world, *world); 
} 

Это, безусловно, чтение в значениях, я получаю игру, чтобы разорвать на клавишу «вверх» нажат, который должен запустить приведенный выше код. Все значения установлены. Машина в настоящее время вращается, и если я слегка повернуте автомобиль, а затем сломаю игру, изменится только поворот и форвардные векторы, что должно быть в порядке?

The watch of all of the vectors after the second iteration of the elseif keypressed up code is called

Если у вас есть какие-либо идеи, что помогло бы в широком масштабе.

Я предположил, что это было бы похоже на:

else if (GetAsyncKeyState(VK_CONTROL)) 
{ 
    XMFLOAT4 position = _cameraFree.GetEye(); 
    XMFLOAT4 direction = _cameraFree.GetForward(); 

    position.x -= (direction.x * 0.05f); 
    position.y -= (direction.y * 0.05f); 
    position.z -= (direction.z * 0.05f); 

    _cameraFree.SetEye(position); 
    _cameraFree.CalculateViewProjection(); 
} 

который использует XMFLOAT4 для данных камер, что было легко сделать, С XMFLOAT4X4-х и XMMATRIX о том, что мой GameObject полагаться на него до сих пор было невозможно добраться до работы. Если больше информации, которую я могу предоставить, чтобы помочь, пожалуйста, скажите!

Надеюсь, это поможет вам помочь.

+0

Я забыл добавить, что _zaz - это GameObject, который я хочу перемещать по сцене. –

+0

Не переписываете переменную '_world' в' UpdateWorld'? Вы пересчитываете это «с нуля», полностью игнорируя то, что было установлено через «SetWorld»? – UnholySheep

+0

Ну, что меня смущает, UpdateWorld создает мировую матрицу из SetTransition, SetRotation и SetScale, которые все принимают только по 3 поплавков для (X, Y, Z) для каждого –

ответ

0

То, как вы представляете, currentWorldM совершенно неверно.

Во-первых, вы вне пределов доступного доступа, XMMATRIX::r - всего 4 элемента, допустимый диапазон - [0..3].

Во-вторых, матрица 4х4 строится не так, она содержит все слилось, вы должны увидеть это больше похоже на кадр, с 3-х векторов ijk и положение O. Один из них - ваш передний вектор, один вверх и один правый (или слева).

Масштабная матрица, например, в r[0].xr[1].y и r[2].z, и это верно только до тех пор, пока вы не сцепить его с вращением, после этого, он будет распространяться по всей матрице.

+0

Я полностью пропустил точку, находясь между [0,3], и мне просто нужно сделать еще несколько исследований о том, как работает XMMATRIX! Но спасибо за ответ –

+0

Возможно, вы захотите взглянуть на обертку [SimpleMath] (https://github.com/Microsoft/DirectXTK/wiki/SimpleMath) для DirectXMath. –