C ++ OpenGL Line在其轴上旋转

时间:2014-04-18 22:48:23

标签: c++ opengl

尝试使用glRotatef在他们自己的轴上转动线条,就像钻头一样,但无法弄明白。

|   (p2).__________.(p3)
|       /  ^-line2
|      /
|     /<--line1
|    /
|   /
|  .(p1)
|_______________

无论角线1处于什么角度,我都希望第2行绕第1行旋转。

使用OpenGLs glRotatef(),p2和p3围绕p1旋转。

我用于ines的变量。

 struct Line{
     float x,y,z, angle,length;
     int parent;
  };
  vector<Line>line;
  //Read file set everthing for lines...

2 个答案:

答案 0 :(得分:1)

首先你需要翻译第2行,以便(p2)在旋转之前位于原点,因为你实际想要做的是围绕(p2)的枢轴线2。

然后,您需要定义旋转轴,这基本上是(p2-p1)并将在glRotatef (...)中形成x,y,z参数。

之后,围绕所述轴旋转一些角度,最后将线条转换回原始位置。

您的解决方案可能如下所示:

//
// Draw Line 1
//

float rX, rY, rZ;

rX = p2.x - p1.x;
rY = p2.y - p1.y;
rZ = p2.z - p1.z;

glPushMatrix   ();

  glTranslatef (        p2.x,  p2.y,  p2.z);
  glRotatef    (angle,    rX,    rY,   rZ );
  glTranslatef (       -p2.x, -p2.y, -p2.z);

  //
  // Draw Line 2
  //

glPopMatrix    ();

在你得到错误的想法并告诉我反过来之前,请记住OpenGL使用列主矩阵和后乘法。这意味着有效的顺序转换应用于从底部到顶部的实际读取。矩阵运算仍然按照写入的顺序进行,由于GL实现矩阵乘法的方式,数学运算有点违反直觉。

此外,计算旋转轴时p2和p1的顺序很重要,因为如果反转它们,则会反转顺时针/逆时针方向。因此,如果您的钻头旋转方向错误,您应该知道为什么;)

答案 1 :(得分:0)

您可以使用C ++完成所有数学运算,也可以使用OpenGL内部的矩阵(glTranslatef,glRotatef等)。

请记住 - 这些函数(glTranslatef和glRotatef)已弃用,并且不再是使用OpenGL的正确方法。目前,正确的方法是获得一个c ++数学库,并自己计算矩阵。然后将它们发送到着色器。这很难学,但你以后会感谢你自己。


如果您想使用简单的数学计算您的旋转,只需打破一些典型的三角公式,并计算每条线的点的位置。然后绘制线条。

或者,要使用(不推荐使用的函数)OpenGL,请阅读glTranslatef和glRotatef的工作原理。这一切都在OpenGL红皮书中有所涉及。

http://www.glprogramming.com/red/chapter03.html

在该章中向下移动到查看和建模转换标题,您将轻松找出如何回答您的问题。