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

professor.unisinos.br
  • No tags were found...

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

SumárioConstrução de objeto esuperfícies em OpenGLLeandro ToniettoComputação GráficaJogos Digitaisltonietto@unisinos.brhttp://www.inf.unisinos.br/~ltonietto/jed/cgr/constOpenGL.pdfout-08IntroduçãoModelagem com formas quádricasCurvas e superfícies em OpenGLEvaluatorsCurvas e superfícies BézierNURBSTrimmingTessellation8/10/2008 Leandro Tonietto 2Em OpenGL é possível modelarcombinando objetos pré-definidos.Formasquádricas.IntroduçãoContudo,objetos complexos requerem maiorcomplexidade matemática. OpenGL dásuporte a geração de curvas e superfíciesBézier e NURBS.Modelagem com quádricasDiversos objetos podem ser modeladosapenas com o uso de formas quádricas.Para tanto, basta combiná-las paracompor objetos mais complexos:Visualização de moléculas em 3D(combinando esferas e cilindros)Diversos objetos utilizados em jogos, comopor exemplos, armas, veículos, projéteis,edificações e etc.8/10/2008 Leandro Tonietto 38/10/2008 Leandro Tonietto 4Modelagem com quádricasExemplo simples em [1]:Modelagem com quádricasModelando com quádricas no OpenGL:Seguem modelo OO, mantendo um estadodo objeto “quádrico” na memória:1. Criar um objeto que representa o estado daquádrica deve ser mantido para definirpropriedades das quádricas.2. Definir propriedades para o objeto3. Desenhar a forma específicaGLUquadricObj *pObj;pObj = gluNewQuadric();// ... Definições de estadosgluDeleteQuadric(pObj);8/10/2008 Leandro Tonietto 58/10/2008 Leandro Tonietto 61


