No puedo entender estas coordenadas de textura UV (el rango NO es 0.0 a 1.0)

9

Estoy tratando de dibujar un objeto 3D simple generado por Google SketchUp 8 Pro en mi aplicación WebGL, el modelo es un cilindro simple.

Abrí el archivo exportado y copié las posiciones de vértices, índices, normales y coordenadas de textura en un archivo .json para poder usarlo en javascript. Todo parece funcionar bien, excepto las coordenadas de textura que tienen valores bastante grandes, como 46.331676 y también valores negativos. Ahora no sé si estoy equivocado, pero ¿no se supone que las coordenadas de textura 2D solo están en un rango de 0.0 a 1.0?

Bueno, dibujar el modelo usando estas coordenadas de textura me da un aspecto totalmente extraño, y solo puedo ver la textura correctamente cuando estoy muy cerca (no realmente yo, la cámara) del modelo, como si la textura hubiera sido una locura reducido en su tamaño y repetido infinitamente a través de las caras del modelo. (sí, estoy usando GL_REPEAT en esa envoltura de textura)

Lo que noté es que si obtengo todas estas coordenadas y las divido entre 10 o 100 obtengo un aspecto mucho "normal", pero aún no en el rango de 0.0 a 1.0.

Aquí está mi archivo json: http://pastebin.com/Aa4wvGvv

Aquí están mis sombreadores GLSL: http://pastebin.com/DR4K37T9

Y aquí está el archivo .X exportado por SketchUp: http://pastebin.com/hmYAJZWE

También intenté dibujar este modelo usando XNA, pero aún no funciona. Usando estos sombreadores HLSL: http://pastebin.com/RBgVFq08

Intenté exportar el mismo modelo a diferentes formatos, collada, fbx y x. Todos esos rinden lo mismo.

Delta
fuente

Respuestas:

8

Estás en lo correcto, los rayos UV generalmente van de 0 a 1, aunque como David X mencionó, esto no es un requisito. En su caso, el problema es la frecuencia de las coordenadas UV generadas por SketchUp. Por ejemplo, si su eje Y (coordenada V) va de 0 a 46, entonces esa textura, si la envoltura está habilitada, se repetirá 46 veces en la dirección V. El ajuste también hace que parezca más pequeño porque debe duplicar la imagen muchas veces en la misma área de superficie. La reexportación como FBX o Collada no hace nada para resolver el problema porque es la misma UV de cualquier manera. Para solucionar esto, debe volver a SketchUp y cambiar la forma en que genera UV para el cilindro. Quizás pueda especificar el rango UV usted mismo o tal vez deba cambiar la forma en que se parametriza la geometría. Nunca he usado SketchUp, así que no

Por último, parece que el devanado de vértice del cilindro puede ser el opuesto de sus cubos. Las API de gráficos como OpenGL y DirectX usan el devanado de vértices triangulares para determinar en qué dirección se enfrenta el triángulo. Así es como se realiza el sacrificio de la cara posterior, sin representar los triángulos que se alejan de la cámara como una optimización. En el caso de su cilindro, parece que la vista está mirando hacia el cilindro porque los triángulos más cercanos a la cámara están orientados en la dirección incorrecta. Una vez más, este es un problema que debería resolverse en SketchUp y puede verificarse mirando la dirección de la cara normal para cada triángulo (debe estar apuntando hacia afuera, no hacia adentro).

Corillian
fuente
1

(Las coordenadas de textura definitivamente pueden estar fuera de 0-1.) Creo que esto es simplemente OpenGL siendo extraño. IIRC, las esferas usan coordenadas de textura que ponen el cuadrado 0-1 en ~ 1/16 de la superficie, y no me sorprendería si los cilindros hacen algo similar. En cuanto a la solución, es posible que deba escribir su propio código de cilindro, emitiendo las coordenadas de textura apropiadas.

David X
fuente
1

Si desea que sus coordenadas uv estén exactamente entre 0 y 1, puede usar una matriz de escala para su modelo.

Entonces, al cargar su modelo, puede verificar su coordenada máxima de u y v y crear una matriz de escala que lo haga más "normal". Entonces eso reemplazará su escala manual de 10 o 100. Por lo tanto, para que encaje, necesitará escalar sus coordenadas uv a [0,1].

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

Por supuesto, esto es solo una solución alternativa y podría encontrar una mejor manera de configurar Sketchup en la configuración correcta (creo que su exportador o Sketchup en sí mismo sale mal aquí). Pero si no funciona para usted, cree su procesador de carga posterior y guarde una matriz de escala de textura.

Marnix
fuente
@Marmix ¡Esta es una solución muy simple, efectiva y elegante!
3d-indiana-jones
0

Parece que SketchUp no está normalizando sus coordenadas de textura, o usando una métrica propia. Tener texcoords <0 o> 1 y GL_REPEAT como ajuste de textura significa que la textura se reducirá para ajustarse a la geometría y se repetirá horizontal y verticalmente.

Intente importar la malla en otro paquete de modelado (MilkShape, Blender) y arregle el mapa uv desde allí.

r2d2rigo
fuente
44
Tener texcoords <0 o> 1 y GL_REPEAT como ajuste de textura significa que la textura se [ eliminará la declaración errónea ] repetida horizontal y verticalmente.
Kromster