COMENTÁRIOS EM MANUTENÇÃO, USE O CAMPO DO FACEBOOK.


Arquivado em: 0 GERAL - Dicas e Tutoriais • 14/04/2018 @ 15:39

É bem comum que os espelhos dos ônibus no OMSI apresentem uma distorção estranha, como se o reflexo estivesse “espremido” horizontalmente.Eu sempre soube que esticar a ilha UV do espelho de modo a cobrir toda a textura (algo que eu vejo em praticamente todos os ônibus) não é o ideal, porque fica tudo bem distorcido, mas eu achava que simplesmente usando a opção Unwrap e centralizando a ilha na textura era o certo. Calha que não é. É bem melhor que esticar a ilha pra cobrir toda a dimensão horizontal da textura, mas ainda assim fica distorcido. Bem menos, mas fica.

Fiz o seguinte: criei um objeto quadrado virado pra frente e coloquei do lado de fora do ônibus, perto da carroceria. No espelho esse objeto aparecia retangular, com a largura visivelmente menor que a altura.

Fui mexendo no mapeamento UV do espelho pra achar a forma de fazer o objeto quadrado aparecer quadrado no espelho. Constatei que se depois do unwrap a ilha fosse reduzida no eixo X a uma proporção de cerca de 1.7, o quadrado aparecia quadrado.

Evidentemente não teria por que esse número ser arbitrário. Tinha que ter um motivo pra isso. E esse número, 1.7, não é totalmente estranho pra quem lida com proporções em telas de computador com alguma frequência. Calha que a maioria dos monitores hoje em dia (inclusive os dois que eu uso) são widescreen, em uma proporção de 16:9. Isso quer dizer que dividir a largura por 16 dá o mesmo resultado que dividir a largura por 9 (e que (largura / 16) × 9 = altura). Por exemplo, um dos meus monitores é Full HD, ou seja, tem uma resolução de 1920×1080. 1920 / 16 = 120, e 120 × 9 = 1080. O outro monitor é 1600×900.

Isso significa que a proporção entre largura e altura é a mesma, independente da resolução. E num monitor que respeita a proporção 16:9, esse valor é 16 / 9.

16 / 9 = 1.77777…
1920 / 1080 = 1.77777…
1600 / 900 = 1.77777…

E se você pegar uma trena ou uma régua e medir o tamanho da tela você vai constatar que dividindo a largura física pela altura física também vai dar algo próximo desse valor.

Não tem por que isso ser coincidência. O que dá pra deduzir disso é que a textura que o OMSI renderiza pra usar como reflexion0, reflexion1, e etc, é renderizada na proporção da tela. Enquanto usamos uma reflexion0 de 256×256 (1:1), ela é gerada pelo OMSI na proporção 1.77777…:1. Na configuração padrão do OMSI para o tamanho de texturas de reflexo (512) isso seria 512 por (512 / 1.77777…), ou seja, 512×288.

