13.07.2015 Views

Construção de objeto e superfícies em OpenGL ... - Unisinos

Construção de objeto e superfícies em OpenGL ... - Unisinos

Construção de objeto e superfícies em OpenGL ... - Unisinos

SHOW MORE
SHOW LESS
  • No tags were found...

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

SumárioConstrução <strong>de</strong> <strong>objeto</strong> esuperfícies <strong>em</strong> <strong>OpenGL</strong>Leandro ToniettoComputação GráficaJogos Digitaisltonietto@unisinos.brhttp://www.inf.unisinos.br/~ltonietto/jed/cgr/const<strong>OpenGL</strong>.pdfout-08IntroduçãoMo<strong>de</strong>lag<strong>em</strong> com formas quádricasCurvas e superfícies <strong>em</strong> <strong>OpenGL</strong>EvaluatorsCurvas e superfícies BézierNURBSTrimmingTessellation8/10/2008 Leandro Tonietto 2Em <strong>OpenGL</strong> é possível mo<strong>de</strong>larcombinando <strong>objeto</strong>s pré-<strong>de</strong>finidos.Formasquádricas.IntroduçãoContudo,<strong>objeto</strong>s complexos requer<strong>em</strong> maiorcomplexida<strong>de</strong> mat<strong>em</strong>ática. <strong>OpenGL</strong> dásuporte a geração <strong>de</strong> curvas e superfíciesBézier e NURBS.Mo<strong>de</strong>lag<strong>em</strong> com quádricasDiversos <strong>objeto</strong>s po<strong>de</strong>m ser mo<strong>de</strong>ladosapenas com o uso <strong>de</strong> formas quádricas.Para tanto, basta combiná-las paracompor <strong>objeto</strong>s mais complexos:Visualização <strong>de</strong> moléculas <strong>em</strong> 3D(combinando esferas e cilindros)Diversos <strong>objeto</strong>s utilizados <strong>em</strong> jogos, comopor ex<strong>em</strong>plos, armas, veículos, projéteis,edificações e etc.8/10/2008 Leandro Tonietto 38/10/2008 Leandro Tonietto 4Mo<strong>de</strong>lag<strong>em</strong> com quádricasEx<strong>em</strong>plo simples <strong>em</strong> [1]:Mo<strong>de</strong>lag<strong>em</strong> com quádricasMo<strong>de</strong>lando com quádricas no <strong>OpenGL</strong>:Segu<strong>em</strong> mo<strong>de</strong>lo OO, mantendo um estadodo <strong>objeto</strong> “quádrico” na m<strong>em</strong>ória:1. Criar um <strong>objeto</strong> que representa o estado daquádrica <strong>de</strong>ve ser mantido para <strong>de</strong>finirproprieda<strong>de</strong>s das quádricas.2. Definir proprieda<strong>de</strong>s para o <strong>objeto</strong>3. Desenhar a forma específicaGLUquadricObj *pObj;pObj = gluNewQuadric();// ... Definições <strong>de</strong> estadosgluDeleteQuadric(pObj);8/10/2008 Leandro Tonietto 58/10/2008 Leandro Tonietto 61


