c – 如何在相机朝向的方向上正确移动相机

c – 如何在相机朝向的方向上正确移动相机,第1张

概述我正在试图弄清楚如何根据它面向的方向使相机直接移动. 现在我移动相机的方法是将相机的当前位置和旋转传递给名为PositionClass的类. PositionClass从另一个名为InputClass的类中获取键盘输入,然后更新摄像机的位置和旋转值,然后将其传递回摄像机类. 我写了一些看起来对我很有用的代码,使用摄像机俯仰和偏航我能够让它朝着我指向相机的方向前进. 但是,当摄像机直视(俯仰= 90 我正在试图弄清楚如何根据它面向的方向使相机直接移动.

现在我移动相机的方法是将相机的当前位置和旋转传递给名为positionClass的类. positionClass从另一个名为inputClass的类中获取键盘输入,然后更新摄像机的位置和旋转值,然后将其传递回摄像机类.

我写了一些看起来对我很有用的代码,使用摄像机俯仰和偏航我能够让它朝着我指向相机的方向前进.

但是,当摄像机直视(俯仰= 90)或垂直向下(俯仰= -90)时,它仍然会改变摄像机X和Z的位置(取决于偏航).

预期的行为是直视或向下看,它只会沿Y轴移动,而不是沿X轴或Z轴移动.

这是计算新摄像机位置的代码

voID positionClass::MoveForward(bool keydown){float radiansY,radiansX;// Update the forward speed movement based on the frame time// and whether the user is holding the key down or not.if(keydown){    m_forwardSpeed += m_frameTime * m_acceleration;    if(m_forwardSpeed > (m_frameTime * m_maxSpeed))    {        m_forwardSpeed = m_frameTime * m_maxSpeed;    }}else{    m_forwardSpeed -= m_frameTime * m_friction;    if(m_forwardSpeed < 0.0f)                                                                   {        m_forwardSpeed = 0.0f;    }}// Toradians() just multiplIEs degrees by 0.0174532925fradiansY = Toradians(m_rotationY); //yawradiansX = Toradians(m_rotationX); //pitch// Update the position.m_positionX += sinf(radiansY) * m_forwardSpeed;m_positionY += -sinf(radiansX) * m_forwardSpeed;m_positionZ += cosf(radiansY) * m_forwardSpeed;return; }

重要部分是最后更新位置的位置.

到目前为止,我只能推断出我有可怕的数学技能.

那么,任何人都可以帮我解决这个难题吗?我创建了一个fiddle以帮助测试数学.

编辑:小提琴使用我在MoveForward函数中使用的相同数学,如果你将音高设置为90你可以看到Z轴仍然被修改

解决方法 感谢Chaosed0的回答,我能够找出正确的公式来计算特定方向的运动.

下面的固定代码与上面的基本相同,但现在已经简化和扩展,以便更容易理解.

首先我们确定相机移动的量,在我的情况下这是m_forwardSpeed,但在这里我将它定义为偏移.

float offset = 1.0f;

接下来,您将需要获取相机的X和Y旋转值(以度为单位!)

float pitch = camera_rotationX;float yaw   = camera_rotationY;

然后我们将这些值转换为弧度

float pitchRadian = pitch * (PI / 180); // X rotationfloat yawRadian   = yaw   * (PI / 180); // Y rotation

现在我们在这里确定新职位:

float newPosX = offset *  sinf( yawRadian ) * cosf( pitchRadian );float newPosY = offset * -sinf( pitchRadian );float newPosZ = offset *  cosf( yawRadian ) * cosf( pitchRadian );

请注意,我们只将X和Z位置乘以pitchRadian的余弦值,这是为了在相机直视(90)或直线向下(-90)时消除相机偏航的方向和偏移.

最后,你需要告诉你的相机新的位置,我不会介绍,因为它在很大程度上取决于你如何实现你的相机.显然这样做是不合时宜的,可能效率低下.然而,正如Chaosed0所说,这对我来说是最有意义的!

总结

以上是内存溢出为你收集整理的c – 如何在相机朝向的方向上正确移动相机全部内容,希望文章能够帮你解决c – 如何在相机朝向的方向上正确移动相机所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1215027.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存