gpt4 book ai didi

c++ - 在 OpenGL 中绘制对象数组

转载 作者:行者123 更新时间:2023-11-28 03:10:15 25 4
gpt4 key购买 nike

我现在的程序中有:- 单击鼠标时,将创建一个形状对象并将其存储在数组中。构造函数还将刚刚创建的对象绘制到屏幕上。第一次单击生成矩形,第二次单击生成圆形,第三次单击返回矩形,依此类推。- 数组是圆形的,所以当它达到最大值时,它会返回并用下一个形状替换第一个形状。

我的程序是尝试使用 for 循环一次显示其中的 25 个形状,如下所示:

for (int i = 0; i < obj_count; i++) {
if (objects[i].type == 0) {
objects[i].drawRect();
} else if (objects[i].type == 1) {
objects[i].drawCirc();
}
}

但是当我运行它时,有很多闪烁并且一次只显示一个矩形和一些圆圈。如果我只尝试使用 if 语句一次显示一个形状来绘制数组中的最后一个形状,它就可以正常工作,所以我不确定问题出在哪里。

其余相关代码在这里:

void my_display(void) {
glClear(GL_COLOR_BUFFER_BIT) ;

for (int i = 0; i < obj_count; i++) {
if (objects[i].type == 0) {
objects[i].drawRect();
} else if (objects[i].type == 1) {
objects[i].drawCirc();
}
}

glutSwapBuffers();
return ;
}

void my_TimeOut(int id) {
time += 1;
my_display();
glutTimerFunc(25, my_TimeOut, 0);
}

(定时器最终会被用来让形状动起来)

在对象类中:

void A1_Object::drawRect() {
// glClear(GL_COLOR_BUFFER_BIT) ;
glColor3f(0,0,1) ;
glRectf(vertices[0], vertices[1], vertices[2], vertices[3]);
glutSwapBuffers();
}

void A1_Object::drawCirc() {
// glClear(GL_COLOR_BUFFER_BIT) ;
glColor3f(1,0,0) ;

int triangles = 50;
GLfloat radius = 0.05;
GLfloat twoPi = 2 * 3.14159f;

glBegin(GL_TRIANGLE_FAN);
glVertex2f(center_x, center_y);

for (int i = 0; i <= triangles; i++) {
glVertex2f(center_x + radius*cos(i*twoPi/triangles), center_y + radius*sin(i*twoPi/triangles));
}

glEnd();
// glutSwapBuffers();
}

如果有人能给我指出正确的方向,那就太好了!如果需要,我也可以发布完整代码。

最佳答案

更新和绘制您的场景是两件非常不同的事情。您需要了解每个框架如何处理这两个应用程序事件。在某些情况下,OpenGL 在它自己的线程中运行,从另一个线程调用任何“gl”方法都会中断调用。

但我离题了。这是我对你们的冲突的 0.02 美元:

顺序、结构和形式很重要!

glutTimerFunc——专为循环的更新部分而设计——在其中调用 glutSwapBuffers 充其量是有问题的。

通常使用 GLUT 时的回调订阅是这样的

glutDisplayFunc(display);           // opengl drawing goes here
glutTimerFunc(33, update_world, 0); // physics, ai, other stuff here

// .. callbacks ..

glutMainLoop();

在更新方法调用结束时 glutPostRedisplay()

void update_world(int data) 
{
glutTimerFunc(33, update, 69); // call update() every 33ms

// code to update the world

// ..

glutPostRedisplay(); // <== !
}

glutPostRedisplay() 的工作原理是设置一个标志,告诉 glutMainLoop 在下一个迭代步骤中执行已注册的 display() 方法。如果不明确指定它,GLUT 不会正确绘制下一帧。

想象一下,在示例中省略了 update_world(data) 中的 glutPostRedisplay。你的世界将呈现卡住状态,没有动画,即使你的 vector/缓冲区的位置会发生变化! (我听到一分钱掉了吗?:))

glutPostRedisplay 使展开的 glutMainLoop 像这样运行

update_world(69);
display();
update_world(69);
display();
update_world(69);
display();

没有它,glutMainLoop 只会调用

update_world(69);
update_world(69);
update_world(69);

关于c++ - 在 OpenGL 中绘制对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18679349/

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