Я пытаюсь выполнить упражнение, в котором транспортное средство следует за лемнискатой Бернулли (или, проще говоря, трек в форме восьмерки). Я хочу использовать 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
может быть полезным, и я могу попытаться найти решение используя это.
(Примечание: я работаю в JOGL, используя Java и FFP, но мне удобны фрагменты кода C / C ++.)
(carX(t+epsilon), carZ(t+epsilon))
и использовать вектор от(carX(t), carZ(t))
к нему для направления. Если у вас есть этот вектор, угол будетMath.atan2(deltaZ, deltaX)
. - person user1118321   schedule 29.11.2012