Master class "Bolas de Natal" feitas de papel com suas próprias mãos. Esfera de dois triângulos

Triângulo esférico e sua aplicação.

triângulo esférico- uma figura geométrica na superfície de uma esfera, formada pela interseção de três grandes círculos. Três grandes círculos na superfície de uma esfera que não se cruzam em um ponto formam oito triângulos esféricos. Um triângulo esférico, cujos lados são menores que a metade do grande círculo, é chamado de Euler.

O lado de um triângulo esférico é medido pelo valor do ângulo central baseado nele. O ângulo de um triângulo esférico é medido pelo valor do ângulo diedro entre os planos nos quais os lados desse ângulo se encontram. As relações entre elementos de triângulos esféricos são estudadas por trigonometria esférica.

Propriedades de um triângulo esférico:

  1. Além das três condições para a igualdade de triângulos planos, mais uma é verdadeira para triângulos esféricos: dois triângulos esféricos são iguais se seus ângulos correspondentes forem iguais.
  2. Para os lados de um triângulo esférico, valem 3 desigualdades triangulares: cada lado é menor que a soma dos outros dois lados e maior que sua diferença.
  3. A soma de todos os lados a + b + c é sempre menor que 2πR.
  4. A quantidade 2πR − (a + b + c) é chamada de defeito esférico
  5. A soma dos ângulos de um triângulo esférico s = α + β + γ é sempre menor que 3π e maior que π
  6. A quantidade é chamada de excesso esférico ou excesso esférico
  7. A área de um triângulo esférico é determinada pela fórmula.
  8. Ao contrário de um triângulo plano, um triângulo esférico pode ter dois ou até três ângulos de 90° cada.

Entre todos os polígonos esféricos, o mais interessante é o triângulo esférico. Três grandes círculos, intersectando-se em pares em dois pontos, formam oito triângulos esféricos na esfera. Conhecendo os elementos (lados e ângulos) de um deles, você pode determinar os elementos de todos os outros, portanto, considere a relação entre os elementos de um deles, aquele em que todos os lados são menores que a metade do grande círculo. Os lados do triângulo são medidos pelos ângulos planos do ângulo triédrico OABS, os ângulos do triângulo são medidos pelos ângulos diedros do mesmo ângulo triédrico, ver Fig.

As propriedades dos triângulos esféricos diferem em muitos aspectos das propriedades dos triângulos no plano. Assim, aos conhecidos três casos de igualdade de triângulos retângulos, um quarto é adicionado: dois triângulos ABC e A`B`C` são iguais se os três ângulos PA = RA`, PB = PB`, PC = PC ` são iguais, respectivamente. Assim, triângulos semelhantes não existem na esfera; além disso, na geometria esférica não há conceito de similaridade em si, uma vez que não há transformações que alterem todas as distâncias pelo mesmo número (diferente de 1) de vezes. Essas características estão associadas à violação do axioma euclidiano sobre linhas paralelas e também são inerentes à geometria de Lobachevsky. Triângulos que possuem elementos iguais e orientações diferentes são chamados de simétricos, como, por exemplo, os triângulos AC`C e BCC`

A soma dos ângulos de qualquer triângulo esférico é sempre maior que 180°. A diferença RA + RV + RS - p \u003d d (medido em radianos) - é um valor positivo e é chamado de excesso esférico de um determinado triângulo esférico. Área de um triângulo esférico: S = R2 d onde R é o raio da esfera e d é o excesso esférico. Esta fórmula foi publicada pela primeira vez pelo holandês A. Girard em 1629 e recebeu o seu nome.

Se considerarmos um diagonal com ângulo a, então em 226 = 2p/n (n é um número inteiro), a esfera pode ser cortada em exatamente n cópias de tal digon, e a área da esfera é 4pR2 = 4p em R = 1, então a área do digon é 4p/n = 2a. Esta fórmula também é verdadeira para a = 2pt/n e, portanto, é verdadeira para todo a. Se continuarmos os lados do triângulo esférico ABC e expressarmos a área da esfera em termos das áreas dos diagonais formados neste caso com os ângulos A, B, C e sua própria área, podemos chegar ao acima Fórmula de Girard.

