沿前向Vector移动和导入模型 - DirectX11 C ++

时间:2016-12-30 14:39:01

标签: c++ vector directx-11

我花了很多时间试图找出创建任何导入对象的前向矢量的方法,这样我就可以完成玩家控制并添加广告牌。这是一个大学项目,我给了一个设置GameObject类来使用MeshLoader和OBJLoader类加载对象。 我目前正在使用A .GetWorld();它返回给我一个XMFLOAT4X4,它应该给我世界上对象的数据。然后,我使用XMLoadFloat4X4将其转换为XMMATRIX,然后从该矩阵中获取每行数据到其自己的XMVECTOR中。我已经对这些进行了测试,并且相信它们的顺序是正确的,但是当我按下前进键时,我仍然遇到我的角色永远不会移动的问题。我想知道如果我做了什么完全错误或者我错过了什么。

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作为摄像机数据,这很容易做到,使用我的GameObject依赖的XMFLOAT4X4和XMMATRIX到目前为止还不可能开始工作。如果有更多信息我可以提供帮助那么请说出来!

希望这有助于你帮助我。

1 个答案:

答案 0 :(得分:0)

您想象的方式currentWorldM是完全错误的。

首先,你进行了越界访问,XMMATRIX::r只有4个元素,有效范围是[0..3]。

其次,4x4矩阵不是那样构建的,它包含所有合并的东西,你必须看到它更像一个帧,有3个向量i j k和一个位置O。其中一个是你的前向矢量,一个向上,一个向右(或左)。

比例矩阵例如在r[0].x r[1].yr[2].z中,只有在不将其与旋转连接时才会出现这种情况,之后,它将是遍布整个矩阵。