Вращение камеры OpenGL не работает - PullRequest
0 голосов
/ 19 мая 2011

Я знаю, что это общий вопрос (так как я читал много тем здесь и на других форумах по этому поводу), но из-за жизни я не могу получить вращение камеры, которое я желаю.Я хочу, чтобы камера могла «оглядываться», а не «вращаться» вокруг точки, эта точка является источником OpenGL.

Я знаю, что «в OpenGL нет камеры»,местность движется, а не точка зрения и т. д., и все подобные концепции, но это не помогло мне в решении этой проблемы.

К сожалению, я упрямый и хочу написать свой код без устаревших функций, поэтому это устраняет 99% похожих ситуаций, о которых я читал, поскольку большинство из этих решений были с gluLook и аналогичными функциями.

Класс матрицы, который я использую, похож на тот, который используется в OpenGL SuperBible 5th Edition ( источник , GLFrame.h - основной интересующий файл), но адаптировал его киспользуйте Математическую библиотеку OpenGL .

Типичный ответ на этот вопрос - перевести в начало координат, повернуть, затем перевести обратно, но это ничего не значит для меня.

Немного кода:

void rotateLocalX( GLfloat p_Angle )
{
    if( ( m_Roll < m_RollLimit ) && ( m_Roll > ( -m_RollLimit ) ) )
    {
        //store away the current location so I can translate back to it
        glm::vec3 tempOrigin = getOrigin( );

        m_Roll += p_Angle;

        // Go to the Origin

        //you can also subtract the current location to get to 0.f

        //also doing glm::translate( m_Matrix, -( tempOrigin ) ); -> rotate -> 
        //glm::translate( m_Matrix, tempOrigin ) has the same result
        m_Matrix[ 3 ][ 0 ] = 0.f;
        m_Matrix[ 3 ][ 1 ] = 0.f;
        m_Matrix[ 3 ][ 2 ] = 0.f;
        m_Matrix[ 3 ][ 3 ] = 1.f;

        // Rotate the matrix
        m_Matrix = glm::rotate( m_Matrix, p_Angle, glm::vec3( 1.f, 0.f, 0.f ) );

        // Go back to the original location
        m_Matrix[ 3 ][ 0 ] = tempOrigin.x;
        m_Matrix[ 3 ][ 1 ] = tempOrigin.y;
        m_Matrix[ 3 ][ 2 ] = tempOrigin.z;
        m_Matrix[ 3 ][ 3 ] = 1.f;

        normalize( );
    }
}

И если это имеет какое-либо значение, я рассматриваю матрицу камеры как матрицу вида (с отдельной матрицей модели [view * model = modelview] и матрицей проекции перспективы).

Наконец, типичный кадр выглядит следующим образом: проверьте входные данные (переместите / поверните камеру в зависимости от ситуации), визуализируйте скайбокс (игнорируя столбец происхождения / местоположения матрицы вида / камеры), нарисуйте все остальное (с учетомвся матрица представления).

Я прошу прощения за то, что задал такой общий вопрос, но два дня поиска и пробования различных решений не дали положительного результата.Результаты.

Спасибо.

Ответы [ 2 ]

1 голос
/ 19 мая 2011

У вас должен быть вектор направления где-то в вашем коде в дополнение к положению камеры.

Это то, что вам нужно повернуть.

Возможно, вы захотите взглянуть на расширения матричного преобразования и, в частности, lookAt

1 голос
/ 19 мая 2011

Перемещение «камеры» эквивалентно применению обратного преобразования к модели.

Допустим, у вас есть объект с центром в точке x в вашем мире, ориентированный с помощью матрицы вращения R .У вас также есть камера в точке y в вашем мире, ориентированная с помощью матрицы вращения S .Чтобы получить желаемый результат при рендеринге объекта, вам нужна матрица преобразования, которая выглядит следующим образом:

S ^ -1 * T (-y) * T (x) * R

То есть вы ориентируете объект вокруг источника в координатах объекта, переводите его в его местоположение в мировых координатах.Затем вы переводите его так, чтобы камера находилась в начале координат, и, наконец, поворачиваете объект так, чтобы камера смотрела вниз по оси -z .К счастью, инвертирование матрицы вращения - это то же самое, что и транспонирование.

Если вы хотите перевести камеру на c в координатах, ориентированных на камеру, тогда вы получите x '=x + Sc .Переводы повернуты вращением камеры вперед.Если вы хотите повернуть на Q в камере координаты, тогда вы умножаете: S '= S * Q .

Если c и Q находятся в мировых координатах, то x '= x + c и S' = Q * S .


В ответе на мой комментарий это звучит так, будто вы просто манипулируете неправильными числами в матрице.Возможно ли, что ваши строки и столбцы поменялись местами;так вы всегда получаете [0,0,0] в качестве источника?И затем установка этих значений обратно на ноль (хотя они не изменились).


Редактировать 2:

Возможно, вы не инвертируете m_Matrix раньшеприменить его к матрице преобразования?Я думаю, что это создаст эффект, который вы описываете.Чтобы создать обратную матрицу, вы возьмете транспонирование компонента вращения, отмените компонент перевода и поверните компонент перевода компонентом вращения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...