Por um triângulo esférico entende-se um triângulo na superfície de uma esfera, composto de arcos de grandes círculos - isto é, tais círculos, cujo centro é o centro da esfera. Os ângulos de um triângulo esférico são os ângulos entre as tangentes aos seus lados desenhados em seus vértices. Como os ângulos de um triângulo regular, eles variam de 0 a 180°. Ao contrário de um triângulo plano, um triângulo esférico não tem uma soma de ângulos igual a 180°, mas mais: é fácil verificar isso considerando, por exemplo, um triângulo formado por arcos de dois meridianos e o equador em um globo: embora os meridianos convirjam no pólo, ambos são perpendiculares ao equador e, portanto, esse triângulo tem dois ângulos retos!

Um triângulo esférico pode ter dois ângulos retos

Já o indiano Varahamihira (séculos V-VI), os matemáticos e astrônomos árabes do século IX. (Sabit ibn Korra, al-Battani), e entre os matemáticos ocidentais, a partir de Regiomontanus (século XV), existe um maravilhoso teorema sobre triângulos esféricos em várias formulações. Aqui está como ele pode ser formulado em notação moderna:

cosa = cosbcosc + sinbsinccosA. O teorema do cosseno esférico é muito importante tanto para a astronomia quanto para a geografia. Este teorema permite usar as coordenadas de duas cidades A e B para encontrar a distância entre elas. Além disso, o teorema do cosseno esférico ajudou os matemáticos dos países islâmicos a resolver outro problema prático: em uma cidade com coordenadas dadas, encontre a direção para a cidade sagrada de Meca (todo muçulmano ortodoxo deve rezar cinco vezes ao dia na direção de Meca) . Ao resolver este problema, considerando a cidade B como Meca, foi necessário encontrar o ângulo A do mesmo triângulo.

Uma página da "Coleção de Regras para a Ciência da Astronomia", século 11, autor desconhecido.

Em astronomia, o teorema do cosseno esférico permite que você se mova de um sistema de coordenadas na esfera celeste para outro. Três desses sistemas são usados ​​com mais frequência: em um, o equador celeste serve como equador e os pólos do mundo servem como pólos, em torno dos quais ocorre a rotação diária visível das luminárias; no outro, o equador é a eclíptica - o círculo ao longo do qual o movimento visível do Sol contra o fundo das estrelas ocorre durante o ano; no terceiro, o papel do equador é desempenhado pelo horizonte, e o papel dos pólos é desempenhado pelo zênite e nadir. Em particular, graças ao teorema do cosseno esférico, é possível calcular a altura do Sol acima do horizonte em diferentes momentos e em diferentes dias do ano.

As velas na arquitetura são um triângulo esférico, proporcionando uma transição de um espaço de cúpula quadrada para uma circunferência de cúpula. Vela, pandativa (do francês pendentif) - parte da abóbada, um elemento da estrutura da cúpula, através da qual é feita a transição da base retangular para o teto da cúpula ou seu tambor. A vela tem a forma de um triângulo esférico, com o vértice para baixo, e preenche o espaço entre os arcos de mola que ligam os pilares adjacentes do quadrado abobadado. As bases dos triângulos esféricos das velas juntas formam um círculo e distribuem a carga da cúpula ao longo do perímetro dos arcos.

Cúpula em velas pintura de vela

George Nelson

"O designer pode relaxar e se divertir; o resultado pode ser uma piada, diversão. É incrível como muitas vezes isso é uma diversão muito significativa." George Nelson

George Nelson é um designer, arquiteto, crítico e teórico do design americano. (1908, Hartford, Connecticut - 1986, Nova York)

Ele projetou luminárias, relógios, móveis, embalagens e estava envolvido em design de exposições.

Os projetos de design mais famosos de George Nelson são a estilização magistral de formas geométricas no espírito da op art ou abstracionismo geométrico.

O designer constrói a forma de sua famosa cadeira preta com base em um triângulo esférico, que foi amplamente utilizado nas estruturas arquitetônicas de estruturas abobadadas. Em particular, nas igrejas bizantinas e russas, esse triângulo esférico era chamado de "vela". Graças à “vela”, foi realizada uma transição suave do suporte da cúpula para a cúpula.

George Nelson (George Harold Nelson, 1908-1986)

Gravura de Escher

Esferas concêntricas 1935. Gravação final 24 por 24 cm.

Quatro esferas concêntricas ocas são iluminadas por uma fonte de luz central. Cada esfera consiste em uma grade formada por nove grandes anéis que se cruzam; eles dividem a superfície esférica em 48 triângulos esféricos semelhantes. Maurits Cornelis Escher (holandês. Maurits Cornelis 17 de junho de 1898, Leeuwarden, Holanda - 27 de março de 1972, Laren, Holanda) - artista gráfico holandês.