Mo<strong>de</strong>lag<strong>em</strong> com quádricasFunções para <strong>de</strong>finição <strong>de</strong> estados:Estilo <strong>de</strong> <strong>de</strong>senho:gluQuadricDrawStyle(GLUquadricObj*obj, GLenum drawStyle)GLU_FILL, GLU_LINE, GLU_POINT eGLU_SILHOUETTENormais da superfície:gluQuadricNormals(GLUquadricObj *obj,GLenum normals)GLU_NONE, GLU_FLAT (normais dos vérticesperpendiculares as faces) e GLU_SMOOTH(pon<strong>de</strong>ra normais com as das facesadjacentes)Mo<strong>de</strong>lag<strong>em</strong> com quádricasFunções para <strong>de</strong>finição <strong>de</strong> estados:Orientação das normais:gluQuadricOrietantion(GLUquadricObj*obj, GLenum orientation)GLU_OUTSIDE e GLU_INSIDEConsi<strong>de</strong>rar texturização ou não:gluQuadricTexture(GLUquadricObj *obj,GLenum texture)GL_TRUE (consi<strong>de</strong>ra mapeamento <strong>de</strong> texturas) eGLU_FALSE (não consi<strong>de</strong>ra o mapeamento<strong>de</strong> textura).8/10/2008 Leandro Tonietto 78/10/2008 Leandro Tonietto 8Desenhando quadricas:Mo<strong>de</strong>lag<strong>em</strong> com quádricasEsferas:gluSphere(GLUquadricObj *obj,GLdouble radius, GLint slices, GLintstacks)Slices == gomos. Stacks == “ro<strong>de</strong>las”Desenhando quadricas:Mo<strong>de</strong>lag<strong>em</strong> com quádricasCilindros:gluCylin<strong>de</strong>r(GLUquadricObj *obj,GLdouble baseRadius, GLdoubletopRadius, GLdouble height, GLintslices, GLint stacks)topRadius == zero, permite criar cone.8/10/2008 Leandro Tonietto 98/10/2008 Leandro Tonietto 10Desenhando quadricas:Mo<strong>de</strong>lag<strong>em</strong> com quádricasDiscos:gluDisk(GLUquadricObj *obj, GLdoubleinnerRadius, GLdouble outerRadius,GLint slices, GLint loops)innerRadius != zero, permite criar discoscom furos.Vantagens:Mo<strong>de</strong>lag<strong>em</strong> com quádricasFacilida<strong>de</strong> <strong>de</strong> mo<strong>de</strong>lag<strong>em</strong> (criação,proprieda<strong>de</strong>s, composição e <strong>de</strong>senho)Desvantagens:Limitação <strong>de</strong> interação com o usuárioPo<strong>de</strong>-se tornar difícil a criação <strong>de</strong> um cenáriogran<strong>de</strong>.Limitação <strong>de</strong> formas mat<strong>em</strong>áticas8/10/2008 Leandro Tonietto 118/10/2008 Leandro Tonietto 122


