我正在尝试一种练习,其中车辆遵循Lemniscate of Bernoulli(或更简单地说是8字形轨道)。我想使用glTranslatef
和glRotatef
来实现这一点。到目前为止,通过使用以下参数形式,我已经能够成功使车辆沿着此路径进行跟踪/平移:
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);
我回到家时会对其进行测试,以确保其正常工作,但据我所知,这应该可以解决问题。