如何使用opengl在Haskell中绘制圆

如何使用opengl在Haskell中绘制圆,opengl,haskell,geometry,Opengl,Haskell,Geometry,我想知道如何画一个圆。根据我的理解,这只能用很多三角形来完成。然而,我找不到一个足够清晰的教程来解释它,以供我理解和复制。有谁知道什么好的教程网站/可以向我解释如何制作一个吗?我不认为有任何方法可以在OpenGL中绘制一个真正的圆,但有两种基本方法可以近似它: 使用纹理:确保纹理支持透明度,并适当设置了混合(这在任何OpenGL简介中都应该找到),然后加载一个包含圆形的图像文件并将其应用于正方形。画许多小圆圈(比如说,对于粒子引擎来说),这是一条路要走 画一个有很多边的多边形:从一个角画一个三

我想知道如何画一个圆。根据我的理解,这只能用很多三角形来完成。然而,我找不到一个足够清晰的教程来解释它,以供我理解和复制。有谁知道什么好的教程网站/可以向我解释如何制作一个吗?

我不认为有任何方法可以在OpenGL中绘制一个真正的圆,但有两种基本方法可以近似它:

  • 使用纹理:确保纹理支持透明度,并适当设置了混合(这在任何OpenGL简介中都应该找到),然后加载一个包含圆形的图像文件并将其应用于正方形。画许多小圆圈(比如说,对于粒子引擎来说),这是一条路要走

  • 画一个有很多边的多边形:从一个角画一个三角形扇形,或者在中心画一组相交的切片。你使用的三角形越多,它看起来就越接近一个真实的圆,但是这些都是有限的资源,你并不总是想花费大量的多边形来近似曲线。这是最好的,如果你只有几个圆圈,将绘制足够大,使纹理尴尬


对于后一种方法的示例,您可以查看,它使用24边多边形。对于前者的示例,任何关于使用纹理的教程都可以。

这可能有助于入门:

circle (x, y) radius divs = map toPoint angles where 
    arc       = 2.0 * pi / fromIntegral divs
    toPoint a = (x + cos a * radius, y + sin a * radius)
    angles    = map ((*arc) . fromIntegral) [0..divs]
显示设置窗口的基础知识,以及如何使用HOpenGL

renderFan points = do
    renderPrimitive TriangleFan $ mapM_ (\(x, y) -> vertex (Vertex2 x y)) points
然后通过包括中心点来创建风扇,例如:

renderCircle centre radius divs = renderFan (centre : circle centre radius divs)
那么,拥有

points2GL :: [Point] -> [(GLfloat,GLfloat)]
points2GL l = [ (realToFrac x, realToFrac y) | (x,y) <- l ]

glPoints2Vertexes pts = mapM_ (\(x, y) -> vertex $ Vertex2 x y) pts

points2Vertexes pts = glPoints2Vertexes (points2GL pts)

这个问题有点宽泛。你到底知道什么?除此之外,大量的三角形不是唯一的选择。另一个好主意是一个简单的纹理四边形(只有两个三角形)和alpha纹理(在圆外的任何地方都是完全透明的)。就像我说的,我是新手。好吧,只要一张有透明背景的圆的图片?当然可以在碎片级别上画一个(几乎)完美的圆。使用碎片着色器,丢弃圆半径以外的所有碎片。在我的游戏编程漏洞中,我发现如果18个角到24个角不太大,它将看起来非常圆。
points2GL :: [Point] -> [(GLfloat,GLfloat)]
points2GL l = [ (realToFrac x, realToFrac y) | (x,y) <- l ]

glPoints2Vertexes pts = mapM_ (\(x, y) -> vertex $ Vertex2 x y) pts

points2Vertexes pts = glPoints2Vertexes (points2GL pts)
renderPrimitive Polygon (points2Vertexes ball)