Opengl对象看另一个对象

时间:2014-01-30 19:30:40

标签: opengl position

我想获得对象和另一个对象之间的角度。这必须是垂直和水平角度。

我的坐标为:

posX, posY, posZ 
objectX, objectY, objectZ

我试过了:

glRotatef( atan2(objectY - posY,objectX - posX)* 180.0f / 3.14f, 0.0f, 0.0f, 1.0f );
glRotatef( atan2(objectZ - posZ,objectX - posX)* 180.0f / 3.14f, 0.0f, 1.0f, 0.0f );    

但有时候无法正常工作

1 个答案:

答案 0 :(得分:1)

严格地说,如果你只有两个“物体”,它们之间没有任何角度。你需要一个参考框架。

例如,2-D中的两个点之间没有角度。但是,如果将一个视为原点,则可能需要测量第二个点与 x轴之间的角度。

同样,在3-D中,您需要有一个参考框架。你实际上不会得到1个角度,但是2.一个角度围绕 z轴乘以2PI,第二个角度上下移动(角度来自 xy-plane )PI。查看Spherical Coordinates以获得更好的解释。

考虑到这一点,您想要:

  1. 将您的第一个对象翻译为原点。
  2. 翻译您的第二个对象。
  3. 将第二个对象的位置从笛卡尔坐标转换为球面坐标。该链接将有所帮助。
  4. 但是等等!如果您关心第一个物体的方向怎么办? EG,这是一个朝着某个方向看的角色。您可能希望该角度取决于他正在寻找的方式。如果他正好看它,你可能想要0弧度(0度),如果它在他身后,你可能想要PI弧度(180度)。

    该过程与上述过程相同,但您首先必须将第二个对象从世界空间转换为“角色”空间 - 该坐标系与第一个对象相关。它在数学上与将某些东西转换为相机空间相同。从那里只需将对象的新位置从笛卡尔坐标转换为球坐标即可获得角度。

    <强>建议

    • 不要硬π进入你的代码。使用#define,最好使用标准或广泛使用的库。
    • 不要使用固定功能管道。它已经被推荐了我认为〜8年了。它很慢而且无法定制。
    • 如果你在轮换时遇到困难,可能是因为你让OpenGL为你做这件事。管理自己的旋转矩阵。然后你就知道你在做什么了。
    • 您无论如何都不需要glRotatef找到角度。 OpenGL仅用于绘图。给定两个对象,您应该能够在不调用OpenGL的情况下找出它们之间的角度。实际上,你不应该调用OpenGL。