Mo<strong>de</strong>lag<strong>em</strong> com quádricasProgramação:Variável <strong>de</strong> classe:Ex<strong>em</strong>plo SnowmanGLUquadriObj *obj;No init:obj = gluNewQuadric();No Ren<strong>de</strong>rScene (ou display):gluQuadricNormals(obj, GLU_SMOOTH);glTranslatef(x,y,z);gluSphere(obj, 5, 5, 5);No final da execução do main:gluDeleteQuadric (obj);8/10/2008 Leandro Tonietto 13Tarefa para ser feita <strong>em</strong> aulaUtilizando quádricas e formas primitivasmo<strong>de</strong>le os seguintes <strong>objeto</strong>s:Não é necessário mo<strong>de</strong>lar todos os <strong>de</strong>talhes, apenas os<strong>objeto</strong>s que dão a forma básica do <strong>objeto</strong>8/10/2008 Leandro Tonietto 14Curvas e Superfícies ParamétricasAlguns <strong>objeto</strong>s são muito complexos para ser<strong>em</strong>mo<strong>de</strong>lados com combinações <strong>de</strong> “primitivas”mat<strong>em</strong>áticas e com geometria <strong>de</strong>scritiva.Supondo que momento não há meios ou não se t<strong>em</strong> umaferramenta <strong>de</strong> mo<strong>de</strong>lag<strong>em</strong> disponível para criação <strong>de</strong>uma malha poligonal.Uma solução seria o uso <strong>de</strong> curvas, porém também nãohá como m<strong>em</strong>orizar todas as curvas possíveis necessáriaspara formar <strong>objeto</strong>s mais complexos.As vezes é necessário algum tipo <strong>de</strong> suporte ou controlepara permitir interação com usuário, no sentido <strong>de</strong>modificar completamente a forma geométricaaproximada.Solução: superfícies paramétricas.Curvas e Superfícies Paramétricas<strong>OpenGL</strong> dá suporte a curvas paramétricas.Conceitos:Para uma curva o parâmetro paramétrico é u.Para uma superfície são u e v.As curvas são representadas por pontos <strong>de</strong> controle esão avaliadas a cada instante u <strong>de</strong> t<strong>em</strong>po.Or<strong>de</strong>m da curva é dada pelo número <strong>de</strong> pontos; porex<strong>em</strong>plo, 2 pontos é uma <strong>de</strong> 2ª or<strong>de</strong>m, <strong>de</strong> 3 é <strong>de</strong> 3ªor<strong>de</strong>m, ...O grau é <strong>de</strong>terminado por: or<strong>de</strong>m da curva-1. Porex<strong>em</strong>plo: uma <strong>de</strong> 4ª or<strong>de</strong>m é uma <strong>de</strong> grau 3 (cúbica).Curvas cúbicas são <strong>de</strong> longe as mais utilizadas, pois as<strong>de</strong> maior or<strong>de</strong>m po<strong>de</strong>m produzir oscilaçõesin<strong>de</strong>sejadas ou até incontroláveis (muitavariação com mudanças mínimas).8/10/2008 Leandro Tonietto 158/10/2008 Leandro Tonietto 16Curvas e Superfícies ParamétricasContinuida<strong>de</strong>:Probl<strong>em</strong>as:Curvas com grau maior que três po<strong>de</strong>m produzircomportamento inesperado para a mo<strong>de</strong>lag<strong>em</strong>.Entretanto, uma curva cúbica não é suficiente pararepresentar uma curva “interessante”.Solução: conectar curvas. Mesma tangente na conexãoTipos ou graus <strong>de</strong>conexão(continuida<strong>de</strong>):Mesma tangente <strong>em</strong>esma taxa <strong>de</strong>variação da tangente8/10/2008 Leandro Tonietto 17Curvas <strong>em</strong> <strong>OpenGL</strong>Desenho <strong>de</strong> curvas <strong>em</strong> <strong>OpenGL</strong> é feito comEvaluators (avaliadores)Uma função avaliadora (evaluator function) éexecutada sobre os pontos <strong>de</strong> controle da curva paracada instante u.Elas avaliam pontos da curva dado um instante u da curva.Desenham curvas e superfícies Bézier.Processo é simples:1. Definir pontos <strong>de</strong> controle2. Criar uma matriz <strong>de</strong> cálculo (função para a curva):glMap1f().3. Habilitar evaluator e avaliar (<strong>de</strong>senhar) pontos da curva acada instante u. Comandos:glEnable(GL_MAP1_VERTEX_3) e glEvalCoord(u);Ver código da páginas 391—393 do livro <strong>OpenGL</strong> Superbible [1].8/10/2008 Leandro Tonietto 183


Curvas <strong>em</strong> <strong>OpenGL</strong>Alternativa para <strong>de</strong>senhar uma curva:Criar uma gra<strong>de</strong> e avaliar// 100 pontos <strong>de</strong> 0.0 a 100.0glMapGrid1d(100, 0.0, 100.0);// <strong>de</strong>senha linhas na gra<strong>de</strong>glEvalMesh1(GL_LINE, 0, 100);Abordag<strong>em</strong> mais simples, do que avaliar acurva ponto-a-ponto.Evaluator X grid:glMapGrid1d(100,0.0,100.0);glEvalMesh1(GL_LINE,0,100);Equivale a:glBegin(GL_LINE_STRIP);for(i = 0; i


