Java 在OpenGL中跟踪并围绕路径旋转

Java 在OpenGL中跟踪并围绕路径旋转,java,opengl,rotation,jogl,Java,Opengl,Rotation,Jogl,我正在尝试一个练习,其中一辆车沿着(或者更简单地说,一条8字形轨道)行驶。我想使用glTranslatef和glRotatef来实现这一点。到目前为止,我已经能够通过使用参数化形式成功地使车辆沿着该路径跟随/平移,如下所示: 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.si

我正在尝试一个练习,其中一辆车沿着(或者更简单地说,一条8字形轨道)行驶。我想使用
glTranslatef
glRotatef
来实现这一点。到目前为止,我已经能够通过使用参数化形式成功地使车辆沿着该路径跟随/平移,如下所示:

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);
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
,我可能会尝试使用它来找到解决方案


(注意:我使用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);

回家后我会测试它,以确保它正常工作,但据我所知,这应该可以做到。

你能做一些简单的事情,比如计算
(carX(t+epsilon),carZ(t+epsilon))
,然后使用
(carX(t),carZ(t))
到它的向量作为方向。一旦你有了这个向量,角度将是
Math.atan2(deltaZ,deltaX)
。atan2(dy/dt,dx/dt)应该给出你想要的角度。你能解释一下这种方法有什么问题吗?谢谢你们两位的评论。正如我所能描述的,车辆当前在红点处垂直于蓝线旋转。在阅读了更多的内容之后,这可能就是这个示例的实际绘制方式,尽管这不是我想要的行为。我现在不在电脑旁,所以我无法跟踪新的尝试,但如果发现任何新的尝试,我会再次更新。