水平翻转角度

时间:2009-09-03 07:01:22

标签: math opengl angle

我想知道一种在水平轴上翻转角度的方法,而不必做很多操作。假设我的角度为0(在我的代码的坐标系中“向右”),翻转的角度应为180(指向左侧)。如果90(向上),翻转它应该仍然是90. 89是91,依此类推。 我可以根据角度暗示的X / Y速度进行操作,但这会减慢速度,我觉得这不是正确的方法。 我不太了解数学,所以我可能用错误的名字来称呼事情......任何人都可以帮忙吗?

编辑:对不起,我花了很长时间,我不得不长时间离开电脑,好吧...... http://img215.imageshack.us/img215/8095/screenshot031v.jpg

这个截图可能会这样做。上面的结构是两颗卫星和一条连接到中心白点的光束。这两颗卫星应该继承白点的角度(它可以用于调试目的),所以如果它的目标是一个角度,它们就会跟随。左边的卫星是镜像的,所以我按照建议的180角计算它,虽然这也是我的第一次尝试。正如您所看到的那样,它不是镜像的,而是翻转的。当白点旋转时,它会向后旋转。另一个没问题。

这是与其他内容相关联的内容的角度重新计算,pid是父节点,id是当前节点。 pin.ang是当对象链接到另一个时复制的角度偏移,因此它在旋转时保持位置:

if(object[id].mirror)
    object[id].angle = 180 - (object[id].pin.ang + object[pid].angle);
else
    object[id].angle = object[id].pin.ang + object[pid].angle;

这是具体的旋转部分。 OpenGL的。 offx / y用于偏离中心旋转的东西,就像即将出现的光束一样,它使其他一切正确。

glTranslatef(list[index[i]].x, list[index[i]].y, 0);
glRotatef(list[index[i]].angle, 0.0, 0.0, 1.0);
glTranslatef(list[index[i]].offx, -list[index[i]].offy, 0);

当旋转速度(每次重绘到当前角度时添加一个整数,顺时针旋转时为正)时,旋转似乎也会错过,如下一个: http://img216.imageshack.us/img216/7/screenshot032ulr.jpg

所以它绝对不是180度角,尽管它有多么明显。仅通过反转纹理坐标来完成镜像,因此它不会影响角度。我担心这可能是GL轮换的一个怪癖。

7 个答案:

答案 0 :(得分:10)

反映的数量(只是看数学)将是(180 - angle)

Angle | Reflection
------+-----------
    0 |        180
   90 |         90
   89 |         91
   91 |         89
  360 |       -180
  270 |        -90

如果你落在“水平面”之下,请注意底片 - 你可以保留原样,或作为特殊情况处理。

答案 1 :(得分:3)

不是吗

结果= 180-(你的角度)

答案 2 :(得分:2)

如前所述,您可以通过从180度减去角度来找到相反的角度。例如:

180 - yourangle

直接操纵X / Y速度不会非常麻烦。您只需将X速度的方向反转为减1,例如:speedx = (-1) * speedx。这将改变左右方向,例如:向左移动的东西将开始向右移动,反之亦然,垂直速度将不受影响。

如果您使用正弦/余弦(sin / cos)重新计算X / Y速度分量,那么*(-1)方法可能会更有效。最终,它取决于您的程序的上下文。如果您正在寻找更好的解决方案,请通过更多详细信息更新您的问题。

答案 3 :(得分:0)

Aah,似乎问题来自负数,毕竟我确保它们是积极的,现在旋转很好,我甚至不需要重新计算角度...... 感谢大家,由于每一个回复,我最终都搞清楚了。

答案 4 :(得分:0)

逆时针旋转到顺时针(右侧270->右侧90)

angle - 360

-

垂直翻转(顶部为180-> 0/360为顶部)

Math.Normalize(angle - 180)

-

两者:

float flipped_vertical = angle - 360 float flipped_vertical_and_horizontal = Math.Normalize(flipped_vertical- 180)

答案 5 :(得分:0)

此解决方案适用于-Y定向角度(如手表)!对于+ X方向(例如学校数学),您需要交换X和Y。

public static float FlipAngleX(float angle)
{
    angle = NormalizeAngle(angle);

    angle = TwoPi - angle;

    return angle;
}

public static float FlipAngleY(float angle)
{
    angle = NormalizeAngle(angle);

    if (angle < Pi)
    {
        angle = Pi - angle;
    }
    else
    {
        angle = TwoPi - angle + Pi;
    }
    return angle;
}

/// <summary>
/// Keeps angle between 0 - Two Pi
/// </summary>
public static float NormalizeAngle(float angle)
{
    if (angle < 0)
    {
        int backRevolutions = (int)(-angle / TwoPi);
        return angle + TwoPi * (backRevolutions + 1);
    }
    else
    {
        return angle % TwoPi;
    }
}

答案 6 :(得分:-1)

只是360-angle会翻转你的视角而不是垂直