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

Moving and Imported model along the forward Vector - DirectX11 C++

我花了很长时间试图找到创建任何导入对象的前向向量的方法,这样我就可以完成播放器控制并添加广告牌。这是一个大学项目,在该项目中,我获得了一组 GameObject class 以使用 MeshLoader 和 OBJLoader class 加载对象。 我目前正在使用 A .GetWorld(); returns 我是一个 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 到目前为止无法开始工作。如果有更多信息可以提供帮助,请告诉我!

希望这对你有所帮助。

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

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

其次,4x4 矩阵不是那样构建的,它包含合并的所有内容,你必须将它看得更像一个框架,有 3 个向量 i j k 和一个职位O。其中之一是您的前向矢量,一个向上,一个向右(或向左)。

例如 r[0].x r[1].yr[2].z 中的比例矩阵,只有当你不将它与旋转连接时,这才是正确的,之后,它将分布在整个矩阵上。