在OpenGL中以任意宽度绘制连续的曲线

时间:2011-10-20 15:08:10

标签: opengl-es drawing width line smooth

我希望在OpenGL中以任意宽度绘制连续曲线。我正在开发一种触摸屏,并且已经通过在旧的X& E之间画线来达到预期的效果。 Y坐标和新的X& Y坐标。当用户在屏幕上滑动他们的手指时,这会在他们的手指之后产生一条线。为确保线条平滑,我使用了以下内容:

pGL.glEnable(GL10.GL_LINE_SMOOTH); 
pGL.glHint(GL10.GL_LINE_SMOOTH_HINT, GL10.GL_NICEST);

然而,这实际上意味着我无法控制线条的宽度,因为它总是默认为1.因此,我得出结论,我将不得不想出一些其他的方法来创建这种效果。

1 个答案:

答案 0 :(得分:2)

而不是一条线使用四边形条或三角形条,沿着笔划居中,并具有所需的宽度。

由于评论而编辑

使用四边形或三角形绘制粗线的方法如下:

模型视图的左上3×3子矩阵是旋转部分。您想在屏幕空间中绘制具有厚度的线,即反转局部旋转。要执行此操作,您需要模型视图旋转的反转。旋转是正交变换,因此inverse(M) = transpose(M)

从技术上讲,我们只对反向投影的Z轴“Z_local”感兴趣。我们可以简单地取模型视图矩阵的第3行向量,最后一个元素“w”设置为零,整个向量归一化,即

Z_local_i = MV_i,3

接下来我们需要线切线向量。这与线段之间的方向一样简单。或者在数学上,如果线由函数C(t)描述,则切线为

T=∂C(t)/∂t 

我们现在可以在正切和Z_local之间取交叉积,给我们一个正常的

N(t) = Z_local × T(t)

将正常N(t)添加到C(t)给出了与C平行的等距曲线。这允许我们绘制四边形:

for t in range(0, T):
    T = deriv(C(t), t)
    N = cross(Z_local, T)
    emit_vertex(C(t) + width*N)
    emit_vertex(C(t) - width*N)