跟随和旋转OpenGL中的路径

时间:2012-11-29 05:55:09

标签: java opengl rotation jogl

我试图在车辆跟随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);

这样运作得很好。我现在的问题是旋转车辆,使其遵循伯努利Lemniscate定义的路径。我想通过使用glRotatef围绕Y轴旋转来实现这一点,但我不确定如何在glRotatef中找到要输入的角度。旋转目前已经到位,因此它只能操纵车辆,并且似乎只需要正确的数学来跟踪路径。

我尝试过的事情:

  • 使用上面列出的X和Y形式的导数。我彼此独立地使用它们,因为我不确定如何/它们是否需要组合以用于角度。和一些 他们跟随原点附近的直线区域进行轻微操纵, 但在曲线周围崩溃了。
  • 直接找到切线 t值并转换为度数。导致不稳定的旋转。

如果有人有任何建议可能比glRotatef方法更好,那也是值得赞赏的。我已经看到了gluLookAt may be helpful,我可能会尝试使用它找到解决方案。

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

1 个答案:

答案 0 :(得分: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);

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

相关问题