gpt4 book ai didi

c++ - 在按下和释放鼠标时绘制一个矩形,opengl

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:30:31 24 4
gpt4 key购买 nike

我正在尝试根据用户输入绘制一个矩形,该矩形从左键单击中收集 x1,y1 坐标,然后在释放左键单击时指定 x2,y2。我根据此鼠标操作成功保存了坐标(基于确认坐标已保存的 cout<< 语句)但在释放左键后没有任何显示。

这是我尝试过的:(请记住,没有任何崩溃,所以存在逻辑错误)

void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glPushMatrix();
glColor3f(1,1,0);
glBegin(GL_POLYGON);
glVertex2f(clip_start.x_coord,clip_start.y_coord);
glVertex2f(clip_finish.x_coord,clip_start.y_coord);
glVertex2f(clip_finish.x_coord,clip_finish.y_coord);
glVertex2f(clip_start.x_coord,clip_finish.y_coord);
glEnd();
glPopMatrix();
glutSwapBuffers();
glutPostRedisplay();
drawit();
}

void mouse(int button, int state, int x, int y){
if(c_pressed){
switch(button){
case GLUT_LEFT_BUTTON:

if(state==GLUT_DOWN){
clip_start.x_coord=x; //x1
clip_start.y_coord=y; //y1
cout<<"Initial pos set"<<endl;
}
if(state==GLUT_UP){
clip_finish.x_coord=x; //x2
clip_finish.y_coord=y; //y2
cout<<"Final pos set"<<endl;

}
break;
}
clip_ready==true;
}
}
void keyboard(unsigned char key, int x, int y){
if(key == 'c'){
c_pressed = true;
cout<<"c pressed"<<endl;
}
}
int main(int argc, char** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(ImageW,ImageH);
glutInitWindowPosition(100,100);
glutCreateWindow("");
init();
glutKeyboardFunc(keyboard);
glutMouseFunc(mouse);
glutDisplayFunc(display);

glutMainLoop();
return 0;
}

最佳答案

您没有设置 GL_PROJECTION矩阵。我不确定默认值是什么(可能是单位矩阵),但它肯定不是您在 display() 中假设的 Y 翻转像素坐标系.

尝试这样的事情:

#include <GL/glut.h>

struct Position
{
Position() : x(0), y(0) {}
float x, y;
};

Position start, finish;
void mouse( int button, int state, int x, int y )
{
if( button == GLUT_LEFT_BUTTON && state == GLUT_DOWN )
{
start.x = finish.x = x;
start.y = finish.y = y;
}
if( button == GLUT_LEFT_BUTTON && state == GLUT_UP)
{
finish.x=x;
finish.y=y;
}
glutPostRedisplay();
}

void motion( int x, int y )
{
finish.x = x;
finish.y = y;
glutPostRedisplay();
}

void display()
{
glClearColor( 0, 0, 0, 1 );
glClear(GL_COLOR_BUFFER_BIT);

glMatrixMode( GL_PROJECTION );
glLoadIdentity();
double w = glutGet( GLUT_WINDOW_WIDTH );
double h = glutGet( GLUT_WINDOW_HEIGHT );
glOrtho( 0, w, h, 0, -1, 1 );

glMatrixMode( GL_MODELVIEW );
glLoadIdentity();

glPushMatrix();
glColor3f(1,1,0);
glBegin(GL_QUADS);
glVertex2f(start.x,start.y);
glVertex2f(finish.x,start.y);
glVertex2f(finish.x,finish.y);
glVertex2f(start.x,finish.y);
glEnd();
glPopMatrix();

glutSwapBuffers();
}

int main(int argc, char** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA);
glutInitWindowSize(640,480);
glutInitWindowPosition(100,100);
glutCreateWindow("GLUT");
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutDisplayFunc(display);

glutMainLoop();
return 0;
}

关于c++ - 在按下和释放鼠标时绘制一个矩形,opengl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12925937/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com