VGA – Tutorial 20 – Denthor

--==[ PARTE 20 ]==--

Autor: DENTHOR do ASPHYXIA
Atualizado por Snowman
Traduzido por Krull >>> tradução revisada e atualizada em 2020

Para obter os programas mencionados neste tutorial, por favor baixe o zip com a versão antiga do tutorial, neste link.

Introdução

Olá a todos! Passou bastante tempo desde o último tutorial (como tenho certeza de que vocês notaram). Muita coisa aconteceu entre o último tutorial e agora… mas não vou incomodar com os detalhes 😉 Eu tenho um emprego full-time agora, programando em C++.

Eu assumi a produção do PCGPE do Mark Feldman. Ele está enviando todos os artigos escritos até agora, e assim que eu os tiver, vou trabalhar em lançar o PCGPE II. Mark está trabalhando no Windows GPE.

Este treinamento é sobre remoção de faces ocultas em 3d e ordenação de faces. Eu ia colocar também shading, mas dá pra esperar até um tutorial mais pra frente. Por conveniência, vou programar sobre o código de 3D do tutorial 16 (?). A matemática de remoção de faces é meio “mágica”, mas apenas pense nas suas aulas de trigonometria da oitava série.

Notei que, durante minha ausência, uma ou duas pessoas começaram suas próprias séries de treinamentos. Leia a Hornet DemoNews para ver uma boa coluna do Trixter falando sobre alguns efeitos de demos mais difíceis.

Bem, vamos continuar com o treinamento!

Se você gostaria de me contactar, ou ao time, há muitos modos que você pode fazê-lo: 1) Escrever uma mensagem para Grant Smith/Denthor/Asphyxia em email privado na ASPHYXIA BBS.
2) Escrever para:
Grant Smith
P.O.Box 270 Kloof
3640
Natal
África do Sul
3) Ligar para mim (Grant Smith) no número (031) 73 2129 (deixe uma mensagem se você ligar quando eu estiver na faculdade) Ligue para +27-31-73-2129 se você está ligando de fora da África do Sul (A conta é sua ;-))
4) Escrever para denthor@beastie.cs.und.ac.za
5) Escrever para asphyxia@beastie.cs.und.ac.za para falar com todos nós de uma vez.

OBS1 : Se você é um representante de uma companhia ou BBS e quer que a ASPHYXIA faça um demo para você, mande um email pra mim; podemos discutir.
OBS2 : Se você fez/tentou fazer um demo, MANDE PARA MIM! Estamos nos sentindo muito solitários e queremos encontrar/ajudar/trocar código com outros grupos de demos. O que você tem a perder? Mande uma mensagem aqui e podemos ver como transferir. Nós realmente queremos ouvir de você.

http://goth.vironix.co.za/~denthor (WWW)
ftp.eng.ufl.edu pub/msdos/demos/code/graph/tutor (FTP)

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Ordenação de Faces

Há muitos modos de ordenar faces num objeto 3d. Por enquanto, vou mostrar o mais fácil de todos.

Digamos que você tenha dois polígonos…

            ------P1

       ------------------P2

               Olho

Como você pode ver, P1 tem que ser desenhado antes de P2. O modo mais fácil de fazer isso é o seguinte:

No início, ache o ponto médio de cada polígono, por meio dessas equações fáceis:

    x = (P2.1.x + P2.2.x + P2.3.x + p2.4.x)/4
    y = (P2.1.y + P2.2.y + P2.3.y + p2.4.y)/4
    z = (P2.1.z + P2.2.z + P2.3.z + p2.4.z)/4

NOTA: Para um triângulo, você obviamente usaria só três pontos e dividiria por três.

De qualquer modo, agora você tem X,Y,Z do ponto médio do polígono. Você pode então rotacionar esse ponto com os outros. Quando chegar a hora de desenhar, você pode comparar o Z resultante do ponto médio, ordenar todos os itens Z, e então desenhá-los de trás pra frente.

No programa de amostra eu usei um bubble sort simples… basicamente, eu comparo os dois primeiros valores, e os troco se o primeiro for maior que o segundo. Eu continuo assim para todos os números, até que consiga percorrer a lista toda sem precisar de trocar uma vez. Os métodos de “bubble sort” (ou, “ordenação por bolha”) são tópicos de sétima série em computação… pegue um livro emprestado para saber mais sobre métodos de ordenação e outros métodos (melhores).

