Как можно получить вид с движущегося объекта с помощью OpenGL? - PullRequest
2 голосов
/ 15 декабря 2011

У меня есть машина, движущаяся по эллиптической трассе на 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);

Согласно этой статье , он должен обеспечивать такой же вид.

Любая помощь в любом подходе?

1 Ответ

1 голос
/ 15 декабря 2011

Ваши текущие значения lx и lz должны соответствовать желаемому направлению взгляда, однако это координаты с центром в начале координат.

4-й, 5-й и 6-й аргументы gluLookAt указывают точку в сцене, на которую нужно смотреть, а не направление взгляда.

Поэтому вам нужно будет добавить направление взгляда к положению камеры, чтобы получить точку на сцене, на которую направить камеру.

Кроме того, поскольку carTwist указывается в градусах, вам необходимо преобразовать его в радианы для использования с функциями cos и sin.

double x, z, lx, lz;
x = cos(carAngle)*(outsideA+insideA)/2.0;
z = sin(carAngle)*(outsideB+insideB)/2.0;
lx = x + cos(carTwist * M_PI / 180.0);
lz = z + sin(carTwist * M_PI / 180.0);
...