我试图在车辆跟随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);
这样运作得很好。我现在的问题是旋转车辆,使其遵循伯努利Lemniscate定义的路径。我想通过使用glRotatef
围绕Y轴旋转来实现这一点,但我不确定如何在glRotatef
中找到要输入的角度。旋转目前已经到位,因此它只能操纵车辆,并且似乎只需要正确的数学来跟踪路径。
我尝试过的事情:
如果有人有任何建议可能比glRotatef方法更好,那也是值得赞赏的。我已经看到了gluLookAt
may be helpful,我可能会尝试使用它找到解决方案。
(注意:我使用Java和FFP在JOGL工作,但我对C / C ++代码片段感到满意。)
答案 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);
当我回到家时,我会测试它,以确保它正常工作,但据我所知,这应该可以解决问题。