NURBSProprieda<strong>de</strong>s para <strong>objeto</strong> NURBS:S<strong>em</strong>pre <strong>de</strong>ve ser passado sobre qual <strong>objeto</strong> NURBS será <strong>de</strong>finida aproprieda<strong>de</strong>.Espessura da superfície:gluNurbsProperty(pNurb, GLU_SAMPLING_TOLERANCE,25.0f);PreenchimentogluNurbsProperty(pNurb, GLU_DISPLAY_MODE,(GLfloat)GLU_FILL);// po<strong>de</strong> ser usado também GLU_OUTLINE_POLYGONDefinindo a superfície:gluBeginSurface(pNurb);gluNurbsSurface(pNurb,8, knots, // knots para u8, knots, // knots para v12, // distância entre pontos u3, // distância entre pontos v&crtl[0][0][0], // pontos <strong>de</strong> controle4, 4, // or<strong>de</strong>m da superfície <strong>em</strong> u e vGL_MAP2_VERTEX_3); // tipo <strong>de</strong> superfíciegluEndSurface(pNurb);// Pontos <strong>de</strong> controle:// x,y,z para u e v <strong>em</strong> quatro pontosGLfloat ctrl[4][4][3];//2 knots por ponto <strong>de</strong> controleGLfloat knots[8];NURBS8/10/2008 Leandro Tonietto 258/10/2008 Leandro Tonietto 26Ex<strong>em</strong>plo: páginas 404—405 do livro [1]NURBSTrimmingAparar ou tirar excessos <strong>de</strong> uma superfícies.Comum para aparar bordas da superfície. Também po<strong>de</strong>-se fazerburacos na superfície.Definir uma seqüência <strong>de</strong> pontos no domínio u e v no sentido horário(superfícies são <strong>de</strong>senhadas <strong>em</strong> sentido anti-horário)// valores entre 0 e 1 para u e vGLfloat points[][];Colocar <strong>de</strong>ntro do <strong>de</strong>senho da NURBS:glBeginTrim(pNurb);gluPwlCurve(pNurb,4,&points[0][0],2,GLU_MAP1_TRIM_2);glEndTrim(pNurb);Objeto Num. pontos pontos pontosdimensãoVer código da páginas 407—408 do livro <strong>OpenGL</strong> Superbible [1].8/10/2008 Leandro Tonietto 278/10/2008 Leandro Tonietto 28TessellationPor questões <strong>de</strong> complexida<strong>de</strong> performance,<strong>OpenGL</strong> garante apenas o tratamento <strong>de</strong>polígonos convexos. Os côncavos e complexos(com cruzamento <strong>de</strong> arestas ou com buracos),“não são manipulados” no <strong>OpenGL</strong>.Porém, as vezes é necessário...TessellationSolução trivial: quebrar <strong>em</strong> triângulos.Tarefa po<strong>de</strong> se tornar complexa <strong>de</strong> se fazermanualmente.GLU fornece o processo tessellation. Umtessellator é um <strong>objeto</strong> que subdivi<strong>de</strong> umpolígono complexo <strong>em</strong> vários triângulos.8/10/2008 Leandro Tonietto 298/10/2008 Leandro Tonietto 305


TessellationAssim como NURBS, <strong>de</strong>ve-se criar um <strong>objeto</strong>Tessellator:GLUtesselator *pTess;pTess = gluNewTess();. . .// Do some tessellation. . .gluDeleteTess(pTess);TessellationAssim como NURBS, <strong>de</strong>ve-se criar um <strong>objeto</strong>Tessellator:1. Criação do <strong>objeto</strong> Tessellator2. Definir proprieda<strong>de</strong>s.3. Iniciar polígono4. Iniciar contorno5. Seta vértices tessellator para o contorno6. Fim contorno7. Retorna ao passo 4 para mais contornos8. Fim do polígonoVer código da páginas 414—418 do livro <strong>OpenGL</strong> Superbible [1].8/10/2008 Leandro Tonietto 318/10/2008 Leandro Tonietto 32ExercíciosciosCriar uma superfície Bézier e permitir edição <strong>de</strong>pontos.Criar uma superfície NURBS e permitir a edição dospontos <strong>de</strong> controle e dos knots.Fazer a figura do mapa do RS habilitando 3possibilida<strong>de</strong>s <strong>de</strong> <strong>de</strong>senho: outline, preenchido eusando tesselation.Referências bibliográficas1. WRIGHT Jr., Richard S; LIPCHAK,Benjamin; HAEMEL, Nicholas. <strong>OpenGL</strong>Superbible: Comprehenive Tutorial andReference. 4 ed. Addison-Wesley, 2007.8/10/2008 Leandro Tonietto 338/10/2008 Leandro Tonietto 346

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!