我花了很多时间试图找出创建任何导入对象的前向矢量的方法,这样我就可以完成玩家控制并添加广告牌。这是一个大学项目,我给了一个设置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);
}
这绝对是在阅读价值观,我让游戏突破了按下的“向上”键,它应该运行上面的代码。所有值都已设置。汽车当前正在旋转,如果我稍微旋转汽车然后打破游戏,只有旋转和前进矢量发生变化,这应该没问题?
如果你有任何想法,那将会有很大的帮助。
我认为它类似于:
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到目前为止还不可能开始工作。如果有更多信息我可以提供帮助那么请说出来!
希望这有助于你帮助我。
答案 0 :(得分:0)
您想象的方式currentWorldM
是完全错误的。
首先,你进行了越界访问,XMMATRIX::r
只有4个元素,有效范围是[0..3]。
其次,4x4矩阵不是那样构建的,它包含所有合并的东西,你必须看到它更像一个帧,有3个向量i
j
k
和一个位置O
。其中一个是你的前向矢量,一个向上,一个向右(或左)。
比例矩阵例如在r[0].x
r[1].y
和r[2].z
中,只有在不将其与旋转连接时才会出现这种情况,之后,它将是遍布整个矩阵。