在openGL中创建有向图

在openGL中创建有向图,opengl,Opengl,我试图用openGL在2D平面上可视化一个有向图形。我知道如何使用GL_线对无向图执行此操作,但我不知道如何创建从点a开始到点b结束的箭头。如何编写像createArrowPoint a、Point b这样的函数来执行此操作?创建箭头的唯一区别是在目标位置向量上添加两条额外的线。头部需要从箭头方向开始向相反方向轻微旋转 在我的例子中,我假设箭头是静态的。这样,我可以在CPU上完成所有计算,将结果存储在顶点缓冲区对象中,并将其传递给GPU。然后,GPU将使用GL_LINES属性渲染此VBO 下面是

我试图用openGL在2D平面上可视化一个有向图形。我知道如何使用GL_线对无向图执行此操作,但我不知道如何创建从点a开始到点b结束的箭头。如何编写像createArrowPoint a、Point b这样的函数来执行此操作?

创建箭头的唯一区别是在目标位置向量上添加两条额外的线。头部需要从箭头方向开始向相反方向轻微旋转

在我的例子中,我假设箭头是静态的。这样,我可以在CPU上完成所有计算,将结果存储在顶点缓冲区对象中,并将其传递给GPU。然后,GPU将使用GL_LINES属性渲染此VBO

下面是一些快速的伪代码,用于创建箭头并将绘制箭头所需的线存储在向量容器中

void createArrow(vec2 source, vec2 destination, float headAngle, float headLength) {
    vec2 direction = normalize(destination - source);
    vec2 leftHead = destination - (rotate(direction, -headAngle) * headLength);
    vec2 rightHead = destination - (rotate(direction, headAngle) * headLength);

    vector<vec2> lines = {
        source,
        destination,

        destination,
        leftHead,

        destination,
        rightHead
    }

    // Generate new vertex buffer object, and fill it with data (lines).
}

//...

// Bind data and render it.
glDrawArrays(GL_LINES, 0, 6);
再次记住,这只是一种方法,还有很多其他方法。如果你想动态渲染箭头,你可以使用几何体着色器,它可以让你动态生成额外的线条广告,基本上这样我们就可以将大部分代码从CPU移动到GPU


还可以使用帧缓冲区和片段着色器将线渲染到纹理。

要计算绘制箭头线/三角形所需的坐标,可以首先计算从箭头尖端到底部的规格化向量。如果直线从x1,y1到x2,y2,则方向向量为:

float vx = x1 - x2;
float vy = y1 - y2;
float s= 1.0f / sqrt(vx * vx + vy * vy);
vx *= s;
vy *= s;
要获得与尖端成45度角的矢量,请计算该方向矢量和与其正交的方向之和。与vx,vy正交的两个向量为:

那么正交向量和方向向量之和为:

(vx, vy) + (vy, -vx) = (vx + vy, vy - vx)
(vx, vy) + (-vy, vx) = (vx - vy, vy + vx)
要获取箭头点的坐标,请将这些向量添加到端点,并按所需的尖端大小进行缩放。箭头尖端尺寸为d时,箭头尖端的3个点为:

(x2, y2)
(x2, y2) + d * (vx + vy, vy - vx)
(x2, y2) + d * (vx - vy, vy + vx)

对于填充箭头,用这三个点绘制一个三角形。对于开口端,从第1点到第2点,从第1点到第3点绘制直线。

一条直线,然后在端点处绘制一个三角形。
(vx, vy) + (vy, -vx) = (vx + vy, vy - vx)
(vx, vy) + (-vy, vx) = (vx - vy, vy + vx)
(x2, y2)
(x2, y2) + d * (vx + vy, vy - vx)
(x2, y2) + d * (vx - vy, vy + vx)