OpenGL - Понимание взаимосвязи между моделью, представлением и мировой матрицей

8

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

В моем понимании Матрица модели - это матрица объекта, например, куба или сферы, их будет много в приложении / игре.

Матрица мира - это матрица, которая определяет происхождение трехмерного мира. отправная точка.

И Матрица просмотра - это «камера», все переводится с этим, чтобы убедиться, что у вас есть иллюзия реальной камеры, когда на самом деле все движется вместо этой матрицы?

Я немного потерян здесь. Поэтому я надеялся, что кто-то здесь сможет помочь мне понять это правильно.

Каждый ли modelMatrix переводится / умножается на мировую матрицу и worldMatrix, а затем на ViewMatrix? Или каждый modelMatrix переводится / умножается с помощью viewMatrix, а затем с помощью worldMatrix?

Как соотносятся все эти матрицы и как вы настраиваете мир с несколькими объектами и «камерой»?

РЕДАКТИРОВАТЬ:

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

projectionMatrix = Matrix;
makePerspective(45, width, height, 0.1, 1000.0, projectionMatrix);

modelMatrix = Matrix;
identity(modelMatrix);
translate(modelMatrix, [0.0, 0.0, -10.0]);  // move back 10 on z axis

viewMatrix = Matrix;
identity(viewMatrix);
// do some translation based on input with viewMatrix;

Умножить или перевести viewMatrix с modelMatrix или наоборот? а что тогда? В настоящее время у меня есть метод рисования таким образом, что для рисования аргументов нужны только 2 матрицы.

Вот мой метод рисования:

draw(matrix1 matrix2) {

            bindBuffer(ARRAY_BUFFER, cubeVertexPositionBuffer);
            vertexAttribPointer(shaderProgram.getShaderProgram().vertexPositionAttribute, cubeVertexPositionBuffer.itemSize, FLOAT, false, 0, 0);

            bindBuffer(ARRAY_BUFFER, cubeVertexColorBuffer);
            vertexAttribPointer(shaderProgram.getShaderProgram().vertexColorAttribute, cubeVertexColorBuffer.itemSize, FLOAT, false, 0, 0);

            bindBuffer(ELEMENT_ARRAY_BUFFER, cubeVertexIndexBuffer);

            setMatrixUniforms(shaderProgram, matrix1, matrix2);

            drawElements(TRIANGLES, cubeVertexIndexBuffer.numItems, UNSIGNED_SHORT, 0);


}

Какими должны быть эти матрицы? Большое спасибо заранее снова, ребята.

Сэм
источник
1
Вы знаете, что такое матрица? Вы знаете, как умножить матрицы / векторы? Знаете ли вы, что представляет собой матрица (линейные / аффинные преобразования)? Если вы этого не сделаете, лучше сначала начать с математики.
Иван Кукир
Наверное, хорошая идея сосредоточиться на этом. Любая идея, что искать или какие-либо хорошие источники вы знаете в Интернете?
Сэм
1
Пройдите путь к линейной алгебре, затем найдите базовый 3D-рендеринг и затем учебные пособия. В интертубах полно хороших источников, но вы должны делать это по одному шагу за раз, или, как вы заметили, вы полностью потерялись.
Патрик Хьюз

Ответы:

19

В трехмерной визуализированной сцене обычно есть три основные матрицы, используемые для преобразования объекта из его собственного локального пространства (пространства объекта / модели) в однородное пространство, известное как пространство экрана.

Мир

  • Матрица мира, являющаяся первой, уникальна для каждого объекта в вашем мире и отвечает за преобразование вершин объекта из его локального пространства в общую систему координат, называемую мировым пространством.

Посмотреть

  • После этого матрица представления обеспечивает концепцию мобильной камеры, когда она фактически является единственной постоянной точкой отсчета в мире. Матрица представления - это преобразование, которое применяется к каждому объекту в сцене (но не является уникальным для каждого объекта) и обеспечивает иллюзию камеры. Матрица вида в основном обратна той, которую можно считать мировой матрицей для камеры. Однако вместо перемещения самой камеры она обеспечивает противоположные движения остальной части сцены (иллюзия;)).

проекция

  • Наконец, проекционная матрица отвечает за преобразование трехмерного мира в однородное пространство экрана, которое вы видите на своем экране. Это матрица, используемая для представления усеченного вида, и обычно представлена ​​в виде ортографической или перспективной проекции.

На простейшем уровне каждый из ваших объектов должен содержать свою собственную мировую матрицу, ваша «сцена» или любой другой используемый вами контекст должен содержать матрицу представления для представления камеры и матрицу проекции для преобразования мировых координат в экранные координаты. Все они затем должны быть переданы в вершинный шейдер (с изменением матрицы мира для каждого объекта, но не обязательно для вида или проекции) для преобразования.

Evan
источник
Я обновил свой пост, не могли бы вы помочь с псевдокодом, который я записал, чтобы лучше понять ответ?
Сэм
Могу ли я взять точный текст этого ответа без нарушения авторских прав?
arandomguy
1
Да, вы можете использовать его
Эван
Разве матрица "Мир" не должна называться Матрицей "Модель", а комбинация "Модель" и "Вид", матрица "Модельное представление", должна быть матрицей "Мир"?
Бар
Точная терминология может варьироваться в зависимости от используемой кодовой базы. Некоторые конвейеры рендеринга объединяют определенные матрицы, в то время как другие оставляют их разделенными. Я видел, как некоторые системы используют терминологию, которую вы описываете здесь.
Эван
3

Хороший ответ здесь /programming/6461740/xna-worldmatrix-and-viewmatrix

Прежде всего, нет никакой реальной разницы между «Матрицей мира» и «Матрицей представления» , они обе являются матрицами преобразования, и различие несколько произвольно. Некоторые системы даже объединяют их (в OpenGL просто есть матрица ModelView ).

Традиционно «мировая матрица» используется для перемещения отдельных моделей из «модельного пространства» в «мировое пространство». Затем «матрица вида» используется для перемещения всех моделей из мирового пространства в их относительные положения перед камерой (что, по сути, «перемещает камеру»). И, наконец, «Матрица проекции» преобразует 3D-позиции в их 2D-позиции на экране (обычно с перспективной проекцией). Поскольку они являются матрицами, их можно умножить вместе в одну матрицу, которая может преобразовывать точки за один шаг.

Расти Шекелфорд
источник