Как заставить камеру следовать за 3D-объектом в OpenGL? - PullRequest
4 голосов
/ 30 мая 2011

Я впервые участвую в гонке на машине с использованием opengl, первая проблема, с которой я сталкиваюсь, - это заставить камеру следовать за машиной с постоянным расстоянием. Вот код для функции клавиатуры. V - это скоростьмашина.

void OnSpecial(int key, int x, int y) 
{
    float step = 5;

    switch(key) {

    case GLUT_KEY_LEFTa:
        carAngle = step;
        V.z = carAngle ;
        camera.Strafe(-step/2);
        break;

    case GLUT_KEY_RIGHT:
        carAngle = -step;
        V.z = carAngle ;
        camera.Strafe(step/2);
        break;

    case GLUT_KEY_UP:
        V.x += (-step);
        camera.Walk(step/2);

        break;
    case GLUT_KEY_DOWN:
        if(V.x<0)
        {
            V.x += step;
            camera.Walk(-step/2);
        }
        break;
    }
}

Ответы [ 2 ]

4 голосов
/ 31 мая 2011

Нечто подобное может быть?

vec3 cameraPosition = carPosition + vec3(20*cos(carAngle), 10,20*sin(carAngle));
vec3 cameraTarget = carPosition;
vec3 cameraUp = vec3(0,1,0);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity()
gluLookAt(cameraPosition, cameraTarget, cameraUp);
glTranslate(carPosition);
drawCar();

Если вы не используете старый и устаревший API openGL (glBegin и прочее), вам придется сделать что-то вроде

mat4 ViewMatrix = LookAt(cameraPosition, cameraTarget, cameraUp); // adapt depending on what math library you use
0 голосов
/ 07 августа 2013

Ответ на этот вопрос прост.У вас есть управляемый игроком объект (автомобиль), поэтому вы можете определить его положение и ориентацию с помощью ModelViewMatrix в мировом пространстве (обычно это указывает на центр 3D-модели). Чтобы преобразовать его в правильный объект ProjectionMatrix, вы должны:

  1. Получите автомобиль ModelViewMatrix, чтобы удвоить M [16]
  2. перевести / повернуть его в новое положение (внутри кабины или позади автомобиля), чтобы ось Z указывала так, как вы хотите видеть.
  3. ИнвертироватьM ... M = Inverse (M)
  4. Применить перспективу M = M * PerspectiveMatrix
  5. сохранить M в качестве ProjectionMatrix перед рендерингом

для получения дополнительной информации, которую вам нужно посмотретьна мой ответ здесь: https://stackoverflow.com/a/18041433/2521214

...