我正在编写一个程序,可以沿着样条曲线绘制实体。我使用的是Visual Studio 2005,在C++中为OpenGL编写代码。我使用FLTK打开窗口(快速且轻量级的工具包)。
目前,我有一个算法,可以通过将控制点之间的区间分成子区间,并在这些子点之间绘制线段,来绘制Cardinal Cubic Spline。子区间的数量是可变的。
绘制线段的代码非常出色,基本上是这样的:我使用样条方程生成一组沿着样条曲线的点,并将它们存储在一个数组中(作为名为Pnt3f的特殊数据结构,其中坐标是3个浮点数,并且有一些方便的函数,如距离、长度、点积和叉积)。然后,我有一个循环遍历点数组,并按如下方式绘制它们:
我的问题是如何获得点之间的角度。我只需要偏航角和俯仰角,滚转角并不重要。我知道,将两个点的点积除以两个点的大小所得到的反余弦值将返回它们之间的角度,但这不是我可以输入OpenGL进行旋转的内容。我尝试在2D中执行此操作,使用XZ平面获取x旋转,并使点向量从原点开始,但它没有返回正确的角度。
我的当前方法要简单得多。对于每个旋转平面(X和Y),通过以下方式找到角度:
反余弦值(“x”值的差异/点之间的距离)
“x”值取决于您如何设置平面,但对于我的计算,我总是使用世界x。
除了一些绘制在我还没有解决的正确象限的问题之外,我想寻求建议,看看这是否是一个好的实现,或者是否有更好的方法。
目前,我有一个算法,可以通过将控制点之间的区间分成子区间,并在这些子点之间绘制线段,来绘制Cardinal Cubic Spline。子区间的数量是可变的。
绘制线段的代码非常出色,基本上是这样的:我使用样条方程生成一组沿着样条曲线的点,并将它们存储在一个数组中(作为名为Pnt3f的特殊数据结构,其中坐标是3个浮点数,并且有一些方便的函数,如距离、长度、点积和叉积)。然后,我有一个循环遍历点数组,并按如下方式绘制它们:
glBegin(GL_LINE_STRIP);
for(pt = 0; pt<=numsubsegements ; ++pt) {
glVertex3fv(pt.v());
}
glEnd();
如上所述,这段代码运行得很好。现在我想做的是,不再画一条线,而是挤出一个实体。我的当前尝试是使用“圆柱”四面体创建沿着线的管道。这有点棘手,因为我必须将openGL定向到我想要绘制圆柱体的方向。我的想法是这样做:
伪代码:
Push the current matrix,
translate to the first control point
rotate to face the next point
draw a cylinder (length = distance between the points)
Pop the matrix
repeat
我的问题是如何获得点之间的角度。我只需要偏航角和俯仰角,滚转角并不重要。我知道,将两个点的点积除以两个点的大小所得到的反余弦值将返回它们之间的角度,但这不是我可以输入OpenGL进行旋转的内容。我尝试在2D中执行此操作,使用XZ平面获取x旋转,并使点向量从原点开始,但它没有返回正确的角度。
我的当前方法要简单得多。对于每个旋转平面(X和Y),通过以下方式找到角度:
反余弦值(“x”值的差异/点之间的距离)
“x”值取决于您如何设置平面,但对于我的计算,我总是使用世界x。
除了一些绘制在我还没有解决的正确象限的问题之外,我想寻求建议,看看这是否是一个好的实现,或者是否有更好的方法。