Опитвам се да направя упражнение, при което превозно средство следва Лемниската на Бернули (или по-просто, песен с фигура 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
може да е полезно и може да се опитам да намеря решение използвайки това.
(Забележка: Работя в 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