Je ne comprends pas ces coordonnées de texture UV (la plage n'est PAS de 0,0 à 1,0)

9

J'essaie de dessiner un simple objet 3D généré par Google SketchUp 8 Pro sur mon application WebGL, le modèle est un simple cylindre.

J'ai ouvert le fichier exporté et copié les positions des sommets, les indices, les normales et les coordonnées de texture dans un fichier .json afin de pouvoir l'utiliser sur javascript. Tout semble bien fonctionner, à l'exception des coordonnées de texture qui ont de très grandes valeurs, comme 46.331676 et aussi des valeurs négatives. Maintenant, je ne sais pas si je me trompe, mais les coordonnées de texture 2D ne sont-elles pas censées être comprises dans une plage de 0,0 à 1,0 uniquement?

Eh bien, dessiner le modèle en utilisant ces coordonnées de texture me donne un look totalement bizarre, et je ne peux voir la texture correctement que lorsque je suis très proche (pas vraiment moi, la came) du modèle, comme si la texture avait été incroyablement réduit en taille et répété à l'infini sur les faces du modèle. (ouais, j'utilise GL_REPEAT sur cette chose de texture wrap)

Ce que j'ai remarqué, c'est que si j'obtiens toutes ces coordonnées et que je les divise par 10 ou 100, j'obtiens un aspect beaucoup "normal", mais toujours pas dans la plage de 0,0 à 1,0.

Voici mon fichier json: http://pastebin.com/Aa4wvGvv

Voici mes shaders GLSL: http://pastebin.com/DR4K37T9

Et voici le fichier .X exporté par SketchUp: http://pastebin.com/hmYAJZWE

J'ai également essayé de dessiner ce modèle en utilisant XNA, mais ne fonctionne toujours pas. Utilisation de ces shaders HLSL: http://pastebin.com/RBgVFq08

J'ai essayé d'exporter le même modèle vers différents formats, collada, fbx et x. Tout cela donne la même chose.

Delta
la source

Réponses:

8

Vous avez raison, les UV passent généralement de 0 à 1, mais comme David X l'a mentionné, ce n'est pas une exigence. Dans votre cas, le problème est la fréquence des coordonnées UV générées par SketchUp. Par exemple, si votre axe Y (coordonnée V) passe de 0 à 46, cette texture, si l'habillage est activé, se répétera 46 fois dans la direction V. L'emballage la rend également plus petite car vous devez dupliquer l'image plusieurs fois sur la même surface. La réexportation au format FBX ou Collada ne résout en rien le problème, car il s'agit des mêmes UV que dans les deux cas. Pour résoudre ce problème, vous devez revenir à SketchUp et modifier la façon dont il génère des UV pour le cylindre. Vous pouvez peut-être spécifier vous-même la plage UV ou vous devez peut-être modifier la façon dont la géométrie est paramétrée. Je n'ai jamais utilisé SketchUp donc je ne le fais pas

Enfin, il semble que l'enroulement du sommet du cylindre puisse être l'opposé de vos cubes. Les API graphiques comme OpenGL et DirectX utilisent l'enroulement du sommet du triangle pour déterminer la direction du triangle. C'est ainsi qu'ils effectuent une élimination de face arrière - sans rendre les triangles opposés à la caméra comme une optimisation. Dans le cas de votre cylindre, il semble que la vue regarde dans le cylindre car les triangles les plus proches de la caméra sont orientés dans la mauvaise direction. Encore une fois, c'est un problème qui devrait être résolu dans SketchUp et il peut être vérifié en regardant la direction de la face normale pour chaque triangle (il doit pointer vers l'extérieur, pas vers l'intérieur).

Corillian
la source
1

(Les coordonnées de texture peuvent certainement être en dehors de 0-1.) Je pense que c'est juste OpenGL qui est bizarre. IIRC, les sphères utilisent des coordonnées de texture qui mettent le carré 0-1 sur ~ 1/16 de la surface, et je ne serais pas surpris si les cylindres font quelque chose de similaire. De manière fixe, vous devrez peut-être écrire votre propre code de cylindre, en émettant les coordonnées de texture appropriées.

David X
la source
1

Si vous souhaitez que vos coordonnées uv soient exactement comprises entre 0 et 1, vous pouvez utiliser une matrice d'échelle pour votre modèle.

Ainsi, lors du chargement de votre modèle, vous pouvez vérifier vos coordonnées max u et v et créer une matrice de mise à l'échelle qui la rendra plus "normale". Donc, cela remplacera votre mise à l'échelle manuelle de 10 ou 100. Donc, pour l'adapter, vous devrez réduire vos coordonnées uv jusqu'à [0,1].

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

Bien sûr, ce n'est qu'une solution de contournement et vous pourriez mieux trouver un moyen de définir Sketchup dans les bons paramètres (je pense que votre exportateur ou Sketchup lui-même va mal ici). Mais si cela ne fonctionne pas pour vous, créez votre processeur de post-chargement et enregistrez une matrice de mise à l'échelle de la texture.

Marnix
la source
@Marmix C'est une solution très simple, efficace et élégante !!!
3d-indiana-jones
0

Il semble que SketchUp ne normalise pas vos coordonnées de texture ou n'utilise pas sa propre métrique. Avoir texcoords <0 ou> 1 et GL_REPEAT comme habillage de texture signifie que la texture sera réduite pour s'adapter à la géométrie et répétée horizontalement et verticalement.

Essayez d'importer le maillage dans un autre package de modélisation (MilkShape, Blender) et de corriger la carte uv à partir de là.

r2d2rigo
la source
4
Avoir texcoords <0 ou> 1 et GL_REPEAT comme habillage de texture signifie que la texture sera [ supprimée déclaration erronée ] répétée horizontalement et verticalement.
Kromster