Anthony Neace
Anthony Neace

Reputation: 26023

Following and Rotating about a path in OpenGL

I'm attempting an exercise where a vehicle is following the Lemniscate of Bernoulli (or more simply, a figure-8 track). I want to use glTranslatef and glRotatef to achieve this. So far, I have been able to successfully get the vehicle to follow/translate along this path by using the parametric form as follows:

X = (width * cos(t)) / (1+sin^2(t))
Y = (width * cos(t) * sin(t)) / (1+sin^2(t))
Where t is in -pi, pi

In the code, this is as follows:

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);

So that works well enough. My problem now is rotating the vehicle so that it follows the path defined by the Lemniscate of Bernoulli. I want to achieve this by using glRotatef to rotate around the Y axis, but I am not sure how to proceed in regards to finding the angle to input in glRotatef. The rotate is currently in place so that it only manipulates the vehicle, and appears to just need the correct mathematics to follow the path.

Things I have tried:

If anyone has any suggestions that may be better than the glRotatef method, that would be appreciated as well. I've seen that gluLookAt may be helpful, and I may attempt to find a solution using that.

(Note: I'm working in JOGL using Java and the FFP, but I'm comfortable with C/C++ code snippets.)

Upvotes: 2

Views: 1253

Answers (1)

gilad hoch
gilad hoch

Reputation: 2866

assuming camera view is the driver's view, gluLookAt is exactly what you need! based on your carX,carY,carZ computations (assuming that the math is good), you can store previous values and use it:

//globals & imports:
import javax.vecmath.*;

Vector3f current = new Vector3f();
Vector3f prev = new Vector3f();

computation is as followed:

//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);

i'll test it when i get back home, to make sure it's working, but as far as i can tell, this should do the trick.

Upvotes: 1

Related Questions