Я знаю, что это общий вопрос (так как я читал много тем здесь и на других форумах по этому поводу), но из-за жизни я не могу получить вращение камеры, которое я желаю.Я хочу, чтобы камера могла «оглядываться», а не «вращаться» вокруг точки, эта точка является источником 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] и матрицей проекции перспективы).
Наконец, типичный кадр выглядит следующим образом: проверьте входные данные (переместите / поверните камеру в зависимости от ситуации), визуализируйте скайбокс (игнорируя столбец происхождения / местоположения матрицы вида / камеры), нарисуйте все остальное (с учетомвся матрица представления).
Я прошу прощения за то, что задал такой общий вопрос, но два дня поиска и пробования различных решений не дали положительного результата.Результаты.
Спасибо.