Aplicação do triângulo esférico:

  1. Uso de triângulos esféricos em gráficos 3D
  2. Em astronomia
  3. Na geografia. O teorema do triângulo esférico permite que você use as coordenadas de duas cidades A e B para encontrar a distância entre elas.
  4. Na arquitetura
  5. Design de cadeira por George Nelson
  6. Em gravura

Trigonometria esférica

triângulos esféricos. Na superfície de uma bola, a distância mais curta entre dois pontos é medida ao longo da circunferência de um grande círculo, ou seja, um círculo cujo plano passa pelo centro da bola. Vértices de um triângulo esférico são os pontos de intersecção dos três raios que emergem do centro da bola e da superfície esférica. Partidos uma, b, c de um triângulo esférico são os ângulos entre os raios que são menores (se um desses ângulos é igual, então o triângulo esférico degenera em um semicírculo de um grande círculo). Cada lado do triângulo corresponde a um arco de um grande círculo na superfície da bola (veja a figura).

cantos UMA, B, C triângulo esférico lados opostos uma, b, c respectivamente, são, por definição, menores que , os ângulos entre os arcos de grandes círculos correspondentes aos lados do triângulo, ou os ângulos entre os planos definidos por esses raios.

Trigonometria esférica trata do estudo da relação entre os lados e os ângulos de triângulos esféricos (por exemplo, na superfície da Terra e na esfera celeste). No entanto, físicos e engenheiros em muitos problemas preferem usar transformações de rotação em vez de trigonometria esférica.

Propriedades dos triângulos esféricos. Cada lado e ângulo de um triângulo esférico é, por definição, menor que .

A geometria na superfície da bola não é euclidiana; em cada triângulo esférico a soma dos lados está entre 0 e , a soma dos ângulos está entre e . Em todo triângulo esférico, o ângulo maior fica oposto ao lado maior. A soma de quaisquer dois lados é maior que o terceiro lado, a soma de quaisquer dois ângulos é menor que mais o terceiro ângulo.

Triângulo esférico e fórmulas básicas de trigonometria esférica

Muitos problemas em astronomia relacionados com as posições e movimentos aparentes dos corpos celestes são reduzidos à resolução de triângulos esféricos.

Um triângulo esférico é uma figura ABC na superfície de uma esfera, formada por arcos de três grandes círculos (Fig. 15).

Os ângulos de um triângulo esférico são os ângulos diedros entre os planos dos grandes círculos que formam os lados do triângulo esférico. Esses ângulos são medidos pelos ângulos planos nos vértices do triângulo entre as tangentes aos seus lados.

Geralmente são considerados triângulos, cujos ângulos e lados são menores que 180°. Para esses triângulos esféricos, a soma dos ângulos é sempre maior que 180°, mas menor que 540°, e a soma dos lados é sempre menor que 360°. A diferença entre a soma dos três ângulos de um triângulo esférico e 180° é chamada de excesso esférico σ, ou seja,

σ = DA + DB + DC - 180°.

A área de um triângulo esférico s é

Onde R é o raio da esfera na superfície da qual o triângulo é formado.

Um triângulo esférico, portanto, difere em suas propriedades de um plano, e é impossível aplicar fórmulas de trigonometria a ele em um plano.

Tome um triângulo esférico ABC (Fig. 15), formado sobre uma esfera de raio R e centrado no ponto O.

Do vértice A traçamos as tangentes AD e AE aos lados b e c até se cruzarem com as extensões dos raios OS e 0B, que se encontram no mesmo plano da tangente correspondente. Conectando os pontos diretos de interseção de D e E, obtemos dois triângulos oblíquos planos ADE e ODE com um lado DE comum. Aplicando teoremas de geometria elementar a esses triângulos, escrevemos:

DE 2 \u003d OD 2 + OE 2 - 2OD × OE × cos a,

DE 2 \u003d AD 2 + AE 2 - 2AD × AE × cos A.

Subtraindo a segunda equação da primeira, obtemos:

2OD × OE × cos a \u003d OD 2 - AD 2 + OE 2 - AE 2 + 2AD × AE × cos A. (1,31)

Dos triângulos planos de ângulo reto OAE e OAD segue:

OD 2 -AD 2 =R 2 ;OE 2 -AE 2 =R 2 ;

