2

我正在尝试一个车辆跟随伯努利的 Lemniscate(或更简单地说,8 字形轨道)的练习。我想使用glTranslatefglRotatef实现这一点。到目前为止,我已经能够通过使用如下参数形式成功地让车辆沿着这条路径跟随/平移:

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++ 代码片段感到满意。)

4

1 回答 1

1

假设相机视图是驾驶员的视图,gluLookAt这正是您所需要的!根据您的carX,carY,carZ计算(假设数学很好),您可以存储以前的值并使用它:

//globals & imports:
import javax.vecmath.*;

Vector3f current = new Vector3f();
Vector3f prev = new Vector3f();

计算如下:

//on drawing:
prev.set(current);
current.x = (float) ((Math.cos(t) / (1 + Math.sin(t)*Math.sin(t))));
current.z = (float) ((Math.cos(t) * (Math.sin(t))) / (1 + Math.sin(t)*Math.sin(t)));

glu.gluLookAt(current.x, 0f, current.z,
              current.x - prev.x, 0f, current.z - prev.z,
              0f, 1f, 0f);

我回家后会对其进行测试,以确保它正常工作,但据我所知,这应该可以解决问题。

于 2012-12-02T07:35:01.907 回答