我正在尝试一种练习,其中车辆遵循Lemniscate of Bernoulli(或更简单地说是8字形轨道)。我想使用glTranslatefglRotatef来实现这一点。到目前为止,通过使用以下参数形式,我已经能够成功使车辆沿着此路径进行跟踪/平移:


  X =(宽度* cos(t))/(1 + sin ^ 2(t))
  Y =(宽度* 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);


这样就足够好了。我现在的问题是旋转车辆,使其遵循伯努利刑法规定的路径。我想通过使用glRotatef绕Y轴旋转来实现此目的,但是我不确定如何找到在glRotatef中输入的角度。旋转当前处于适当的位置,因此它仅能操纵车辆,并且似乎只需要正确的数学就可以遵循该路径。

我尝试过的事情:


使用上面列出的X和Y形式的导数。我彼此独立使用它们,因为我不确定如何/是否需要组合它们以用于角度。跟一些
轻微的操纵,他们沿着原点附近的直线区域前进,
但在弯道附近破裂了。
直接找到切线的切线
t值并转换为度。结果不稳定。


如果有人有任何建议可能比glRotatef方法更好,那么也将不胜感激。我已经看到了gluLookAt may be helpful,并且我可能会尝试使用该解决方案。

(注意:我正在使用Java和FFP在JOGL中工作,但对C / C ++代码段感到满意。)

最佳答案

假设摄像机视图是驾驶员的视图,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);


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

10-08 20:14