我希望在OpenGL中以任意宽度绘制连续曲线。我正在开发一种触摸屏,并且已经通过在旧的X& E之间画线来达到预期的效果。 Y坐标和新的X& Y坐标。当用户在屏幕上滑动他们的手指时,这会在他们的手指之后产生一条线。为确保线条平滑,我使用了以下内容:
pGL.glEnable(GL10.GL_LINE_SMOOTH);
pGL.glHint(GL10.GL_LINE_SMOOTH_HINT, GL10.GL_NICEST);
然而,这实际上意味着我无法控制线条的宽度,因为它总是默认为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)