在我的opengl应用程序中,我在三维空间中有一个Bézier曲线,我想沿着它移动一个对象。一切都好,这是旋转的一部分:我在计算它们时遇到了一些问题。在我看来,这条管道应该是:
<代码>H 19推送矩阵<代码>H 210<编码>H 111位置上的平移、旋转、绘制物体代码<代码>H 113pop矩阵H 214/代码>F<215/代码>>
但它并没有像我预期的那样进行:旋转似乎是随机的,而且不遵循曲线。有什么建议吗?
发布于 2011-06-05 16:16:22
与其计算角度,不如将框架推入模型视图矩阵。在矩阵的左上角3x3处有正规的、二次的和切的go,在第四列中平移,元素4,4是1。用前面提到的毕晓普框架代替法国框架。所以在代码中:
// assuming you manage your curve in a (opaque) struct Bezier
struct BezierCurve;
typedef float vec3[3];
void bezierEvaluate(BezierCurve *bezier, float t, vec3 normal, vec3 binormal, vec3 tangent, vec3 pos);
void apply_bezier_transform(Bezier *bezier, float t)
{
float M[16]; // OpenGL uses column major ordering
// and this code is a excellent example why it does so:
bezierEvaluate(bezier, t, &M[0], &M[4], &M[8], &M[12]);
M[3] = M[7] = M[11] = 0.;
M[15] = 1.;
glMultMatrixf(M);
}发布于 2011-06-05 15:45:31
你会遇到法国框架的问题,因为不幸的是,当曲线是瞬间直线(有消失的曲率)的时候,它是不确定的,它在密切平面的法线在方向上有很大变化的点周围出现剧烈的摆动,特别是在拐点,在那里法线翻转。
我建议使用所谓的毕晓普框架(你可以谷歌它,并找到如何计算它在一个离散的设置)。它也被称为平行传输帧或最小旋转框架-它的优点是,框架总是定义,它改变方向的控制方式。
我不认为法语框架的问题一定能解释你遇到的问题。您应该从一些简单的测试案例开始--例如,限制在XY平面上的Bezier曲线,然后逐步进行计算,直到找到问题所在。
https://stackoverflow.com/questions/6243693
复制相似问题