我正在尝试一个车辆跟随伯努利的 Lemniscate(或更简单地说,8 字形轨道)的练习。我想使用glTranslatef
并glRotatef
实现这一点。到目前为止,我已经能够通过使用如下参数形式成功地让车辆沿着这条路径跟随/平移:
X = (width * cos(t)) / (1+sin^2(t))
Y = (width * cos(t) * sin(t)) / (1+sin^2(t))
其中 t 是在 -pi, pi
在代码中,如下所示:
carX = (float) ((Math.cos(t) / (1 + Math.sin(t)*Math.sin(t))));
carY = 0.0f;
carZ = (float) ((Math.cos(t) * (Math.sin(t))) / (1 + Math.sin(t)*Math.sin(t)));
gl.glTranslatef(carX,carY,carZ);
所以效果很好。我现在的问题是旋转车辆,使其遵循伯努利 Lemniscate 定义的路径。我想通过glRotatef
绕 Y 轴旋转来实现这一点,但我不确定如何继续寻找要输入的角度glRotatef
。旋转目前已经到位,因此它只操纵车辆,并且似乎只需要正确的数学来跟随路径。
我尝试过的事情:
- 使用上面列出的 X 和 Y 形式的导数。我彼此独立使用它们,因为我不确定如何/是否需要将它们组合用于角度。通过一些小的操作,它们跟随原点附近的直线区域,但在曲线周围分解。
- 直接求t值的正切并转换成度数。导致不稳定的旋转。
如果有人有任何可能比 glRotatef 方法更好的建议,那也将不胜感激。我已经看到这gluLookAt
可能会有所帮助,我可能会尝试使用它找到解决方案。
(注意:我正在使用 Java 和 FFP 在 JOGL 中工作,但我对 C/C++ 代码片段感到满意。)