некоторые объяснения OpenGL и GLM - PullRequest
1 голос
/ 04 ноября 2011

Может кто-нибудь объяснить мне, что делают следующие строки?

glm::mat4 Projection = glm::perspective(45.0f, 1.0f, 0.1f, 100.0f);
angle = (GLfloat) (i % 360);
glm::mat4 View = glm::mat4(1.);
View = glm::translate(View, glm::vec3(0.f, 0.f, -5.0f));
View = glm::rotate(View, angle * -1.0f, glm::vec3(1.f, 0.f, 0.f));
View = glm::rotate(View, angle * 0.5f, glm::vec3(0.f, 1.f, 0.f));
View = glm::rotate(View, angle * 0.5f, glm::vec3(0.f, 0.f, 1.f));
glm::mat4 Model = glm::mat4(1.0);
glm::mat4 MVP = Projection * View * Model;
glUniformMatrix4fv(glGetUniformLocation(shaderprogram, "mvpmatrix"), 1, GL_FALSE, glm::value_ptr(MVP));

Они переводят единицы измерения в пиксели, но я не уверен, что именно так они и поступают.Другой вопрос, который у меня есть, более общий: как мне представить число, то есть sin (90) = 1, 10 пикселей или 40 или любое число?И как мне указать, что (0,0) будет в середине экрана?Все вышеперечисленное позаботилось о библиотеке glm?

Ответы [ 2 ]

7 голосов
/ 04 ноября 2011

Первая строка создает перспективную проекцию, которая эквивалентна вызову gluPerspective (45.0f, 1.0f, 0.1f, 100.0f). Если вы не знаете, что делает gluPerspective, проверьте эту ссылку

 glm::mat4 Projection = glm::perspective(45.0f, 1.0f, 0.1f, 100.0f);

Следующая строка просто модулирует угол поворота на 360, чтобы убедиться, что наш угол проекции меньше 360 градусов.

angle = (GLfloat) (i % 360);

Следующие несколько строк определяют нашу матрицу просмотра. Это в основном порт вашей камеры, то есть то, что вы видите на мониторе. Вызов функций translate и rotate является вызовом функций преобразования, чтобы переместить нашу камеру в положение

glm::mat4 View = glm::mat4(1.);
View = glm::translate(View, glm::vec3(0.f, 0.f, -5.0f));
View = glm::rotate(View, angle * -1.0f, glm::vec3(1.f, 0.f, 0.f));
View = glm::rotate(View, angle * 0.5f, glm::vec3(0.f, 1.f, 0.f));
View = glm::rotate(View, angle * 0.5f, glm::vec3(0.f, 0.f, 1.f));

Следующая строка определяет положение нашей модели. В этом случае это будет (1.0f, 1.0f, 1.0f, 1.0f). Если вас интересует, почему вместо 3 есть 4 параметра, прочитайте оранжевую книгу OpenGL или проверьте Википедию по однородные координаты

glm::mat4 Model = glm::mat4(1.0);

Последние две строки заканчивают настройку нашей сцены, вычисляя матрицу проекции вида модели и передавая ее OpenGL.

glm::mat4 MVP = Projection * View * Model;
glUniformMatrix4fv(glGetUniformLocation(shaderprogram, "mvpmatrix"), 1, GL_FALSE,     glm::value_ptr(MVP));

В целом ваш кодовый блок моделирует конвейер отрисовки OpenGL от перевода координат модели в координату вида.

О втором вопросе, который вы задаете. Я не понимаю первую часть, что вы подразумеваете под переводом числа в пиксель? Вы пытаетесь отобразить точку в 1D матрице в 2D матрицу? если это так, просто выполните стандартное отображение, что-то вроде pixel [index / row] [index% row], где pixel - это ваш пиксельный объект на экране, index - это ваш индекс массива, row - это ширина вашего экрана. Для второй части (как установить (0,0) в середину экрана) я думаю, что вам нужно просто добавить смещение к исходной точке вашего экрана, так как OpenGL использует левую систему координат, исходную точку экрана т.е. (0,0) точка будет в левом нижнем углу экрана. Поэтому, если вы хотите, чтобы ваша система находилась в центре экрана, просто добавьте смещение (-width / 2, -height / 2), чтобы перевести вашу точку в пространство OpenGL или (width / 2, height / 2) для наоборот. проекция. Но использование самостоятельно установленного стандарта не рекомендуется.

0 голосов
/ 04 ноября 2011

Настройка преобразования перспективной камеры:

glm::mat4 Projection = glm::perspective(45.0f, 1.0f, 0.1f, 100.0f);

Немного переместив камеру вниз по оси Z:

View = glm::translate(View, glm::vec3(0.f, 0.f, -5.0f));

Поворот камеры вокруг оси X назад:

View = glm::rotate(View, angle * -1.0f, glm::vec3(1.f, 0.f, 0.f));

Вращение камеры вокруг осей Y и Z вдвое быстрее оси X:

View = glm::rotate(View, angle * 0.5f, glm::vec3(0.f, 1.f, 0.f));
View = glm::rotate(View, angle * 0.5f, glm::vec3(0.f, 0.f, 1.f));
...