Я хочу, чтобы моя программа рисовала многоугольник, когда мышь нажимает кнопку, которую я создал на моем экране. Где я должен поместить команды рисования полигона? Я понимаю, что я не могу вставить свою функцию мыши, потому что ее эффект теряется при следующем обращении к обратному вызову дисплея, и он должен быть в моей функции отображения. Но могу ли я установить условие if в моей функции отображения?Как рисовать многоугольник при щелчке мыши в OpenGL?
1
A
ответ
0
Надеюсь, это поможет вам, как это помогло мне. Переведя координаты мыши в то, что может использовать ваш 3D-объект (см. Код ниже) и сохраните его где-нибудь, вы можете нарисовать свой объект в цикле в сохраненных координатах с помощью преобразования. Я инициализировал свою форму, цвет и т. Д. В функции init моей программы OpenGL, но только рисую ее, когда я выбрал номер на клавиатуре, а затем щелкнул где-нибудь в своем окне просмотра. Повторение этих шагов перемещает/преобразует этот объект в новые координаты.
void MouseButton(int button, int state, int x, int y)
{
if (button == GLUT_LEFT_BUTTON)
{
leftmousebutton_down = (state == GLUT_DOWN) ? TRUE : FALSE;
if(leftmousebutton_down)
{
cout << "LEFT BUTTON DOWN" << endl;
//pTransInfo[0].vTranslate = Vector3(0.5f, 0.5f, 0.5f); // center of scene
GLint viewport[4]; //var to hold the viewport info
GLdouble modelview[16]; //var to hold the modelview info
GLdouble projection[16]; //var to hold the projection matrix info
GLfloat winX, winY, winZ; //variables to hold screen x,y,z coordinates
GLdouble worldX, worldY, worldZ; //variables to hold world x,y,z coordinates
glGetDoublev(GL_MODELVIEW_MATRIX, modelview); //get the modelview info
glGetDoublev(GL_PROJECTION_MATRIX, projection); //get the projection matrix info
glGetIntegerv(GL_VIEWPORT, viewport); //get the viewport info
winX = (float)x;
winY = (float)viewport[3] - (float)y;
winZ = 0;
//get the world coordinates from the screen coordinates
gluUnProject(winX, winY, winZ, modelview, projection, viewport, &worldX, &worldY, &worldZ);
cout << "coordinates: worldX = " << worldX << " worldY = " << worldY << " worldZ = " << worldZ << endl; //THIS IS WHAT YOU WANT, STORE IT IN AN ARRAY OR OTHER STRUCTURE
}
}
}