AD = Rtgb; AE = Rtgs;

Substituindo essas relações na fórmula (1.31) e fazendo as reduções e transferências correspondentes, obtemos

cos a \u003d cos b cos c + sen b sen c cos A, (1,32)

Essa. o cosseno de um lado de um triângulo esférico é igual ao produto dos cossenos de seus outros dois lados mais o produto dos senos dos mesmos lados pelo cosseno do ângulo entre eles.

A fórmula (1.32) pode ser escrita para qualquer lado do triângulo. Vamos escrevê-lo, por exemplo, para o lado b:

cos b = cos com cos a + sen com sen a cos B

e, substituindo cos a na fórmula (1.32), obtemos

cos b = cos c (cos b cos c + sen b sen c cos A) + sen c sen a cos B.

Expandindo os colchetes e movendo o primeiro termo do lado direito para a esquerda, teremos:

cos b (1 - cos 2 s) \u003d sin b sin com cos com cos A + sin c sin a cos B.

Substituindo (1 - cos 2 s) por sen 2 s e reduzindo tudo por sen c, obtemos finalmente

sin a cos B \u003d sinc cos b - cos c sin b cos A, (1.33)

Essa. o produto do seno do lado pelo cosseno do ângulo incluído é igual ao produto do seno do outro lado que limita o ângulo incluído pelo cosseno do terceiro lado menos o produto do cosseno do lado que limita o incluído ângulo pelo seno do terceiro lado e o cosseno do ângulo oposto ao primeiro lado.

A fórmula (1.33) é chamada de fórmula dos cinco elementos. Pode ser escrito por analogia para os produtos de sen a cos C, sen b cos A, sen b cos C, sen com cos A e sen com cos B.

Resolvemos agora a igualdade (1.32) em relação ao cos A:

Ao elevar ao quadrado os dois lados da última igualdade e subtraí-los de 1, obtemos:

Abrindo os colchetes e dividindo ambas as partes desta expressão por sen 2 a, obtemos

A expressão resultante é perfeitamente simétrica em relação a a, b e c, e substituindo A por B e b ou A por C e a por c, escrevemos

Essa. os senos dos lados de um triângulo esférico são proporcionais aos senos de seus ângulos opostos; ou a razão entre o seno de um lado de um triângulo esférico e o seno do ângulo oposto é uma constante.

As três relações derivadas (1.32), (1.33), (1.34) entre os lados e os ângulos de um triângulo esférico são as principais; muitas outras fórmulas de trigonometria esférica podem ser derivadas deles. Limitamo-nos a derivar apenas uma fórmula para um triângulo esférico de ângulo reto. Seja A = 90°; então sin A \u003d 1, cos A \u003d 0, e da fórmula (1.33) obtemos

sin a cos B \u003d sin com cos b.

Dividindo ambas as partes desta igualdade por sen b e substituindo, conforme (1.34), teremos:

ctg B = sen c ctg b

Essa. a razão entre a tangente de um cateto de um triângulo esférico retângulo e a tangente do ângulo oposto é igual ao seno do outro cateto.

Para representar informações sobre uma imagem em uma esfera gaussiana em um computador, faz sentido dividir sua superfície em células.

Nesse caso, a área dessa parte da superfície original, que está orientada dentro do cone de direções determinado pela célula de partição, está associada a cada célula. Essa aproximação discreta da imagem esférica estendida é chamada de histograma de orientação. Idealmente, as células devem atender aos seguintes requisitos:

Ter a mesma área;

Seja a mesma forma

Esteja regularmente espaçado;

Têm uma forma arredondada;

O particionamento deve fornecer uma resolução angular suficientemente boa;

Deve haver rotações que levem a partição para si.

As células alongadas devem ser excluídas, pois corresponderão a informações sobre áreas de superfície, cuja orientação muda mais do que no caso de células mais arredondadas da mesma área. Ao mesmo tempo, se as células estiverem dispostas regularmente, sua localização em relação às vizinhas será a mesma para todas as células, e tais configurações são altamente desejáveis. Infelizmente, não é possível atender a todos esses requisitos ao mesmo tempo.

Uma das possíveis partições é formada por cinturões latitudinais, cada um dos quais subdividido por faixas meridionais (Fig. 16.13). As células resultantes podem ser quase iguais em área se o número de tais bandas em altas latitudes for reduzido. Uma das vantagens de tal esquema é a simplicidade de encontrar uma célula à qual é necessário atribuir uma certa normal à superfície. No entanto, tal método está muito longe de satisfazer os requisitos listados acima. Por exemplo, não há rotações com as quais a partição construída da esfera é traduzida em si mesma (exceto rotações em torno do eixo que conecta os pólos).

