Este é o terceiro artigo de nossa série sobre o trabalho com modelos 3D no Unity. Artigos anteriores: “Recursos para trabalhar com o Mesh in Unity” e “Unity: edição procedural do Mesh” .No mundo da computação gráfica, existem muitos formatos para a apresentação de modelos 3D. Alguns deles estão posicionados como universais, outros como otimizados para tarefas ou plataformas específicas. Em qualquer campo, eles sonham em trabalhar com um formato universal, mas a realidade nos diz que não. Além disso, devido a esse zoológico, cria-se um círculo vicioso: os desenvolvedores de ferramentas “universais” criam seus próprios formatos internos para generalizar os anteriores, aumentando a população e criando meios para a conversão de formatos. Portanto, há um problema de perda ou distorção de dados durante a conversão. O problema é tão antigo quanto o mundo (mundo da TI, é claro) e não ignorou a importação de modelos para o
Unity .
Neste artigo, falaremos sobre algumas das dificuldades com as quais temos de lidar ao trabalhar com modelos no
Unity (especialmente o funcionamento do
ModelImporter , a diferença nas representações de objetos 3D etc.), bem como quais ferramentas criamos para superar essas dificuldades.

Recursos do ModelImporter
Lembre-se de que, para
a API da placa de vídeo,
a primitiva mínima e apenas tridimensional é um triângulo, enquanto a geometria no
FBX , por exemplo, pode ser representada como quadrângulos. Pacotes 3D modernos para a criação de modelos, via de regra, permitem diferentes níveis de abstração, mas mesmo aí a renderização do resultado ocorre através de triângulos.
Ao mesmo tempo, muitas ferramentas são voltadas para o trabalho com quadrângulos, o que incentiva os artistas 3D a usar esse primitivo como principal. Nesses casos, o TK geralmente requer a triangulação do modelo antes da implementação. Se a triangulação não for feita, o módulo
Unity correspondente no modo padrão a executa automaticamente quando um arquivo é adicionado. Por esse motivo, os erros aparecem, pois os algoritmos de triangulação são implementados de maneira diferente em pacotes diferentes. Ao escolher uma diagonal para dividir um quadrângulo, surge a ambiguidade, daí a maioria dos problemas que podem ser divididos em dois grupos.
O primeiro está relacionado à correção da exibição do formulário do modelo. Portanto, a forma de um quadrilátero não plano depende diretamente da escolha da diagonal.
Susanna triangulada no Blender (método Quad: Beauty) e Unity (automaticamente na importação)Além disso, o algoritmo normal de cozimento de mapas usa dados de partição, devido aos quais a diferença na triangulação pode dar origem a artefatos na forma de uma cruz em um clarão.
Scooter de homem saudável e scooter de fumanteOs problemas do segundo grupo são encontrados na varredura de textura. Por exemplo, temos um quadrilátero com um ângulo suficientemente obtuso para que ocorra um erro. Quando visualizado em um pacote 3D, ele é dividido por uma das diagonais em dois triângulos completamente dobráveis.
Polígono de origem
Polígono triangulado no BlenderNo entanto, após a importação para o projeto, é descoberto que esse quadrilátero é quebrado por outra diagonal e que um dos triângulos é geralmente degenerado ou próximo a ele.
Um polígono no Unity com um triângulo próximo a um degenerado (o triângulo retângulo é quase indistinguível de um segmento)
A razão dos problemas associados à degenerescência dos polígonos são os erros nos cálculos de ponto flutuante, bem como as peculiaridades da interpolação de pixels durante a renderização. O que diabos acontece com esses triângulos: eles se contraem, cada quadro muda de cor. A dimensão transversal extremamente pequena cria dificuldades no processamento da luz, e é por isso que partes de objetos dinâmicos podem tremer. E no não-determinismo de assar o
mapa de iluminação, também não há nada de bom.
Eu sou um pacote 3D, a meu ver

