Для уточнения предыдущих ответов.
Преобразования в OpenGL выполняются с помощью умножения матриц. В вашем примере у вас есть:
M_r_ - преобразование вращения
M_t_ - преобразование перевода
v - вершина
и вы применили их в следующем порядке:
M_r_ * M_t_ * v
Использование скобок для уточнения:
(M_r_ * (M_t_ * v))
Мы видим, что вершина сначала преобразуется более близкой матрицей, что в данном случае является переводом. Это может быть немного противоречащим интуиции, потому что это требует, чтобы вы указали преобразования в порядке, противоположном тому, в котором вы хотите их применить. Но если вы подумаете о том, как преобразования размещаются в стеке матриц, то, надеюсь, должно иметь немного больше смысла (стек предварительно умножается вместе).
Следовательно, почему для того, чтобы получить желаемый результат, вам нужно было указать преобразования в обратном порядке.