Partições mais adequadas podem ser obtidas projetando na esfera unitária poliedros regulares cujos centros coincidem com o centro da esfera. As faces de um poliedro regular são polígonos regulares (e são todos iguais). Portanto, a partição obtida pela projeção de um poliedro regular tem a propriedade de que todas as células tenham a mesma forma e área. Além disso, o arranjo geométrico de todas as células em relação aos seus vizinhos é o mesmo. Infelizmente,

Arroz. 16.13. A divisão de uma esfera em elementos por meridianos e paralelos. Infelizmente, essa partição tem apenas algumas das propriedades necessárias para armazenar um histograma de orientação.

Arroz. 16.14. (ver scan) Projetar um dodecaedro e um icosaedro em uma única esfera para obter uma partição em e células.

apenas cinco corpos regulares são conhecidos, dos quais se deve escolher (tetraedro, hexaedro, octaedro, dodecaedro e icosaedro). Para um dodecaedro, as células são bastante arredondadas (Fig. 16.14, a). O dodecaedro, no entanto, tem apenas doze faces. Mesmo o icosaedro dá uma representação muito grosseira da orientação (Figura 16.14b). Além disso, vinte de suas células não são muito arredondadas.

Podemos ir mais longe e considerar poliedros semi-regulares. Suas faces também são polígonos regulares, mas não necessariamente iguais. As áreas de todas as faces não são iguais. Em alguns casos, é possível construir um novo poliedro que tenha a mesma topologia de conexões entre faces do poliedro semirregular original, mas cujas áreas das faces sejam iguais. Em que

Arroz. 16.15. a - um icosaedro truncado, que é um poliedro semi-regular com 32 faces; b - penta para decaedro, composto por 60 faces triangulares. Partições menores da superfície da esfera unitária podem ser baseadas em tais poliedros semiregulares.

Arroz. 16.16. Capacidade de construir redes geodésicas com base em qualquer uma das projeções de poliedros regulares ou semi-regulares.

Cada face é subdividida em células triangulares. A rede mostrada aqui é baseada no icosaedro e possui 12 vértices, que são adjacentes a 5 células. Seis células convergem nos vértices restantes.

a forma de alguns rostos não está mais correta. Um exemplo de partição baseada em um poliedro semi-regular dá uma bola de futebol (Fig. 16.15, a). O icosaedro truncado, ou seja, um corpo com 12 faces pentagonais e 20 hexagonais, é tomado como inicial. Infelizmente, existem apenas 13 poliedros semi-regulares (cinco poliedros regulares truncados, o cuboctaedro, icosidodecaedro, cubo arrebitado, icosidodecaedro arrebitado, cuboctaedro truncado, rombicuboctaedro, icosidodecaedro truncado e rombicosidodecaedro). Eles não levam a partições pequenas o suficiente para nossos propósitos.

Se ainda quisermos obter uma partição mais fina, podemos tentar decompor a existente em elementos triangulares. Por exemplo, se quebrarmos cada uma das faces pentagonais do dodecaedro em cinco triângulos iguais, obtemos um pentadodecaedro com 60 faces (Fig. 16.15, b). Ohm é dual ao icosaedro truncado.

Prosseguindo na mesma direção, cada um dos triângulos resultantes pode ser subdividido em quatro triângulos menores, em plena conformidade com as estruturas abobadadas bem conhecidas na geodésia (Fig. 16.16). Ao relaxar alguns dos requisitos acima, a alta resolução pode ser alcançada. Na verdade, é melhor usar construções duais, já que suas faces são predominantemente hexágonos (irregulares) com 12 pentágonos espalhados entre eles (Fig. 16.15, b). Partições arbitrariamente pequenas podem ser fornecidas dessa maneira.

