Код отрисовки, вероятно, выглядит примерно так:
glLoadIdentity();
glTranslate(0, 0, -10);
glRotate(...);
drawMolecule();
Теперь важно понимать, что эти преобразования применяются в обратном порядке. Если в drawMolecule
мы указываем вершину, то эта вершина будет сначала вращаться вокруг оси, заданной для glRotate
(которая по определению проходит через локальное начало координат молекула), и , затем будет переведено на 10 единиц в направлении -z.
Это имеет смысл, потому что glTranslate
по сути означает: "переводить все, что будет после этого". Это включает в себя сам вызов glRotate
, поэтому результат поворота также переводится. Если бы вызовы были отменены, то результат перевода был бы повернут, что привело бы к вращению вокруг оси, которая больше не проходит через начало координат.
Итог: чтобы повернуть объект вокруг его локального источника, поместите glRotate
call last .