Isso aí em cima não é perfeito, mas deveria funcionar em 90% dos casos. Mas ainda quer dizer que quando você está desenhando um cubo, você tem que desenhar as 6 faces a cada frame, embora só três deles ou algo assim, serão visíveis. É aí que entra a remoção de faces ocultas…

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Remoção de Faces Ocultas

Pegue algo quadrado. Um disquete seria uma boa. Ponha-o de frente para você, e numere os cantos de um a quatro, na direção dos ponteiros do relógio.

            1 +-------------+ 2
              |             |
              |             |
              |             |
              |             |
            4 +-------------+ 3

Agora rode o disco em todos os três eixos, certificando que você ainda pode ver a parte da frente dele. Você vai notar que, enquanto você estiver vendo a parte da frente do disco, os quatro pontos ainda estarão em ordem. Agora, rode o disco, de modo a ver a parte de trás dele. Seus pontos agora vão ser:

            2 +-------------+ 1
              |             |
              |             |
              |             |
              |             |
            3 +-------------+ 4

Os pontos agora estão no sentido anti-horário! Isso significa, de modo simples, que se você definir todos os pontos do seu polígono no sentido horário, quando for desenhar você ignora os que são “anti-horários”. (obviamente, quando você define o objeto 3d, você define que os polígonos com face pra longe de você como sendo os “anti-horários”)

Para calcular se os pontos de um polígono estão no sentido horário ou não, precisamos achar sua Normal. Aqui é que as coisas começam a ficar
divertidas.

Na escola, disseram a você que uma Normal é perpendicular a um plano. Em Ascii:

                  | Normal
                  |
                  |
    --------------------------- Polígono

Como você pode ver, a Normal fica a 90 graus da superfície do polígono. Devemos estender isso para três dimensões de nossos polígonos. Você vai ter que acreditar em mim, eu não consigo desenhar isso em ASCII 🙂

Para calcular uma Normal, você só precisa de três pontos do seu polígono (ABC):
A(x0,y0,z0), B(X1,Y1,Z1), C(X2,Y2,Z2)

então o vetor normal = AB^AC = (Xn,Yn,Zn) com
Xn=(y1-y0)(z0-z2)-(z1-z0)(y0-y2)
Yn=(z1-z0)(x0-x2)-(x1-x0)(z0-z2)
Zn=(x1-x0)(y0-y2)-(y1-y0)(x0-x2)

Estamos interessados no Z Normal, então usaremos a função:
normal:=(x1-x0)(y0-y2)-(y1-y0)(x0-x2);

O resultado é algo como uma onda de senos (senóide) quando você rotaciona o polígono nas três dimensões. Um valor negativo significa que o polígono está de frente para você, um valor positivo, que está apontando pra longe.

Isso significa que com duas meras multiplicações você pode descontar um polígono inteiro e não desenhá-lo. Esse método é perfeito para objetos “fechados”, como cubos, etc.

Eu posso ser qualquer coisa, menos um professor de matemática, então pegue um livro de matemática de alguém para saber mais da Normal de superfícies. Confie em mim, há muito mais escrito sobre elas do que você pensa.

Uma extensão além de calcular sua Normal seria aprender sobre fontes de luz para seus polígonos. Espere por mais informações nos próximos tutoriais.

Uma combinação das duas rotinas acima funcionaria muito bem para criar objetos 3D com pouca ou nenhuma sobreposição. O arquivo de exemplo vai te mostrar os dois métodos e como eles funcionam bem.

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Fechando

Como você pode ver, aquilo foi bem fácil. Tenho algumas poucas ideias para o tutorial 21, então espere por ele. Fique de olho no PCGPE ][ também (mas não me escreva perguntando quando é que fica pronto! Já tenho muitos emails desses! 😉 )

Minha irmã se casou há poucos dias. O pior disso é que tive que cortar o cabelo. Meu cabelo era bem comprido (um pouco maior que na foto no meu site), e isso é deprimente. De qualquer modo, o casamento foi legal, então não foi uma grande perda.

Espero que o tutorial 21 e possivelmente o 22 saiam antes do Natal, mas estarei de férias a partir do dia 18. Estarei na Cidade do Cabo antes do Natal por uma ou duas semanas, então se você estiver lá, vou te encontrar no teleférico 🙂

Eu escrevi uma quote para esse tutorial, mas decidi que não gostei dela. Vou tentar fazer uma melhor no tutorial 21 😉

Byeeeee…..

  • Denthor
    14-12-95
  • Krull

A Nova Krull's HomePage