Para usar esta abordagem, é necessário ser capaz de determinar eficientemente o elemento que corresponde a uma dada normal à superfície. No caso de partições obtidas com base em politopos regulares, é fácil calcular os cossenos dos ângulos entre um dado vetor unitário e os vetores correspondentes aos centros das células. (Este último corresponde aos vértices da dupla

poliedro regular.) Então o vetor dado é atribuído à célula cujo centro está mais próximo. No caso de uma partição semelhante a uma rede geodésica, é possível atuar de forma hierárquica. Tal partição é baseada em algum poliedro regular. A célula com o centro mais próximo é encontrada conforme descrito acima. Depois disso, determinamos em qual dos triângulos que o subdividem, o vetor normal unitário se encaixa. Esse processo continua para os próximos quatro triângulos que subdividem o encontrado, e assim por diante.Na prática, podem ser usados ​​métodos de consulta de tabelas que, embora não sejam precisos, são muito rápidos.

Seja o ângulo sólido preenchido por uma célula na esfera (no caso do icosaedro). O número esperado de normais que caem dentro de tal célula para um objeto convexo é

É claro que o histograma de orientação, ou seja, a aproximação discreta da imagem esférica estendida, pode ser calculado localmente. Simplesmente contamos o número de normais que pertencem a cada célula. Ao mesmo tempo, a curvatura gaussiana é expressa em termos da primeira e segunda derivadas parciais da função que define a superfície. Na prática, as estimativas dessas derivadas não são confiáveis ​​devido à presença de ruído. Portanto, o fato de que a imagem esférica estendida pode ser calculada sem calcular derivadas é muito importante.

A história desta demo é a seguinte: uma vez um amigo meu fez um gerador de mapa planetário para seu jogo e queria que os mapas criados dessa forma fossem mostrados como uma esfera giratória. No entanto, ao mesmo tempo, ele não queria usar gráficos 3D, mas gerava muitos quadros com essa mesma esfera girada em ângulos diferentes. A quantidade de memória utilizada era... digamos, excessiva, mas a velocidade de geração de quadros (assim como a qualidade de sua execução) sofreu muito. Depois de pensar um pouco, consegui ajudá-lo a otimizar esse processo, mas em geral tive a sensação justa de que essa era uma tarefa para OpenGL, e não para gráficos 2D.

E assim, um dia, atormentado pela insônia, decidi tentar combinar essas duas abordagens: desenhar uma esfera giratória (com um mapa de planeta esticado sobre ela) através do OpenGL, mas ao mesmo tempo deixando-a plana.

E devo dizer que consegui. Mas as primeiras coisas primeiro.

Matemática do Processo

Para começar, vamos definir a tarefa real. Para cada ponto na tela, temos duas coordenadas de tela no sistema de coordenadas cartesianas, e precisamos encontrar as coordenadas esféricas para ele (na verdade, latitude e longitude), que, na verdade, são as coordenadas de textura para o mapa do planeta.

Então. A transição de um sistema de coordenadas esférico para um cartesiano é dado por um sistema de equações (retirado da Wikipedia):

E a transição reversa - com essas equações:

Coordenada Z podemos sair facilmente X e S, conhecendo o raio, e podemos tomar o próprio raio igual a um.
No futuro, concordaremos que mudaremos ligeiramente as equações acima, trocando os conceitos S(para nós será uma tela vertical) e Z(esta será a profundidade da cena).

Parte técnica

A implementação da ideia exigirá que usemos um quad (já falo sobre como usá-lo, então não vou repeti-lo, principalmente porque abaixo está um link para o código-fonte completo do projeto), além de dois texturas: o mapa real do planeta (usei a textura da Terra de 2048x1024 ) e mapas de coordenadas de textura. O código para gerar a segunda textura repete perfeitamente a matemática da conversão de coordenadas cartesianas para esféricas:

int texSize = 1024; double r = texSize * 0,5; int pixels = novo int; for (int linha = 0, idx = 0; linha< texSize; row++) { double y = (r - row) / r; double sin_theta = Math.sqrt(1 - y*y); double theta = Math.acos(y); long v = Math.round(255 * theta / Math.PI); for (int col = 0; col < texSize; col++) { double x = (r - col) / r; long u = 0, a = 0; if (x >= -sin_theta && x<= sin_theta) { double z = Math.sqrt(1 - y*y - x*x); double phi = Math.atan2(z, x); u = Math.round(255 * phi / (2 * Math.PI)); a = Math.round(255 * z); } pixels = (int) ((a << 24) + (v << 8) + u); } } GLES20.glGenTextures(1, genbuf, 0); offsetTex = genbuf; if (offsetTex != 0) { GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, offsetTex); GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST); GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST); GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_NONE); GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_NONE); GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, texSize, texSize, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, IntBuffer.wrap(pixels)); }
Observe que as coordenadas X e S são transferidos do intervalo para o intervalo [-1..1], e as coordenadas de textura você e V são convertidos de radianos para o intervalo , após o que são gravados nos componentes vermelho e verde da textura de 32 bits, respectivamente. O canal alfa é usado para armazenar "profundidade" (coordenadas Z), enquanto o azul permanece sem uso por enquanto. A desativação da filtragem bilinear também não é acidental: nesta fase ela não produz nenhum efeito (os pontos vizinhos em qualquer caso têm os mesmos valores, com saltos bastante acentuados), e no que vou mostrar a seguir, será prejudicial. Mas mais sobre isso abaixo.

