Как я могу умножить матрицы, чтобы добраться до определенного места (T * R * S)
У меня есть эта картина, мне нужно добраться от дома позиции справа до дома позиции слева:
Ну, в OpenGL это просто,
glTranslated(6,0,0);
glRotated(30, 0, 0, 1);
glScaled(2, 2, 0);
Но я пытаюсь понять, как это на самом деле работает "за кадром". Должен ли я взять точку, скажем, левую нижнюю, и работать оттуда?
Например:
v1 = (0,1,0,1) и первая матрица будет переводной, поэтому я умножаю ее на матрицу перевода, где x = 6, y = 0, z = 0. и получаю новую точку, которая равна v2 = (6,1,0,1) и продолжить оттуда с масштабом и матрицей вращения?
Вопрос: Какая гомогенная матрица мне понадобится для этого?
Я предполагаю, что это будет просто умножать матрицы T R S в таком порядке, и это даст мне ту матрицу, в которой я нуждаюсь..
2 ответа
То, что сказал Малком Маклин, верно. Я просто подумал, что упомяну, что TRS - это матрица, которая вам нужна, просто нужно сначала умножить матрицы, прежде чем применять их к вершинам, например, TRS*v, что противоположно выполнению S*(R*(T*). v)), о чем вы говорили, переводя, затем вращая, затем масштабируя точку. TLDR; преобразования, объединенные в одну матрицу, применяются в обратном порядке их умножения. например, TRS*v => масштабировать, повернуть, затем перевести v.
Умножение матриц не является коммутативным. Это причудливый способ сказать, что перевод, сопровождаемый вращением, не совпадает с вращением, сопровождаемым переводом. Если вы поработаете на примере, вы быстро поймете идею.
Теперь есть два соглашения, которые вы можете использовать: предварительно умножать или умножать после. Большинство графических систем используют менее интуитивное соглашение, так что операция, примененная последней, фактически применяется первой. Это облегчает работу с иерархическими системами, которые находятся высоко в иерархии, которые вы не хотите вводить в повороты, создавая большие движения коленчатого вала. Это немного усложняет понимание того, что происходит при программировании последовательности операций вручную. Работайте задом наперед и применяйте повороты в последнюю очередь - это общее правило.