【发布时间】:2017-09-04 22:59:41
【问题描述】:
我正在尝试做的是制作一个旋转一定度数的二维对象,例如 A 度,旋转以面对鼠标,其从该对象的方向是 B 度。这是在 openGl 中。
我已经能够使用 glRotatef 函数立即旋转对象,但我不想做的是能够在一定秒数内控制旋转。
我使用了两种增加或减少旋转的方法:
void GameObject::increaseRot(int millis) {
rotation += getRotDeg(millis);
}
void GameObject::decreaseRot(int millis) {
rotation -= getRotDeg(millis);
}
double GameObject::getRotDeg(int millis) {
double rot = 360 / this->rotSpeed;
rot = rot * millis / 1000.0;
return rot;
}
Millis 来自一个正常工作的计时器,因此我可以让一个物体以每 rotSpeed 秒 360 度的速度旋转。
编辑:我在互联网上找到了一个解决方案,似乎大部分都有效。用我自己的代码使用那个解决方案的公式,代码是
shortest_angle=((((end - start) % 360) + 540) % 360) - 180;
/* check which way to rotate
* this part of the code appears to work fine, all it does is
* rotate a certain number of degrees, it's my code that I've been
* using the whole time
*/
if(rotateA < 0)
game.getPlayer().decreaseRot(deltaT);
else if(rotateA > 0)
game.getPlayer().increaseRot(deltaT);
但是,在某些值下,代码仍然需要更长的路径,我不知道为什么。 . .
我注意到这种情况的价值是:
45 trying for 135
225 trying for 315
315 trying for 45
当然,这些是近似值,这些区域周围的任何值都会搞砸。我一直认为这与限制 90、180、270 和 360/0 有关,但我无法弄清楚实际问题是什么。
【问题讨论】:
-
我无法引导您完成它,但如果您还没有找到它,您可能想查看
slerp- 球面线性插值。 -
我考虑过看 slerp,但像这样的东西,以及四元数,现在对我来说有点难以理解。我尝试在统一上使用它们,但成功有限,但我在网上找到的解决方案(上图)非常接近正常工作,我希望我能以某种方式修复它
标签: c++ rotation interpolation angle