Ambas as texturas são alimentadas na entrada de um simples pixel shader (doravante, as imagens são clicáveis):

Private final String quadFS = "precision mediump float;\n" + "uniforme sampler2D uTexture0;\n" + "uniforme sampler2D uTexture1;\n" + "variando vec4 TexCoord0;\n" + "void main() (\n" + " vec4 vTex = textura2D(uTextura0, TexCoord0.xy);\n" + " vec3 vCol = textura2D(uTextura1, vTex.xy).rgb;\n" + " gl_FragColor = vec4(vCol, (vTex.w >
Não forneço o código de renderização da cena, porque tudo é bastante trivial nele (e, novamente, você pode ver na fonte completa), e o próprio shader é bastante primitivo. A coisa mais curiosa sobre isso, talvez, é que o canal alfa só é verificado quanto à positividade até agora, enquanto poderia ser usado para o efeito de iluminação.

Ficou muito bom, mas de alguma forma plano, além disso, gostaria de adicionar a rotação real do planeta em torno de seu eixo.

Incluímos mais um parâmetro no shader (vamos alterá-lo dependendo do tempo no intervalo), além de adicionar “profundidade” (multiplicando a cor pelo valor do canal alfa):

Private final String quadFS = "precision mediump float;\n" + "uniforme sampler2D uTexture0;\n" + "uniforme sampler2D uTexture1;\n" + "uniforme float uOffset;\n" + "variando vec4 TexCoord0;\n" + "void main() (\n" + " vec4 vTex = textura2D(uTextura0, TexCoord0.xy);\n" + " vTex.x += uOffset;\n" + " vec3 vCol = textura2D(uTextura1, vTex.xy ).rgb;\n" + " gl_FragColor = vec4(vCol * vTex.w, (vTex.w > 0.0 ? 1.0: 0.0));\n" + ")\n";
Bem, não há reclamações sobre a esfera em si, mas a imagem parece de alguma forma ... oito bits, ou algo assim. E não é à toa: registramos as coordenadas de textura em um intervalo (o máximo disponível para nós em componentes de cores comuns), o que significa que nossa textura não pode ter mais de 256 pontos de altura (e 512 de largura, considerando a rotação). Não é suficiente, você precisa de pelo menos 10 bits de precisão.

Aumentando a resolução

Eu aviso imediatamente: o código descrito aqui pode funcionar de maneira torta em qualquer dispositivo, embora eu tenha conseguido uma renderização normal em todos os dispositivos que consegui segurar em minhas mãos. De qualquer forma, o que é descrito aqui é um hack comum.

Então, usamos dois dos três componentes de cores até agora, ou seja, 16 bits de 24. Bem, vamos empacotar os dados para que cada coordenada de textura tenha um tamanho de 12 bits, o que nos permitirá trabalhar com texturas de até 4096 pixels de altura! Para fazer isso, vamos alterar literalmente três linhas no programa:

Long v = Math.round(4095 * theta / Math.PI); ...u = Math.round(4095 * phi / (2 * Math.PI)); ... pixels = (int) ((a<< 24) + (v << 12) + ((u & 15) << 8) + (u >> 4)); ...
e escreva um novo shader que leve em conta o esquema de endereçamento de 12 bits (este é o lugar onde a filtragem bilinear deve ser desabilitada!):