Modelagem com quádricasFunções para definição de estados:Estilo de desenho: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(pondera normais com as das facesadjacentes)Modelagem com quádricasFunções para definição de estados:Orientação das normais:gluQuadricOrietantion(GLUquadricObj*obj, GLenum orientation)GLU_OUTSIDE e GLU_INSIDEConsiderar texturização ou não:gluQuadricTexture(GLUquadricObj *obj,GLenum texture)GL_TRUE (considera mapeamento de texturas) eGLU_FALSE (não considera o mapeamentode textura).8/10/2008 Leandro Tonietto 78/10/2008 Leandro Tonietto 8Desenhando quadricas:Modelagem com quádricasEsferas:gluSphere(GLUquadricObj *obj,GLdouble radius, GLint slices, GLintstacks)Slices == gomos. Stacks == “rodelas”Desenhando quadricas:Modelagem com quádricasCilindros:gluCylinder(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:Modelagem com quádricasDiscos:gluDisk(GLUquadricObj *obj, GLdoubleinnerRadius, GLdouble outerRadius,GLint slices, GLint loops)innerRadius != zero, permite criar discoscom furos.Vantagens:Modelagem com quádricasFacilidade de modelagem (criação,propriedades, composição e desenho)Desvantagens:Limitação de interação com o usuárioPode-se tornar difícil a criação de um cenáriogrande.Limitação de formas matemáticas8/10/2008 Leandro Tonietto 118/10/2008 Leandro Tonietto 122


Modelagem com quádricasProgramação:Variável de classe:Exemplo SnowmanGLUquadriObj *obj;No init:obj = gluNewQuadric();No RenderScene (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 em aulaUtilizando quádricas e formas primitivasmodele os seguintes objetos:Não é necessário modelar todos os detalhes, apenas osobjetos que dão a forma básica do objeto8/10/2008 Leandro Tonietto 14Curvas e Superfícies ParamétricasAlguns objetos são muito complexos para seremmodelados com combinações de “primitivas”matemáticas e com geometria descritiva.Supondo que momento não há meios ou não se tem umaferramenta de modelagem disponível para criação deuma malha poligonal.Uma solução seria o uso de curvas, porém também nãohá como memorizar todas as curvas possíveis necessáriaspara formar objetos mais complexos.As vezes é necessário algum tipo de suporte ou controlepara permitir interação com usuário, no sentido demodificar completamente a forma geométricaaproximada.Solução: superfícies paramétricas.Curvas e Superfícies ParamétricasOpenGL 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 de controle esão avaliadas a cada instante u de tempo.Ordem da curva é dada pelo número de pontos; porexemplo, 2 pontos é uma de 2ª ordem, de 3 é de 3ªordem, ...O grau é determinado por: ordem da curva-1. Porexemplo: uma de 4ª ordem é uma de grau 3 (cúbica).Curvas cúbicas são de longe as mais utilizadas, pois asde maior ordem podem produzir oscilaçõesindesejadas 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étricasContinuidade:Problemas:Curvas com grau maior que três podem produzircomportamento inesperado para a modelagem.Entretanto, uma curva cúbica não é suficiente pararepresentar uma curva “interessante”.Solução: conectar curvas. Mesma tangente na conexãoTipos ou graus deconexão(continuidade):Mesma tangente emesma taxa devariação da tangente8/10/2008 Leandro Tonietto 17Curvas em OpenGLDesenho de curvas em OpenGL é feito comEvaluators (avaliadores)Uma função avaliadora (evaluator function) éexecutada sobre os pontos de 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 de controle2. Criar uma matriz de cálculo (função para a curva):glMap1f().3. Habilitar evaluator e avaliar (desenhar) 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 OpenGL Superbible [1].8/10/2008 Leandro Tonietto 183


Curvas em OpenGLAlternativa para desenhar uma curva:Criar uma grade e avaliar// 100 pontos de 0.0 a 100.0glMapGrid1d(100, 0.0, 100.0);// desenha linhas na gradeglEvalMesh1(GL_LINE, 0, 100);Abordagem 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


NURBSPropriedades para objeto NURBS:Sempre deve ser passado sobre qual objeto NURBS será definida apropriedade.Espessura da superfície:gluNurbsProperty(pNurb, GLU_SAMPLING_TOLERANCE,25.0f);PreenchimentogluNurbsProperty(pNurb, GLU_DISPLAY_MODE,(GLfloat)GLU_FILL);// pode 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 de controle4, 4, // ordem da superfície em u e vGL_MAP2_VERTEX_3); // tipo de superfíciegluEndSurface(pNurb);// Pontos de controle:// x,y,z para u e v em quatro pontosGLfloat ctrl[4][4][3];//2 knots por ponto de controleGLfloat knots[8];NURBS8/10/2008 Leandro Tonietto 258/10/2008 Leandro Tonietto 26Exemplo: páginas 404—405 do livro [1]NURBSTrimmingAparar ou tirar excessos de uma superfícies.Comum para aparar bordas da superfície. Também pode-se fazerburacos na superfície.Definir uma seqüência de pontos no domínio u e v no sentido horário(superfícies são desenhadas em sentido anti-horário)// valores entre 0 e 1 para u e vGLfloat points[][];Colocar dentro do desenho 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 OpenGL Superbible [1].8/10/2008 Leandro Tonietto 278/10/2008 Leandro Tonietto 28TessellationPor questões de complexidade performance,OpenGL garante apenas o tratamento depolígonos convexos. Os côncavos e complexos(com cruzamento de arestas ou com buracos),“não são manipulados” no OpenGL.Porém, as vezes é necessário...TessellationSolução trivial: quebrar em triângulos.Tarefa pode se tornar complexa de se fazermanualmente.GLU fornece o processo tessellation. Umtessellator é um objeto que subdivide umpolígono complexo em vários triângulos.8/10/2008 Leandro Tonietto 298/10/2008 Leandro Tonietto 305


TessellationAssim como NURBS, deve-se criar um objetoTessellator:GLUtesselator *pTess;pTess = gluNewTess();. . .// Do some tessellation. . .gluDeleteTess(pTess);TessellationAssim como NURBS, deve-se criar um objetoTessellator:1. Criação do objeto Tessellator2. Definir propriedades.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 OpenGL Superbible [1].8/10/2008 Leandro Tonietto 318/10/2008 Leandro Tonietto 32ExercíciosciosCriar uma superfície Bézier e permitir edição depontos.Criar uma superfície NURBS e permitir a edição dospontos de controle e dos knots.Fazer a figura do mapa do RS habilitando 3possibilidades de desenho: outline, preenchido eusando tesselation.Referências bibliográficas1. WRIGHT Jr., Richard S; LIPCHAK,Benjamin; HAEMEL, Nicholas. OpenGLSuperbible: Comprehenive Tutorial andReference. 4 ed. Addison-Wesley, 2007.8/10/2008 Leandro Tonietto 338/10/2008 Leandro Tonietto 346

More magazines by this user
Similar magazines