无法理解这些UV纹理坐标(范围不是0.0到1.0)

我正在试图将由Google SketchUp 8 Pro生成的简单3D对象绘制到我的WebGL应用程序上,该模型是一个简单的圆柱体。

我打开导出的文件,并将顶点位置,索引,法线和纹理坐标复制到.json文件中,以便能够在JavaScript上使用它。 似乎一切工作正常,除了有一些相当大的值,如46.331676,也是负值的纹理坐标。 现在我不知道我是否错了,但不是2D纹理坐标应该在0.0到1.0的范围内?

那么,使用这些纹理坐标绘制模型给了我一个完全奇怪的外观,而且我只能看到质地,当我非常接近(不是真正的我,凸轮)的模型,就好像纹理已疯了似的减less了它的大小,并在整个模型的表面无限重复。 (是的,我使用GL_REPEAT纹理包装的东西)

我注意到的是,如果我得到所有这些坐标并将它们除以10或100,我会得到非常“正常”的外观,但仍不在0.0到1.0的范围内。

这是我的json文件: http : //pastebin.com/Aa4wvGvv

这是我的GLSL着色器: http : //pastebin.com/DR4K37T9

这里是SketchUp导出的.X文件: http : //pastebin.com/hmYAJZWE

我也试图使用XNA绘制这个模型,但仍然无法正常工作。 使用这个HLSL着色器: http : //pastebin.com/RBgVFq08

我试图将相同的模型导出到不同的格式,collada,fbx和x。 所有这些产生同样的事情。

你是正确的紫外线通常从0-1,但大卫X提到这不是一个要求。 在你的情况下,问题是SketchUp生成的UV坐标的频率。 例如,如果你的Y轴(V坐标)从0到46,那么纹理,如果包装被启用,将沿V方向重复46次。 包装也使它看起来更小,因为你必须在同一表面区域多次复制图像。 作为FBX或Collada重新导出没有做任何事情来解决这个问题,因为它是相同的紫外线的方式。 为了解决这个问题,你需要回到SketchUp并改变如何为气缸产生紫外线。 也许你可以自己指定UV范围,或者你可以改变几何参数化的方式。 我从来没有使用SketchUp,所以我不知道它是如何处理这些事情。

最后,它看起来像圆柱体的顶点绕组可能是你的立方体的相反。 像OpenGL和DirectX的graphicsAPI使用三角形顶点绕组来确定三角形所面对的方向。 这是他们如何执行背面剔除 – 而不是渲染面向相机的三角形作为优化。 在你的圆筒的情况下,由于最接近相机的三角形面向错误的方向,所以看起来正在观察圆筒。 再次,这是一个需要在SketchUp中解决的问题,可以通过查看每个三角形的面法向(它应该指向外部,而不是内部)来validation。

(纹理坐标绝对可以在0-1之外)。我认为这只是OpenGL的奇怪。 IIRC,球体使用纹理坐标,将0-1平方放在表面的1/16上,如果柱体做类似的事情,我不会感到惊讶。 修复方面,您可能需要编写自己的柱面代码,发布适当的纹理坐标。

如果你想要你的uv坐标正好在0和1之间,你可以使用你的模型的比例matrix。

所以在加载你的模型时,你可以检查你的最大u和v坐标,并创建一个缩放matrix,使其更“正常”。 因此,这将取代你的手动缩放10或100.所以要让它适合,你将需要缩放你的uv坐标到[0,1]。

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

当然,这只是一个解决方法,你可以find一个方法来设置Sketchup在正确的设置(我认为你的出口商或SketchUp本身出错了)。 但是,如果它不适合你,创建你的后加载处理器,并保存一个纹理缩放matrix。

看起来SketchUp没有规范你的纹理坐标,或者使用它自己的度量。 将texcoords <0或> 1和GL_REPEAT作为纹理环绕意味着纹理将按比例缩小以适应几何形状并在水平和垂直方向重复。

尝试在另一个建模包(MilkShape,Blender)中导入网格并从那里修复uv映射。