Форум программистов, компьютерный форум, киберфорум
OpenGL
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
1 / 1 / 0
Регистрация: 17.09.2012
Сообщений: 24
1

Матрицы трансформаций и проекции

05.02.2015, 12:57. Просмотров 1257. Ответов 6
Метки нет (Все метки)

Здравствуйте. В ходе реализации библиотеки векторной математики для OpenGL возникли некоторые трудности.
Функция, возвращающая матрицу перемещения, выглядит так:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
mat4 translation(const float &x, const float &y, const float &z)
        {
            mat4 tmp;
            tmp[0][0] = 1.f;
            tmp[0][3] = x;
            tmp[1][1] = 1.f;
            tmp[1][3] = y;
            tmp[2][2] = 1.f;
            tmp[2][3] = z;
            tmp[3][3] = 1.f;
            return tmp;
        }

А для матрицы перспективной проекции такая функция:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
mat4 frustum(const float &angle, const float &ratio, const float &near, const float &far)
        {
            mat4 tmp;
            float d = 1 / tanf(angle * 0.0174532925f / 2); //Здесь константа, это Пи/180
            tmp[0][0] = d / ratio;
            tmp[1][1] = d;
            tmp[2][2] = -(far+near) / (far - near);
            tmp[2][3] = -(2 * far * near) / (near - far);
            tmp[3][2] = -1.f;
            return tmp;
        }

Матрицы реализованы на структурах и работают корректно. По умолчанию инициализируются нулевыми матрицами.
Для отрисовки треугольника с такими координатами вершин (в своей локальной системе координат):
C++
1
2
3
vec3(-0.5f, -0.5f, 0.f)
vec3(0.0f, 0.5f, 0.f)
vec3(0.5f, -0.5f, 0.f)
Определяю матрицу проекции (окно вывода квадратное):
C++
1
cameraView = frustum(90.f, 1.f, 1.f, 1000.f)
И матрицу трансформации, перемещающую треугольник (по задумке) в область видимости по оси Z (к примеру на две единицы):
C++
1
modelView = translation(0.f, 0.f, 2.f)
Передаю матрицы, как uniform переменные в шейдер, но треугольник не рисуется.
Если же матрицу перемещения задать единичной и вручную прописать двойку в координаты вершин, то отрисовывается корректно.
Зная, что никому неохота разбираться даже в маленьком кусочке чужого кода, но всё же надеясь на ответ, заранее спасибо.
P. S. Код вершинного и фрагментного шейдеров:
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#version 430 core
 
layout (location = 0) in vec3 position;
layout (location = 1) in vec3 color; //Цвет вершины
layout (location = 2) uniform mat4 modelView;
layout (location = 3) uniform mat4 cameraView;
 
out vec3 outColor;
 
void main()
{
    gl_Position = cameraView * modelView * vec4(position, 1.0);
    outColor = color;
}

Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
#version 430 core
 
in vec3 outColor;
 
void main()
{
    gl_FragColor = vec4(outColor, 1.0);
}

Но не думаю, что проблема в них.
И ещё одна деталь. Если во frustum задать near меньше единицы, то работать не будет в любом случае.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.02.2015, 12:57
Ответы с готовыми решениями:

Проекции
Есть задача: 1) Построить изображение куба в заданной проекции. Куб расположен в центре экрана. 2)...

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

Проекции, основы
Я прошу прощения, я совершеннейшим образом новичок в этой сфере, я начал изучать математические...

Матрица ортогональной проекции
Есть три друга: QMatrix4x4 mProjectionMatrix; QMatrix4x4 mViewMatrix; QMatrix4x4...

6
2404 / 1247 / 210
Регистрация: 26.02.2009
Сообщений: 5,091
Записей в блоге: 5
05.02.2015, 13:53 2
Плохо знаю тонкости С++, но слышал что внутри ф-ии запись вида:
mat4 tmp;
не гарантирует что все элементы матрицы будут нулевыми. Даже может быть такое что в режиме DEBUG они нулевые а в RELEASE уже находится мусор ибо выделяется память на стеке. Хотя наверное зависит от компилятора.
Вообщем попробуйте явно задать все эл-ты матрицы... для начала

Добавлено через 2 минуты
Для С++ есть отличная либа glm
http://habrahabr.ru/post/138731/
1
1 / 1 / 0
Регистрация: 17.09.2012
Сообщений: 24
05.02.2015, 14:06  [ТС] 3
snake32, спасибо за ответ. Да, в С++ действительно это не гарантировано, но у структур матриц есть конструктор по умолчанию, в котором присутствует инициализация нулями. И ручной вывод содержимого матрицы показал, что нули по умолчанию на своих местах.
GLM есть и уже даже использовалась, но смысл этого проекта именно в своей библиотеке векторной математики.
0
2404 / 1247 / 210
Регистрация: 26.02.2009
Сообщений: 5,091
Записей в блоге: 5
05.02.2015, 14:18 4
Цитата Сообщение от Mikelanjelo Посмотреть сообщение
у структур матриц есть конструктор по умолчанию
А он точно вызывается? Может нужно что-то типа этого:
mat4 tmp = mat4();
Ещё раз повторюсь что С++ плохо знаю.

Ну раз использовали GLM то я бы например frustum переложил на плечи GLM, a translate отлаживал свой. Что бы исключить ошибки в двух местах одновременно. Ещё важна загрузка матрицы в шейдер. Она может у вас транспонированной быть... то есть строки есть столбцы и наоборот
0
1 / 1 / 0
Регистрация: 17.09.2012
Сообщений: 24
05.02.2015, 14:33  [ТС] 5
Вызывается точно. Ручная проверка, пошаговая отладка и стандарт языка это гарантируют. В матрице элементы лежат построчно. И соотвественно в шейдер кладётся так:
C++
1
2
glUniformMatrix4fv(2, 1, GL_FALSE, &modelView[0][0])
glUniformMatrix4fv(3, 1, GL_FALSE, &cameraView[0][0])
Без транспонирования. С GLM-ой матрицей проекции идея неплохая.
1
2404 / 1247 / 210
Регистрация: 26.02.2009
Сообщений: 5,091
Записей в блоге: 5
05.02.2015, 14:46 6
Лучший ответ Сообщение было отмечено Mikelanjelo как решение

Решение

Цитата Сообщение от Mikelanjelo Посмотреть сообщение
Ручная проверка, пошаговая отладка и стандарт языка это гарантируют.
Спс.
Цитата Сообщение от Mikelanjelo Посмотреть сообщение
В матрице элементы лежат построчно.
В OpenGL матрицы хранятся по столбцам
1
1 / 1 / 0
Регистрация: 17.09.2012
Сообщений: 24
05.02.2015, 15:25  [ТС] 7
За столбцы спасибо.

Добавлено через 36 минут
В столбцах проблема и скрывалась.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.02.2015, 15:25

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

Матрица наблюдения и проекции
Объясните мне пожалуйста разницу между матрицей наблюдения и проекции.

Скорректировать перспективу проекции
На изображении есть прямоугольная поверхность расположенная под углом (угол неизвестен), необходимо...

Матрица проекции (GL_PROJECTION)
Читал... Насколько понял нужна для отсечения окна. Тоесть, ее нужно делать текущей перед...

Постороение куба в изометрической проекции
Здравствуйте! Задача, поставленная передо мной: посторить куб в изометрической проекции и повернуть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.