opengGL绘制一条线
opengGL drawing a line
到目前为止,这是我的代码:
#include <iostream>
#include <cstdlib>
#include <GL/glut.h>
#include <cmath>
void keyboard(unsigned char key, int x, int y);
void display(void);
void timer(int);
static float x=0.0f,y=0.0f;
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitWindowPosition(200,200);
glutInitWindowSize(640,480);
glutCreateWindow("draw a line");
glutKeyboardFunc(&keyboard);
glutDisplayFunc(&display);
glutTimerFunc(10,timer,0);
glutMainLoop();
return EXIT_SUCCESS;
}
void keyboard(unsigned char key, int x, int y)
{
switch (key)
{
case 'x1B':
exit(EXIT_SUCCESS);
break;
}
}
void timer(int value){
x+=0.001;
y+=0.0005;
glutPostRedisplay();
glutTimerFunc(10,timer,0);
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity ();
glColor3f(0.0f, 1.0f, 0.0f);
glBegin(GL_POINTS);
glVertex2f(x,y);
glEnd();
glFlush();
}
它的作用是,从点(0,0)到(1,0.5),每10毫秒点亮一个像素。我想要的是,当一个像素点亮时,它保持在那种状态,所以最终你会看到一条线。我怎样才能做到这一点?
我不熟悉glut
,但我猜display
是每次重绘时调用的函数。此功能从glClear(GL_COLOR_BUFFER_BIT)
开始。此函数在每次重绘时清除颜色缓冲区。
您可能会发现,删除glClear
并不能完全解决您的问题。这很可能是因为图形上下文可能是双缓冲的,为了提高效率,每次动画运行时都不会将前缓冲区复制到后缓冲区。
要获得所需效果,最好的办法可能是在每次动画运行时绘制一条增长的线。
为什么要用艰难的方式做事?尽管较旧的OGL API已被弃用,但您可以使用GL_LINES来执行此操作:
glBegin(GL_LINES);
glVertex2f(x_start,y_start);
glVertex2f(x_end,y_end);
glEnd();
这将一次画出完整的线条,这更容易,也更高效(它还允许您从线条抗锯齿提示中受益)。
每次调用glutPostRedisplay()
时都会调用显示函数。每次调用display函数时,都会清除屏幕。
您需要编写一个函数,该函数将遍历您想要显示的所有点。每次迭代都会调用类似drawPoint()
函数的东西。
也许是这样的:
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.0f, 1.0f, 0.0f);
for (int i = 0; i < num_points; i++)
{
drawPoint(points(i));
}
glFlush();
}
或者,你可以跳过编写一个新函数,这样做:
glBegin(GL_POINTS);
for (int i = 0; i < num_points; i++)
{
glVertex2f(points(i).getX(), points(i).getY());
}
glEnd();
如果您使用GL_LINES。一种方法是使用要绘制的点数组,例如:p[0]、p[1]、p[2]、p[3]、p[4]、p[5]。。。然后使用一些for loop 绘制
glBegin(GL_LINES);
for(...) {
glVertex2f(p[i ]->x,p[i ]->y);
glVertex2f(p[i+1]->x,p[i+1]->y);
}
glEnd();
因此,使用这种方法,您可以将p[]替换为一个函数,该函数允许您制作漂亮的形状
glVertex2f(functionx(i ),functiony(i ));
glVertex2f(functionx(i+1),functiony(i+1));
注意:行的工作方式很奇怪,它们没有连接起来——你需要有一个起点到终点的东西,因此i+1
我猜你想用极坐标画心形之类的东西?
- 如何在 c++ 中确定一条指令(以字节为单位)在哪里结束,另一条指令从哪里开始?
- 如何在 Win32 中用一条线连接 2 个文本框?
- C++ 如何在同一行中和在一条线上?
- 如何在SDL2窗口上使用Cairo绘制一条白色直线
- 在Opengl中绘制一条不显示C++的线
- 为什么当 while 循环中的 if 条件变为 false 时,我的函数不输出最后一条语句?
- x86 - 为什么编译器在下一条指令中插入看似毫无意义的JMP?
- CMake似乎忽略了一条线
- 在C 中使用Legacy OpenGL(即时模式)绘制一条厚线
- 如何在子小部件而不是父窗口小部件上绘制一条线
- 运行光流跟踪时,在每个帧中的点之间绘制一条线
- 如何绘制一条光滑的曲线,该线经过QT中的几个点
- opengGL绘制一条线
- 在QML中绘制一条虚线和虚线贝塞尔曲线
- 在QGraphicsView上的第一个和最后一个QPoint之间绘制一条线
- 用鼠标方向绘制一条等长的直线
- 从一组点绘制一条线
- 在WM_PAINT外部绘制一条线
- 在Open GL中使用双缓冲区和预先确定的帧速率绘制一条线
- 如何在Qt3D中绘制一条简单的线