У меня есть машина, движущаяся по эллиптической трассе на OpenGL. Вид сверху вниз довольно прямой, но я не могу понять взгляд водителя. Вот уравнения, которые определяют положение и ориентацию автомобиля на трассе:
const double M_PI = 4.0*atan(1.0);
carAngle += (M_PI/180.0);
if (carAngle > 2.0*M_PI) {
carAngle -= 2.0*M_PI;
}
carTwist = (180.0 * atan2(42.5*cos(carAngle), 102.5*sin(carAngle)) / M_PI)-90.0;
Эти вычисления хранятся в Timer Func
, а вот код для преобразований:
// These are the inside/outside unit measurements
// of the track along the major/minor axes.
insideA = 100;
insideB = 40;
outsideA = 105;
outsideB = 45;
glPushMatrix();
glTranslated(cos(carAngle)*(outsideA+insideA)/2.0,
0.0,
sin(carAngle)*(outsideB+insideB)/2.0);
glScaled(10.0, 10.0, 10.0);
glRotated(carTwist, 0.0, 1.0, 0.0);
glCallList(vwListID1);
glPopMatrix();
Это рассматривается с gluLookAt
следующим образом:
gluLookAt(0.0, 20.0, 0.0,
0.0, 0.0, 0.0,
0.0, 0.0, 1.0);
Это работает просто отлично, и машина движется по трассе и разворачивается, как и ожидалось. Теперь я хочу "камера" вид из машины. Я пытаюсь сделать это в отдельном окне, и у меня все нормально работает со вторым окном, за исключением того, что я не могу получить правильное представление.
Я думал, что это будет что-то вроде:
double x, z, lx, lz;
x = cos(carAngle)*(outsideA+insideA)/2.0;
z = sin(carAngle)*(outsideB+insideB)/2.0;
lx = sin(carTwist);
lz = cos(carTwist);
gluLookAt(x, 1.0, z,
lx, 1.0, lz,
0.0, 1.0, 0.0);
Позиционирование, конечно, работает просто отлично, если я смотрю сверху вниз с помощью gluLookAt
, используя x, 20.0, z
для координат глаза и x, 0.0, z
для координат центра, машина остается в центре экрана. Поскольку carTwist
- это угол от положительной оси z к линии касания текущей позиции автомобиля на трассе, вектор [sin(alpha),1,cos(alpha)]
должен обеспечивать точку 1 на единицу перед координатами глаза вниз по желаемой линии визирования. Но это совсем не работает.
С другой стороны, я пытался использовать преобразования моделей для достижения того же эффекта, но без удачи. Я бы предположил, что если я переверну преобразования без установки gluLookAt
, я получу желаемый вид. i.e.:
glTranslated(-(cos(carAngle)*(outsideA+insideA)/2.0),
0.0,
-(sin(carAngle)*(outsideB+insideB)/2.0));
glRotated(-carTwist, 0.0, 1.0, 0.0);
Согласно этой статье , он должен обеспечивать такой же вид.
Любая помощь в любом подходе?