2012-03-07 5 views
2

Je veux savoir comment dessiner un cercle. D'après ce que je comprends, cela ne peut se faire qu'en utilisant beaucoup de triangles. Cependant, je ne peux pas trouver un tutoriel qui l'explique assez clairement pour que je puisse comprendre et reproduire. Est-ce que quelqu'un sait bons sites tutoriels/peut m'expliquer comment en faire un?Comment dessiner un cercle dans Haskell en utilisant opengl

+0

Eh bien, la question est un peu large. Que savez-vous réellement? En plus de cela, une masse de triangles n'est pas la seule option. Une autre bonne idée est un quad simple texturé (juste deux triangles) avec une texture alpha (complètement transparent partout en dehors du cercle). –

+0

Eh bien, par rapport à ce que vous venez de dire, absolument rien. Comme je l'ai dit, je suis nouveau à cela. – lewdsterthumbs

Répondre

5

Je ne pense pas qu'il y ait un moyen de dessiner un vrai cercle en OpenGL, mais il y a deux façons de base pour approximer:

  • Utilisez une texture: Assurez-vous que la texture prend en charge la transparence et que vous ayez un paramétrage approprié (quelque chose que vous devriez trouver dans n'importe quelle introduction OpenGL), alors chargez simplement un fichier image contenant un cercle et appliquez-le à un carré. Pour dessiner beaucoup de petits cercles (pour un moteur de particules, par exemple) c'est la voie à suivre. Dessiner un polygone avec beaucoup de côtés: Soit un éventail de triangles d'un coin ou un groupe de tranches se rencontrant au centre. Plus vous utilisez de triangles, plus ils ressembleront à un vrai cercle, mais ceux-ci sont une ressource finie et vous ne voulez pas toujours dépenser beaucoup de polygones pour approximer les courbes. C'est mieux si vous avez seulement quelques cercles qui seront dessinés assez grand pour rendre la texture gênante.

Pour un exemple de cette dernière approche, vous pouvez regarder the graphics-drawingcombinators package, qui utilise un polygone de 24 côtés. Pour des exemples de la première, tout tutoriel sur l'utilisation de textures fera l'affaire.

+0

ok donc juste une image d'un cercle avec un fond transparent? – lewdsterthumbs

+0

Bien sûr, on peut dessiner un cercle (presque) parfait au niveau du fragment. À l'aide d'un fragment shader, jetez tous les fragments à l'extérieur du rayon du cercle. – datenwolf

+0

Dans mes exploits de programmation de jeux, j'ai trouvé qu'un 18-gon à un 24-gon apparaît très circulaire s'il ne devient pas trop grand. – luqui

2

Peut-être que cela va aider à démarrer:

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 montre les bases de la mise en place d'une fenêtre, et comment utiliser HOpenGL.

renderFan points = do 
    renderPrimitive TriangleFan $ mapM_ (\(x, y) -> vertex (Vertex2 x y)) points 

Ensuite, créez un ventilateur en incluant le point central, par exemple:

renderCircle centre radius divs = renderFan (centre : circle centre radius divs) 
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 

Ensuite, il est utile d'avoir

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) 

, vous rendez la balle faisant

renderPrimitive Polygon (points2Vertexes ball) 
Questions connexes