Na modelagem 3D, geralmente há uma diferença entre o número real de vértices e seu número em um pacote 3D. A essência do problema está nas informações necessárias para o processamento pela placa de vídeo. A estrutura de dados para o vértice é predefinida e inclui as coordenadas de varredura de posição, normal, tangente e de textura para cada canal e cor. Ou seja, duas normais não podem ser empurradas para um vértice.
Para alguns artistas, nem sempre é óbvio que o pico é determinado não apenas por sua posição. Os modeladores conhecem bem os conceitos de
arestas duras / moles e
costuras UV , mas nem todo mundo entende como elas são implementadas programaticamente. Além disso, os pacotes 3D são confusos, que no modo padrão mostram o número de vértices como o número de posições únicas.
Portanto, a primitiva
cubo usual é geometricamente representada por 8 vértices. No entanto, para transmitir corretamente o reflexo da luz de cada face e aplicar corretamente a textura, em cada canto do cubo, são 3 vértices na mesma posição, mas são necessárias coordenadas normais e de textura diferentes, pois três bordas convergem em cada canto. Um pequeno
bloco de documentação foi dedicado a esse momento. Lá você pode ver exemplos.
Métricas do cubo do Blender
Métricas do cubo da unidadePare com isso!
Diante desses e de problemas semelhantes, decidimos criar uma ferramenta de análise e validação de modelo ao importar para um projeto do
Unity . Em outras palavras, um validador personalizado, que, a pedido "Eat!" resposta: “Não vou! Refazer ”, - ou cuspir conjuntos de avisos e valores de vários parâmetros, notificando que algo não é bom para ele.
Para análise e verificação, desenvolvemos a seguinte funcionalidade:
- contando o número de posições únicas de vértices, vértices coloridos, arestas duras , costuras UV ;
- Cálculo da caixa delimitadora alinhada ao eixo (AABB) e seu centro;
- determinação da saída das coordenadas da varredura UV além da faixa de 0,0-1,0;
- definição de sobreposição de textura;
- verificar a varredura de textura quanto à adequação do recuo de pixel especificado para uma determinada resolução de textura.
O que isso nos dá?
Contar o número de posições únicas de vértices, arestas duras, costuras UV e
vértices coloridos é necessário para verificar se o modelo do artista foi importado para o
Unity . Essa funcionalidade também permite monitorar a conformidade com os requisitos para otimizar o modelo (por exemplo, para que o número de vértices não exceda um determinado valor). Devido à mesma peculiaridade dos pacotes 3D, que mostram o número de posições únicas, há casos em que a métrica do número de vértices no editor de modelos satisfaz essa restrição, mas depois de adicionar o arquivo ao projeto, pode acontecer que isso não ocorra.
Cálculo da AABB e seu centro - permite determinar o deslocamento do modelo em relação ao início de seu próprio sistema de coordenadas. Isso é necessário para o posicionamento previsível de ativos que são inicializados na cena enquanto o aplicativo está em execução. Portanto, a
AABB do edifício em boa forma deve ter minY = 0 e algum lustre que esteja preso ao teto - maxY = 0.