Aí alguém poderia pensar que se o mapeamento UV é feito numa textura de 256×256, ele pegaria só uma pequena parte da textura real de 512×288, mas não. Os vértices UV são armazenados como um número em ponto flutuante especificando uma fração da dimensão total textura. Por exemplo, um vértice UV em 0.0,0.0 estaria no canto superior direito da textura (pixel coordinates 0,0), enquanto que um vértice UV em 1.0,1.0 estaria no canto inferior direito, independente do tamanho real da textura (se a textura for 256×256, estaria em 255,255; em uma textura 512×288 estaria em 511,287. Observação: em alguns casos (por exemplo no Blender) a referência do eixo Y do mapa UV é invertida (0,0 é o canto inferior direito). Isso não faz diferença no contexto deste post.

Note nos valores acima que se você faz uma ilha UV quadrada em uma textura quadrada, se o jogo renderizar usando uma textura retangular essa ilha não é mais quadrada, e esse é o centro do problema no que tange aos espelhos.

Tratar o mapeamento UV dessa forma tem suas vantagens. Por exemplo, se você faz o mapeamento UV de um objeto em uma textura de 1024×1024 e depois, pra economizar espaço em disco e memória de vídeo, redimensiona essa textura pra ficar em 256×128 (por exemplo se é um objeto que é sempre visto de longe e portanto a perda dos detalhes não seria tão perceptível), o mapa UV ainda vai estar correto. Se você tinha um quadrado na textura original, ao redimensionar ele passa a ser um retângulo cuja altura seria metade da largura na imagem da textura, mas, ao renderizar, o mapa UV seria espremido proporcionalmente, de forma que esse elemento que era quadrado na textura original ao renderizar continuaria aparecendo quadrado, mesmo que na textura utilizada para a renderização ele esteja retangular.

Na verdade a engine gráfica ao carregar um mapa UV nem sabe qual era o tamanho original da textura. Ela só sabe que um vértice UV em 0.5,0.5 por exemplo deve ser renderizado exatamente no meio da textura associada, independente de qual seja o tamanho dela.

Só que a textura de reflexo não é “espremida” pra ficar com 512×288; esse é o tamanho real dela. Um objeto quadrado na área de visão do espelho seria quadrado nela. Aí ao renderizar o objeto do espelho o mapa UV que originalmente era quadrado é transformado de forma a ser aplicado em uma textura retangular, e o resultado é o objeto quadrado aparecendo retangular.

Isso pode ser resolvido de duas formas: ou usando uma textura de fato retangular, aí um simples Unwrap gera a ilha no tamanho e na proporção correta, ou usando uma textura quadrada e espremendo ela no eixo X pela diferença entre as proporções da textura mapeada e a textura real gerada pelo OMSI. A razão de redimensionamento nesse caso seria o inverso do quanto ela seria espremida ao renderizar (ou seja, 1 / 1.77777…, o que dá 0.5625). Dá pra fazer isso no Blender selecionando os UVs e teclando S X e digitando 0.5625.

Eu acho mais fácil trabalhar com a textura no tamanho correto em vez de ter que fazer essa distorção pra poder mapear corretamente sobre uma textura quadrada. O processo que eu uso é o seguinte:

Primeiro eu preparo as texturas, para que tenham o tamanho correto mas sem distorcer a imagem (se eu já tiver feito isso em outro ônibus, eu só copio as texturas preparadas dele):

1. Redimensiono o reflexionX.bmp de 256×256 para 512×512 (no Fireworks seria a opção “Image size”). Isso não é estritamente necessário visto que não importa o tamanho real da textura desde que a proporção entre largura e altura esteja correta, mas ainda assim prefiro fazer dessa forma.
2. Corto o excesso do reflexionX.bmp para que fique com 512×288 (no Fireworks seria a opção “Canvas size”).

Uma vez preparadas as texturas, é hora de mapear:

1. Se o objeto já estava aberto no Blender, eu vou na aba Texture e atualizo a textura, ou simplesmente abro o arquivo novamente, para que o Blender perceba que a textura foi alterada.
2. No Blender, em modo de edição, eu seleciono todas as faces que compõem o vidro do espelho.
3. Em modo de edição de UVs, teclo U (menu UV mapping) → Unrwap.
4. No mapa UV, eu teclo A uma ou duas vezes para selecionar tudo.
5. No mapa UV, vou no menu UVs → Mirror → X axis para que a imagem não apareca lateralmente invertida no OMSI.
6a. Se for um espelho vertical (espelhos externos), coloco 256 na coordenada X da ilha UV (metade da largura da textura). Isso centraliza a textura no eixo X.
6b. Se for um espelho vertical (espelhos internos), coloco 144 na coordenada Y da ilha UV (metade da altura da textura). Isso deve mover a ilha no eixo Y para o centro da textura.

Aí é só exportar pro OMSI e ajustar a câmera no .bus.

Infelizmente, um efeito colateral disso é que o reflexo no espelho aparece mais pixelado, já que a textura gerada pelo OMSI é pequena e para o reflexo aparecer com a proporção correta uma parte significativa dela não é usada (e a opção de tamanho das texturas de reflexo nas opções não funciona). Ainda assim, eu prefiro dessa forma. Pra mim, olhar no espelho e ver tudo “esticado” prejudica a imersão no jogo.




Post feito por

Postar um comentário ou resposta

Você deve estar logado para poder comentar. Se não tiver cadastro no site, você pode comentar usando o Facebook. Caso queira se cadastrar para postar mods, skins, tutoriais... Clique aqui e siga o processo. É grátis ;)

Posts recentes