Вращение (перемещение) фиксированной «рукоятки» в OpenGL

#opengl #graphics #3d #glut #glu

#opengl #графика #3D #перенасыщение #glu

Вопрос:

Хорошо, у меня есть шестеренка (зубчатая передача), которую я нарисовал в opengl. У меня есть цилиндр, прикрепленный к одной его стороне, который должен моделировать рукоятку (по сути, я делаю симуляцию ручного сверла). Теперь, когда я поворачиваю шестеренку (рабочую), я хочу, чтобы цилиндр двигался так, как будто он прикреплен к нему. Кстати, центральное отверстие шестеренки находится в начале координат.

Т.е. я хочу, чтобы это работало, как на этом рисунке:

http://www.uktoolcentre.co.uk/ProductImages/25133/BIG/BIG/25133.jpg

за исключением того, что часть дескриптора будет торчать прямо из красного бита, а не на расширении.

Я просто не могу разобраться в математике, чтобы сделать так, чтобы при вращении шестеренки цилиндр двигался так, как будто он прикреплен к нему.

Любая помощь?

Ответ №1:

Вам просто нужно убедиться, что перевод в точку, расположенную рядом с внешним кругом «красного бита», выполняется после применения поворота.

В «классическом» немедленном OpenGL (который, я не уверен, применим к вашему коду) это было бы что-то вроде:

 const float main_cog_radius = 1.f;
const float crank_radius = 0.08f;
glPushMatrix();
glRotatef(main_cog_angle, 0.f, 0.f, 1.f);
draw_main_cog(main_cog_radius);
glTranslatef(main_cog_radius - crank_radius, 0.f, 0.f);
draw_crank(crank_radius);
glPopMatrix();
  

Предполагается, что ось, проходящая через центр главного шестеренки, равна (0,0,1).

Комментарии:

1. Спасибо за быстрый ответ, я попробую сейчас! — И да, я думаю, я использую немедленный режим (поскольку я делаю вещи «старым» способом, т.Е. Конечный автомат, а не конвейер)