尝试使用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...
答案 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
在该章中向下移动到查看和建模转换标题,您将轻松找出如何回答您的问题。