private final String quadFS = "precision mediump float;\n" + "uniforme sampler2D uTexture0;\n" + "uniforme sampler2D uTexture1;\n" + "uniforme float uOffset;\n" + "variando vec4 TexCoord0;\n" + "void main() (\n" + " vec4 vTex = textura2D(uTexture0, TexCoord0.xy);\n" + " vec3 vOff = vTex.xyz * 255.0 + vec3(0.5, 0.5, 0.5);\n" + " float hiY = floor(vOff.y / 16.0);\n" + " float loY = vOff.y - 16.0 * hiY;\n" + " vec2 vCoord = vec2(\n" + " (vOff.x * 16.0 + loY) / 4095.0 + uOffset,\n" + " (vOff.z * 16.0 + hiY) / 4095.0);\n" + " vec3 vCol = textura2D(uTexture1, vCoord).rgb;\n" + " gl_FragColor = vec4(vCol * vTex.w, (vTex.w > 0,0 ? 1,0: 0,0));\n" + ")\n";
Bem, este é um assunto completamente diferente! Com pequenas alterações (adicionando zoom de pinça e rotação dos dedos), mostrei esse programa para meus amigos e colegas e, ao mesmo tempo, perguntei quantos triângulos eles achavam que havia nessa cena. Os resultados variaram, e a própria pergunta despertou a suspeita da presença de uma pegadinha (neste caso, os respondentes brincaram com “um”, o que não estava longe da verdade), mas a resposta correta foi consistentemente surpreendente. E todos, como um, perguntaram: por que uma esfera pode ser girada em torno de um eixo, mas não inclinada? .. Hmm.

Inclinar

Mas o fato é que a inclinação neste esquema é muito mais difícil de implementar. Na verdade, a tarefa não é insolúvel, e eu até lidei com ela, mas não sem nuances.

Em essência, a tarefa se resume a tomar a coordenada deslocada V, enquanto a coordenada você não muda: isso ocorre porque adicionamos rotação ao redor do eixo X. O plano é o seguinte: transformamos as coordenadas de textura em coordenadas de tela (no intervalo [-1..1]), aplicamos a matriz de rotação em torno do eixo horizontal a elas (para fazer isso, escrevemos uma nova constante antecipadamente uInclinar seno e cosseno do ângulo de inclinação), e então usamos a nova coordenada S para provar em nossa textura de modelo. Coordenada "rotada" Z também será útil para nós, com sua ajuda, espelharemos a longitude para o verso da bola). Coordenada da tela Z você terá que calcular explicitamente para não fazer duas seleções de textura de uma textura, ao mesmo tempo, isso aumentará sua precisão.

private final String quadFS = "precision mediump float;\n" + "uniforme sampler2D uTexture0;\n" + "uniforme sampler2D uTexture1;\n" + "uniforme float uOffset;\n" + "uniforme vec2 uTilt;\n" + "variando vec4 TexCoord0;\n" + "void main() (\n" + " float sx = 2.0 * TexCoord0.x - 1.0;\n" + " float sy = 2.0 * TexCoord0.y - 1.0;\n" + " float z2 = 1.0 - sx * sx - sy * sy;\n" + " if (z2 > 0.0) (;\n" + " float sz = sqrt(z2);\n" + " float y = ( sy * uTilt.y - sz * uTilt.x + 1.0) * 0.5;\n" + " float z = (sy * uTilt.x + sz * uTilt.y);\n" + " vec4 vTex = texture2D(uTexture0 , vec2(TexCoord0.x, y));\n" + " vec3 vOff = vTex.xyz * 255,0 + vec3(0,5, 0,5, 0,5);\n" + " float hiY = floor(vOff.y / 16,0) ;\n" + " float loY = vOff.y - 16.0 * hiY;\n" + " vec2 vCoord = vec2(\n" + " (vOff.x * 16.0 + loY) / 4095.0,\n" + " ( vOff.z * 16,0 + hiY) / 4095,0);\n" + " if (z< 0.0) { vCoord.x = 1.0 - vCoord.x; }\n" + " vCoord.x += uOffset;\n" + " vec3 vCol = texture2D(uTexture1, vCoord).rgb;\n" + " gl_FragColor = vec4(vCol * sz, 1.0);\n" + " } else {\n" + " gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);\n" + " }\n" + "}\n";
Viva, a inclinação funcionou! Isso é apenas um barulho estranho na fronteira dos hemisférios um pouco embaraçoso. Obviamente, o problema está na precisão de endereçamento insuficiente nos pontos de limite (os pontos no próprio círculo correspondem a uma faixa muito grande de coordenadas, um texel se espalha por um intervalo de comprimento bastante perceptível). No final, consegui derrotar isso usando duas texturas geradas em vez de uma.

Como resultado, você pode ampliar e girar a bola da mesma maneira que no Google Earth. Com a diferença de que existem apenas dois triângulos.

E, finalmente, a promessa. O código fonte do projeto está disponível em