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

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

本文关键字:模型 导入 DirectX11 C++ 移动      更新时间:2023-10-16

我花了很长时间试图找出创建任何导入对象的前向向量的方法,这样我就可以完成玩家控件并添加广告牌。这是针对一个大学项目,其中我得到了一个设置的游戏对象类,以使用 MeshLoader 和 OBJLoader 类加载到对象中。 我目前正在使用 A .获取世界();它返回我一个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。更新世界();似乎只能在我的更新方法中工作,即使更新时检查了所有键盘控件。

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);
}

它肯定是在读取值,我让游戏在按下应该运行上述代码的键"向上"时中断。设置所有值。汽车当前确实在旋转,如果我稍微旋转汽车然后破坏游戏,只有旋转和前进矢量会发生变化,哪个应该没问题?

在elseif 键按下代码的第二次迭代之后,所有向量的监视被调用

如果您有任何想法,它将有很大帮助。

我假设它将类似于:

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到目前为止还无法开始工作。如果还有我可以提供帮助的信息,请说!

希望这对你有帮助。

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

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

其次,4x4 矩阵不是这样构建的,它包含合并的所有内容,您必须将其视为更像一个框架,ijk3 个向量和一个位置O。其中一个是你的前向向量,一个向上,一个向右(或向左)。

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