我想知道如何绘制圆圈。根据我的理解,这只能使用很多三角形来完成。但是,我找不到足够清楚地解释它的教程,以便我理解和复制。有没有人知道任何好的教程网站/可以向我解释如何制作一个?
答案 0 :(得分:5)
我认为没有办法在OpenGL中绘制 true 圈,但有两种基本方法可以用来近似它:
使用纹理:确保纹理支持透明度并且您已经适当地设置了混合(在任何OpenGL介绍中都应该找到),然后只需加载包含圆的图像文件并将其应用于正方形。要绘制许多小圆圈(比如粒子引擎),这就是要走的路。
绘制一个有很多边的多边形:一个角落的三角形扇形,或者在中心相交的一堆切片。您使用的三角形越多,它看起来越接近真圆,但这些是有限的资源,并且您并不总是希望花费大量多边形来近似曲线。如果您只有几个圆圈会被绘制得足够大以使纹理变得笨拙,那么这是最好的。
对于后一种方法的示例,您可以查看使用24边多边形的the graphics-drawingcombinators
package。有关前者的示例,任何使用纹理的教程都可以。
答案 1 :(得分:2)
也许这会有助于开始:
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]
http://www.haskell.org/haskellwiki/OpenGLTutorial1显示了设置窗口的基础知识,以及如何使用HOpenGL。
renderFan points = do
renderPrimitive TriangleFan $ mapM_ (\(x, y) -> vertex (Vertex2 x y)) points
然后通过包含中心点来创建一个粉丝,例如:
renderCircle centre radius divs = renderFan (centre : circle centre radius divs)
答案 2 :(得分:0)
type Point = (Float, Float)
type Polygon = [Point]
circle :: Point -> Float -> Polygon
circle (x,y) r = map (\t -> (x+r*cos (t), y+r*sin (t))) [0,0.2..(2*pi)]
-- center radius
ball = circle (0,0.2) 0.2
然后有
是有用的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)