沿前向向量移动和导入模型 - 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].y
和 r[2].z
中的比例矩阵,只有当你不将它与旋转连接时,这才是正确的,之后,它将分布在整个矩阵上。
我花了很长时间试图找到创建任何导入对象的前向向量的方法,这样我就可以完成播放器控制并添加广告牌。这是一个大学项目,在该项目中,我获得了一组 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].y
和 r[2].z
中的比例矩阵,只有当你不将它与旋转连接时,这才是正确的,之后,它将分布在整个矩阵上。