Saia das coordenadas dos vértices da varredura UV no intervalo de 0,0 a 1,0 - na maioria dos casos (por exemplo, se a textura deve ser lado a lado no modelo) é fornecida. Freqüentemente, essa abordagem é usada para representar na cena uma infinidade de objetos pequenos com baixo detalhamento (vegetação) e / ou localizados à distância, além de agrupar grandes objetos homogêneos (edifícios). No caso de lado a lado, os valores das coordenadas de um canal
UV específico são simplesmente cortados a parte inteira no nível do sombreador, se o
Modo de quebra da textura estiver definido como
Repetir .
Imagine agora que você colocou a textura em um cetim (e coberto com um cobertor: 3). As coordenadas já convertidas correspondentes ao atlas (escala x * + deslocamento) chegarão ao shader. Desta vez, provavelmente, não haverá parte inteira e não haverá nada para cortar, e o modelo subirá na textura de outra pessoa (o cobertor acabou por ser pequeno). Esse problema é resolvido de duas maneiras.
O primeiro assume que você cortou a parte inteira nas coordenadas de varredura antecipadamente. Nesse caso, há uma chance de sobreposição de polígonos, que discutiremos abaixo.
O segundo é baseado no fato de que a telha de textura é inerentemente um método de otimização. Ninguém o proíbe de aumentar o tamanho e provar a peça desejada para todo o modelo. No entanto, dessa maneira, o espaço utilizável do atlas será usado ineficientemente.
As sobreposições em uma varredura de textura também geralmente não são aleatórias: são necessárias para usar efetivamente as áreas de textura. Acontece que um novato comete um erro, um camarada mais velho vê, pronuncia uma palavra forte e um novato não faz mais isso. Mas acontece que a sobreposição é tão pequena e localizada em um local tão inesperado que o camarada mais velho pode não perceber.
Na equipe experimental, os erros que não foram detectados na varredura de base entram no projeto um pouco mais frequentemente do que nunca. Outra coisa é quando as condições de uso do conteúdo pronto mudam.
Um exemplo Trabalhamos com um conjunto de modelos para objetos dinâmicos no jogo. Como não havia problema em fornecer luz para eles, as sobreposições foram permitidas na varredura
UV .
Um exemplo de uma varredura UV básica com sobreposições (mostrada em vermelho)No entanto, decidimos não usar esses modelos como modelos dinâmicos, mas colocá-los como uma decoração estática em um nível. Para otimização, como você sabe, a iluminação de objetos estáticos em uma cena é montada em um atlas especial. Esses modelos não tinham um canal
UV2 separado para o
mapa de iluminação e a qualidade do gerador automático no
Unity não nos convinha, por isso decidimos usar a varredura básica de textura para assar o mais rápido possível.
Aqui, havia problemas óbvios com a correção da iluminação. Obviamente, os raios que entram na estátua no olho não devem criar brilho
no quinto ponto na parte de trás da cabeça.
Iluminação incorreta do modelo (esquerda) e corrigida (direita)Ao criar
um mapa de iluminação, o Unity tenta usar o canal
UV2 principalmente . Se estiver vazio,
será utilizado o
UV principal, se este estiver vazio, com licença, mas isso é uma exceção. Existem duas maneiras de criar modelos em
um mapa de luz sem
UV2 previamente preparado no
Unity .
Como o primeiro, o
Unity oferece geração automática de
UV2 com base na geometria do modelo. Isso é mais rápido do que fazer manualmente, além disso, esta ferramenta pode ser configurada usando vários parâmetros. Mas, mesmo assim, a sobreposição resultante de claro-escuro é muitas vezes insatisfatória para objetos altamente detalhados devido a costuras e vazamentos nos lugares errados, e o empacotamento de partes dessa varredura não é o mais eficaz.

A segunda maneira é usar uma varredura
UV básica para assar. Uma opção muito atraente, porque ao trabalhar com uma varredura de textura, há menos chances de cometer um erro do que ao trabalhar com duas. Por esse motivo, tentamos minimizar o número de modelos que possuem sobreposições na base
UV . As ferramentas criadas nos ajudam a fazer isso.
Verificar a varredura de textura quanto à adequação da indentação de pixels especificada em uma determinada resolução de textura é uma validação
UV mais precisa, com base na rasterização. Mais sobre esse método será descrito no próximo artigo da série.
Para resumir. Obviamente, é quase impossível rastrear todas as nuances: às vezes é preciso aturar a imperfeição do resultado para concluir a tarefa a tempo. No entanto, a identificação de até mesmo uma parte dessas deficiências permite acelerar o desenvolvimento do projeto e melhorar sua qualidade.