Não consigo entender essas coordenadas de textura UV (o intervalo NÃO é de 0,0 a 1,0)


9

Estou tentando desenhar um objeto 3D simples gerado pelo Google SketchUp 8 Pro no meu aplicativo WebGL, o modelo é um cilindro simples.

Abri o arquivo exportado e copiei as posições dos vértices, índices, normais e coordenadas de textura em um arquivo .json para poder usá-lo em javascript. Tudo parece funcionar bem, exceto pelas coordenadas de textura que possuem alguns valores bastante grandes, como 46.331676 e também valores negativos. Agora não sei se estou errado, mas as coordenadas de textura 2D não deveriam estar apenas entre 0,0 e 1,0?

Bem, desenhar o modelo usando essas coordenadas de textura me dá uma aparência totalmente estranha, e eu só consigo ver a textura adequadamente quando estou muito perto (não realmente de mim, a câmera) do modelo, como se a textura tivesse sido insanamente reduzido em tamanho e repetido infinitamente nas faces do modelo. (sim, estou usando GL_REPEAT nessa coisa de quebra de textura)

O que notei é que, se eu obtiver todas essas coordenadas e dividi-las por 10 ou 100, obterá uma aparência muito "normal", mas ainda não no intervalo de 0,0 a 1,0.

Aqui está o meu arquivo json: http://pastebin.com/Aa4wvGvv

Aqui estão meus shaders GLSL: http://pastebin.com/DR4K37T9

E aqui está o arquivo .X exportado pelo SketchUp: http://pastebin.com/hmYAJZWE

Eu também tentei desenhar esse modelo usando XNA, mas ainda não está funcionando. Usando este sombreadores HLSL: http://pastebin.com/RBgVFq08

Tentei exportar o mesmo modelo para diferentes formatos, collada, fbx e x. Tudo isso produz a mesma coisa.

Respostas:


8

Você está certo de que os UV normalmente variam de 0 a 1, porém, como David X mencionou, isso não é um requisito. No seu caso, o problema é a frequência das coordenadas UV geradas pelo SketchUp. Por exemplo, se o seu eixo Y (coordenada V) for de 0 a 46, essa textura, se o empacotamento estiver ativado, repetirá 46 vezes na direção V. O agrupamento também faz com que pareça menor porque você deve duplicar a imagem várias vezes na mesma área de superfície. A reexportação como FBX ou Collada não faz nada para resolver o problema, pois é o mesmo UV de qualquer maneira. Para corrigir isso, você precisa voltar ao SketchUp e alterar a maneira como ele gera UVs para o cilindro. Talvez você possa especificar a faixa UV ou talvez precise alterar a parametrização da geometria. Eu nunca usei o SketchUp, então não

Por fim, parece que o enrolamento de vértices do cilindro pode ser o oposto de seus cubos. As APIs gráficas, como o OpenGL e o DirectX, usam o enrolamento de vértices em triângulo para determinar em qual direção o triângulo está voltado. É assim que eles executam a seleção da face posterior - não tornando os triângulos voltados para longe da câmera como uma otimização. No caso do seu cilindro, parece que a visualização está olhando para o cilindro, porque os triângulos mais próximos da câmera estão na direção errada. Mais uma vez, esse é um problema que precisaria ser resolvido no SketchUp e pode ser verificado observando a direção da face normal para cada triângulo (deve estar apontando para fora, não para dentro).


1

(As coordenadas de textura podem definitivamente estar fora de 0-1.) Eu acho que isso é apenas o OpenGL sendo estranho. IIRC, as Esferas usam coordenadas de textura que colocam o quadrado 0-1 em ~ 1/16 da superfície, e eu não ficaria surpreso se os Cilindros fizessem algo semelhante. Em termos de correção, pode ser necessário escrever seu próprio código de cilindro, emitindo as coordenadas de textura apropriadas.


1

Se você deseja que suas coordenadas uv estejam exatamente entre 0 e 1, você pode usar uma matriz de escala para o seu modelo.

Portanto, ao carregar seu modelo, você pode verificar suas coordenadas max u e v e criar uma matriz de escala que a tornará mais "normal". Portanto, isso substituirá o dimensionamento manual de 10 ou 100. Portanto, para permitir o ajuste, você precisará dimensionar suas coordenadas uv para [0,1].

|1/uMax|0     |
|0     |1/vMax|

É claro que isso é apenas uma solução alternativa e você pode encontrar uma maneira de definir o Sketchup nas configurações corretas (acho que seu exportador ou o Sketchup em si está errado aqui). Mas se não der certo para você, crie seu processador de pós-carregamento e salve uma matriz de escala de textura.


@Marmix Esta é uma solução muito simples, eficaz e elegante !!!
3d-indiana-jones

0

Parece que o SketchUp não está normalizando suas coordenadas de textura ou usando uma métrica própria. Ter cabos de texto <0 ou> 1 e GL_REPEAT como quebra de textura significa que a textura será reduzida para se ajustar à geometria e repetida horizontal e verticalmente.

Tente importar a malha em outro pacote de modelagem (MilkShape, Blender) e conserte o mapa uv a partir daí.


4
Ter texcoords <0 ou> 1 e GL_REPEAT como quebra de textura significa que a textura será [ removida declaração errônea ] repetida horizontal e verticalmente.
Kromster
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.