У меня возникли проблемы с пониманием того, как работают эти матрицы и как их настраивать относительно друг друга, чтобы обеспечить правильную работу системы.
В моем понимании Матрица модели - это матрица объекта, например, куба или сферы, их будет много в приложении / игре.
Матрица мира - это матрица, которая определяет происхождение трехмерного мира. отправная точка.
И Матрица просмотра - это «камера», все переводится с этим, чтобы убедиться, что у вас есть иллюзия реальной камеры, когда на самом деле все движется вместо этой матрицы?
Я немного потерян здесь. Поэтому я надеялся, что кто-то здесь сможет помочь мне понять это правильно.
Каждый ли 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);
}
Какими должны быть эти матрицы? Большое спасибо заранее снова, ребята.
Ответы:
В трехмерной визуализированной сцене обычно есть три основные матрицы, используемые для преобразования объекта из его собственного локального пространства (пространства объекта / модели) в однородное пространство, известное как пространство экрана.
Мир
Посмотреть
проекция
На простейшем уровне каждый из ваших объектов должен содержать свою собственную мировую матрицу, ваша «сцена» или любой другой используемый вами контекст должен содержать матрицу представления для представления камеры и матрицу проекции для преобразования мировых координат в экранные координаты. Все они затем должны быть переданы в вершинный шейдер (с изменением матрицы мира для каждого объекта, но не обязательно для вида или проекции) для преобразования.
источник
Хороший ответ здесь /programming/6461740/xna-worldmatrix-and-viewmatrix
Прежде всего, нет никакой реальной разницы между «Матрицей мира» и «Матрицей представления» , они обе являются матрицами преобразования, и различие несколько произвольно. Некоторые системы даже объединяют их (в OpenGL просто есть матрица ModelView ).
Традиционно «мировая матрица» используется для перемещения отдельных моделей из «модельного пространства» в «мировое пространство». Затем «матрица вида» используется для перемещения всех моделей из мирового пространства в их относительные положения перед камерой (что, по сути, «перемещает камеру»). И, наконец, «Матрица проекции» преобразует 3D-позиции в их 2D-позиции на экране (обычно с перспективной проекцией). Поскольку они являются матрицами, их можно умножить вместе в одну матрицу, которая может преобразовывать точки за один шаг.
источник