我对directx相当陌生,所以这可能听起来很基本。
我已经开始在第一人称游戏中工作,你可以穿过房间,我的编码语言是c++,我使用directx来帮助我创建我的游戏。
到目前为止,我已经绘制了所有带有门等的房间,但我有点卡住了如何制作第一人称摄像机,并允许用户使用键盘上的箭头键向前,向后和左右移动。
越简单越好,因为我是初学者。
谁能帮我解决这个问题,或者给我指出正确的方向?Thanks in advance
网络上有很多关于这个主题的教程,所以谷歌肯定会帮助你。
至于基础:您将需要存储您的位置和相机旋转。假设Z是你的上轴,你应该使用箭头只改变X和y。
让我们说,你将存储你的相机方向存储为沿z轴(移动方向)和X轴(向上向下看)旋转的组合。
简单的类:
class Player
{
protected:
float3 Position; // Z-up
float2 CameraRotation; // X for turning, Y for up-down
public:
void MoveForward()
{
Position.X += -cosf(CameraRotation.X) * PLAYER_SPEED;
Position.Y += -sinf(CameraRotation.X) * PLAYER_SPEED;
}
// when using any other arrow, just add a multiply of PI/2 to the camera rotation
// PI for backwards, +PI/2 for left strafe and -PI/2 for right strafe.
// If you don't want to use mouse, use left and right arrow to modify camera rotation
// and MoveForward and Backward will look the same, having different signs.
};
sinf和cost函数前面的'-'符号在那里是因为你可能想要这种行为,请随意更改它们。
至于相机,你将不得不实现帧之间的鼠标增量。在每一帧中,将鼠标位置与前一帧进行比较。然后乘以旋转和观看速度,并直接设置为相机值。
希望有帮助。
我更喜欢OpenGL,所以我不能在技术方面帮助你,我能做的是给你一个方向。
一般来说,3D相机有:
平移 -相机位置(x, y, z)
旋转 -相机绕每个轴的角度
你想做的只是翻译部分:
- 监控用户输入,并在用户按下某个方向键时进行捕捉。
- 当箭头键按下时,您要开始更改摄像机的平移。如果用户按下向上键,你就会在游戏主循环的每次迭代中为相应的相机转换组件(x)添加一个常量,直到他释放该键。如果他按下键,你会想要减去这个值而不是添加它。 当他释放键时,你的代码需要停止将该值添加到相机翻译中。
让我们假设你的游戏以60Hz的频率运行,并且你在每次迭代中为用户想要去的每个方向添加1/60单位的摄像机转换。如果用户按住向上方向键2秒,相机将向前移动2个单位。
这是一般的"理论",现在我只能指向我发现的可能对解决你的问题的技术方面有用的网页:
DirectX相机运动-我猜这篇文章有很多比你需要的,但它看起来很好,我认为你应该阅读它…但是你可以直接跳到视图转换部分。
输入处理-没什么可说的,常规的Win32输入处理。如果你不熟悉win32的输入处理,我认为你应该先花一两个小时来学习。
好了,就到这里,希望对大家有所帮助