1

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

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

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

4

1 回答 1

2

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

编辑由于评论

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

模型视图左上角的 3×3 子矩阵是旋转部分。您想在屏幕空间中绘制粗线,即反转局部旋转。为此,您需要与模型视图旋转相反。旋转是正交变换,所以inverse(M) = transpose(M).

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

Z_local_i = MV_i,3

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

T=∂C(t)/∂t 

我们现在可以取 tangent 和 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)
于 2011-10-20T15:19:43.553 回答