C++ 直接xc++;摄像机运动

C++ 直接xc++;摄像机运动,c++,camera,directx,game-development,C++,Camera,Directx,Game Development,我对directx相当陌生,所以这听起来可能非常基本 我已经开始了一个第一人称游戏,你可以在房间里走动,我所用的语言是C++,我用DirectX帮助我创建游戏。p> 到目前为止,我已经绘制了所有房间的门等,但我有点卡住了如何制作第一人称相机,并允许用户使用键盘上的箭头键前后左右移动 越简单越好,因为我是初学者 谁能帮我解决这个问题,或者给我指出正确的方向 提前感谢我更喜欢OpenGL,所以我无法在技术方面帮助你,我能做的就是给你一个方向 通常,3D相机具有以下功能: 平移-摄像机所在位置(x、y

我对directx相当陌生,所以这听起来可能非常基本

我已经开始了一个第一人称游戏,你可以在房间里走动,我所用的语言是C++,我用DirectX帮助我创建游戏。p> 到目前为止,我已经绘制了所有房间的门等,但我有点卡住了如何制作第一人称相机,并允许用户使用键盘上的箭头键前后左右移动

越简单越好,因为我是初学者

谁能帮我解决这个问题,或者给我指出正确的方向


提前感谢

我更喜欢OpenGL,所以我无法在技术方面帮助你,我能做的就是给你一个方向

通常,3D相机具有以下功能:

平移-摄像机所在位置(x、y、z)

旋转-摄像机围绕每个轴的角度

您要做的仅与翻译部分相关:

  • 监视用户输入,并在用户按下其中一个箭头键时进行捕获
  • 当箭头键按下时,您希望开始更改相机平移。如果用户按下向上键,则在主游戏循环的每次迭代中,您都会向相应的摄影机平移组件(x)添加一个常量值,直到用户释放该键为止。如果他按下向下键,你会想减去该值,而不是将其相加
  • 当他释放键时,您的代码需要停止向摄影机平移添加该值
  • 让我们假设你的游戏以60Hz的频率运行,并且你在每次迭代中为用户想要去的每个方向向相机平移添加1/60个单位。如果用户按住向上箭头键2秒钟,相机将向前移动2个单位

    这是一般的“理论”,现在我只能指出我发现可能对解决问题的技术方面有用的网页:

    -我猜这篇文章比你需要的要多得多,但它看起来相当不错,我认为你无论如何都应该阅读它。。。但是您可以直接跳到视图转换部分

    -没什么可说的,常规Win32输入处理。如果您不熟悉win32输入处理,我认为您应该先花一两个小时来学习


    好了,就这样,希望我帮了你

    我更喜欢OpenGL,所以我不能在技术方面帮你,我能做的就是给你一个方向

    通常,3D相机具有以下功能:

    平移-摄像机所在位置(x、y、z)

    旋转-摄像机围绕每个轴的角度

    您要做的仅与翻译部分相关:

  • 监视用户输入,并在用户按下其中一个箭头键时进行捕获
  • 当箭头键按下时,您希望开始更改相机平移。如果用户按下向上键,则在主游戏循环的每次迭代中,您都会向相应的摄影机平移组件(x)添加一个常量值,直到用户释放该键为止。如果他按下向下键,你会想减去该值,而不是将其相加
  • 当他释放键时,您的代码需要停止向摄影机平移添加该值
  • 让我们假设你的游戏以60Hz的频率运行,并且你在每次迭代中为用户想要去的每个方向向相机平移添加1/60个单位。如果用户按住向上箭头键2秒钟,相机将向前移动2个单位

    这是一般的“理论”,现在我只能指出我发现可能对解决问题的技术方面有用的网页:

    -我猜这篇文章比你需要的要多得多,但它看起来相当不错,我认为你无论如何都应该阅读它。。。但是您可以直接跳到视图转换部分

    -没什么可说的,常规Win32输入处理。如果您不熟悉win32输入处理,我认为您应该先花一两个小时来学习


    好了,就这样,希望我能帮上忙,网上有很多教程介绍这个话题,所以谷歌肯定会帮你的

    至于基本知识:您需要存储您的位置和相机旋转。假设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和cosf函数前面的“-”符号在那里,因为您可能想要这种行为,请随意更改它们

    至于相机,你必须在帧之间实现鼠标三角。在每一帧中,将鼠标位置与前一帧进行比较。然后通过旋转和观察速度将其相乘,并直接设置为摄影机值


    希望这能有所帮助。

    网络上有很多关于这个主题的教程,所以谷歌肯定会帮助你

    至于基本知识:您需要存储您的位置和相机旋转。假设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和cosf函数前面的“-”符号在那里,因为您可能想要这种行为,请随意更改它们

    至于相机,你必须在帧之间实现鼠标三角。在每一帧中,将鼠标位置与前一帧进行比较。然后通过旋转和观察速度将其相乘,并直接设置为摄影机值

    希望这有帮助。

    你可以从这里开始:你可以从这里开始:谢谢你的帮助:)我要读你发表的文章,看看我进展如何:)谢谢你的帮助:)我要读你发表的文章,看看我进展如何