四边形的二维旋转 我正在使用C++编写一个基本的仿真程序,我有一个使用OpenGL的渲染器。我在屏幕上渲染四边形,这些四边形在模拟中具有动态位置。我的目标是在四边形在模拟中移动时更改其方向。对于每个四边形,我有一个变量(m_Rotation),它保存它的当前旋转,我使用三角学计算所需的旋转,并将值放入变量(m_ProjectedRotation)中。在渲染循环中,我使用以下代码更改运动中的方向: if(abs(m_ProjectedRotation - m_Rotation)>5.0f) { if ((360.0f - m_Rotation + m_ProjectedRotation) > (m_ProjectedRotation - m_Rotation)) { m_Rotation += 5.0f; if (m_Rotation > 360) { m_Rotation = fmod(m_Rotation, 360); } } else { m_Rotation -= 5.0f; } }

四边形的二维旋转 我正在使用C++编写一个基本的仿真程序,我有一个使用OpenGL的渲染器。我在屏幕上渲染四边形,这些四边形在模拟中具有动态位置。我的目标是在四边形在模拟中移动时更改其方向。对于每个四边形,我有一个变量(m_Rotation),它保存它的当前旋转,我使用三角学计算所需的旋转,并将值放入变量(m_ProjectedRotation)中。在渲染循环中,我使用以下代码更改运动中的方向: if(abs(m_ProjectedRotation - m_Rotation)>5.0f) { if ((360.0f - m_Rotation + m_ProjectedRotation) > (m_ProjectedRotation - m_Rotation)) { m_Rotation += 5.0f; if (m_Rotation > 360) { m_Rotation = fmod(m_Rotation, 360); } } else { m_Rotation -= 5.0f; } },c++,game-physics,C++,Game Physics,我希望四边形根据最近的角度旋转自身(例如,如果当前角度为330,目标角度为30,则四边形应增加其角度直到达到30,而不是在达到30后减少角度。因为其旋转角度较小)。在某些情况下,我的四边形会逆时针旋转,即使顺时针旋转也会缩短旋转时间,反之亦然。我相信轮换的条件是: (360.0f - m_Rotation + m_ProjectedRotation) > (m_ProjectedRotation - m_Rotation) 应该是不同的,以显示所需的行为。然而,我想不出来。如何更新此代码

我希望四边形根据最近的角度旋转自身(例如,如果当前角度为330,目标角度为30,则四边形应增加其角度直到达到30,而不是在达到30后减少角度。因为其旋转角度较小)。在某些情况下,我的四边形会逆时针旋转,即使顺时针旋转也会缩短旋转时间,反之亦然。我相信轮换的条件是:

(360.0f - m_Rotation + m_ProjectedRotation) > (m_ProjectedRotation - m_Rotation)

应该是不同的,以显示所需的行为。然而,我想不出来。如何更新此代码以获得所需内容?

我认为正确的解决方案如下:

让我们把这两个角度称为
。根据你的问题,我假设两者都是正数。有两种情况:

  • 从到的绝对距离小于180。
    这意味着从
    到-from
    的度数比从另一个方向的度数要少,这是您应该选择的方式。
    在这种情况下,您应该按
    符号(从)*deltaRotation
    旋转,其中
    符号(x)
    =1,如果x>0,则为-1。要了解sign函数的需要,请查看以下两个示例,其中
    |To-from
    <180:
    • 从=10到=20。to-from=10>0,因此应该增加旋转
    • 从=20到=10。到-from=-10<0,应该减少旋转
  • | to-from |
    大于180。在这种情况下,方向应该是相反的,并且你应该旋转
    -符号(形成)*三角旋转
    ,注意减号。您也可以将其表示为
    符号(从到)*deltaRotation
    ,将
    交换到
    ,但为了明确起见,我还是保留了它们。
    • 从=310到=10。然后,to-from=-300<0,应该增加旋转(形式上,-sign(to-from)=-sign(-300)=-1)=1)
    • 从=10到=310。然后,为了-from=300>0,应该减少旋转(形式上,-sign(to-from)=-sign(300)=-1)

在C++中编写这个函数,可以将这个逻辑封装在这样的函数中:

int shortErrorStationSign(浮点从,浮点到){
if(fabs(to-from)0-1:-1;
}
从>0返回到-1:1;
}
您将这样使用它:

m_旋转+=5.0f*短路旋转信号(m_旋转,m_投影旋转);
m_旋转=fmod(m_旋转+360,360);
最后一行的目标是规范化负角度和大于360的角度


(在我看来,这更多的是一个数学问题,而不是一个关于opengl的问题。)

我会这样做:

auto diff = abs(m_ProjectedRotation - m_Rotation);
if(diff > 5.0f)
{   
    diff = fmod(diff, 360.0f); 
    auto should_rotate_forward = (diff > 180.0f) ^ (m_ProjectedRotation > m_Rotation);
    auto offset = 360.0f + 5.0f * (should_rotate_forward ? 1.0f : -1.0f);
    m_Rotation = fmod(m_Rotation + offset, 360.0f);            
}
diff
是旋转的绝对角度。然后通过执行
diff=fmod(diff,360.0f)
使其处于[0;360]范围内

是否应向前旋转
确定是否应减小或增大当前角度。注意
^
是异或操作


offset
基本上是
-5.0
5.0
取决于条件,但也有
+360.0f
,因此如果例如
m_Rotation==1.0
offset=-5.0
so
fmod(m_Rotation+offset,360.0f)
将是
-4.0
,而您需要
356.0
,因此您添加了完整的360度旋转,在
fmod
之后,一切都是积极的,在[0;360)范围内

非常感谢。您的回答解决了问题。Opengl标记已按照您的建议从问题中删除。非常感谢您的帮助。